Indy接收邮件中文无编码乱码问题
2010-04-09 15:36
447 查看
Indy的bug真让人受不了,遇到一个没有经过编码的中文邮件,比如:
Return-Path: <sdhuahan@public.qd.sd.cn>
Delivered-To: sdhuahan@public.qd.sd.cn
Received: from unknown (helo xxh)(unknown@221.0.203.213)
by ws02 with SMTP; Thu, 08 Apr 2010 06:36:15 +0000
X-Lasthop: 221.0.203.213
Date: Thu, 8 Apr 2010 14:36:25 +0800
From: "sdhuahan" <sdhuahan@public.qd.sd.cn>
To: "sdhuahan" <sdhuahan@public.qd.sd.cn>
Subject: 你好
Message-ID: <201004081436258007065@public.qd.sd.cn>
X-mailer: Foxmail 6, 15, 201, 22 [cn]
在测试您的 SMTP 设置时, Foxmail 会自动发送该电子邮件。
这个邮件在Indy接收时主题和正文都会乱码,只得再次追踪,发现问题在IdGlobal中,第5190行开始:
代码
1 function BytesToString(const AValue: TIdBytes; const AStartIndex: Integer;
2 const ALength: Integer = -1; AEncoding: TIdTextEncoding = nil): string; overload;
3 var
4 LLength: Integer;
5 {$IFNDEF DOTNET_OR_UNICODESTRING}
6 LBytes: TIdBytes;
7 {$ENDIF}
8 begin
9 {$IFNDEF DOTNET_OR_UNICODESTRING}
10 LBytes := nil; // keep the compiler happy
11 {$ENDIF}
12 LLength := IndyLength(AValue, ALength, AStartIndex);
13 if LLength > 0 then begin
14
15 //add by garfield,2010.04.09
16 //begin*************
17 AEncoding:=nil;
18 TEncoding.GetBufferEncoding(AValue,AEncoding);
19 //end*************
20 EnsureEncoding(AEncoding);
21 {$IFDEF DOTNET_OR_UNICODESTRING}
22 Result := AEncoding.GetString(AValue, AStartIndex, LLength);
23 {$ELSE}
24 LBytes := TIdTextEncoding.Convert(
25 AEncoding,
26 Indy8BitEncoding,
27 AValue, AStartIndex, LLength);
28 SetString(Result, PAnsiChar(LBytes), Length(LBytes));
29 {$ENDIF}
30 end else begin
31 Result := '';
32 end;
33 end;
34
不知道AEncoding变量为什么有问题,我采用了上面简单的办法,可以正确解码了,不知道大侠有没有更彻底的解决办法。
Return-Path: <sdhuahan@public.qd.sd.cn>
Delivered-To: sdhuahan@public.qd.sd.cn
Received: from unknown (helo xxh)(unknown@221.0.203.213)
by ws02 with SMTP; Thu, 08 Apr 2010 06:36:15 +0000
X-Lasthop: 221.0.203.213
Date: Thu, 8 Apr 2010 14:36:25 +0800
From: "sdhuahan" <sdhuahan@public.qd.sd.cn>
To: "sdhuahan" <sdhuahan@public.qd.sd.cn>
Subject: 你好
Message-ID: <201004081436258007065@public.qd.sd.cn>
X-mailer: Foxmail 6, 15, 201, 22 [cn]
在测试您的 SMTP 设置时, Foxmail 会自动发送该电子邮件。
这个邮件在Indy接收时主题和正文都会乱码,只得再次追踪,发现问题在IdGlobal中,第5190行开始:
代码
1 function BytesToString(const AValue: TIdBytes; const AStartIndex: Integer;
2 const ALength: Integer = -1; AEncoding: TIdTextEncoding = nil): string; overload;
3 var
4 LLength: Integer;
5 {$IFNDEF DOTNET_OR_UNICODESTRING}
6 LBytes: TIdBytes;
7 {$ENDIF}
8 begin
9 {$IFNDEF DOTNET_OR_UNICODESTRING}
10 LBytes := nil; // keep the compiler happy
11 {$ENDIF}
12 LLength := IndyLength(AValue, ALength, AStartIndex);
13 if LLength > 0 then begin
14
15 //add by garfield,2010.04.09
16 //begin*************
17 AEncoding:=nil;
18 TEncoding.GetBufferEncoding(AValue,AEncoding);
19 //end*************
20 EnsureEncoding(AEncoding);
21 {$IFDEF DOTNET_OR_UNICODESTRING}
22 Result := AEncoding.GetString(AValue, AStartIndex, LLength);
23 {$ELSE}
24 LBytes := TIdTextEncoding.Convert(
25 AEncoding,
26 Indy8BitEncoding,
27 AValue, AStartIndex, LLength);
28 SetString(Result, PAnsiChar(LBytes), Length(LBytes));
29 {$ENDIF}
30 end else begin
31 Result := '';
32 end;
33 end;
34
不知道AEncoding变量为什么有问题,我采用了上面简单的办法,可以正确解码了,不知道大侠有没有更彻底的解决办法。
相关文章推荐
- D2009下Indy发送邮件中文乱码问题
- 用Phpmailer发送邮件发现中文竟然是乱码,原来是编码问题
- PHP 发送UTF-8编码中文邮件标题乱码问题解决
- tomcat 设置UTF编码 解决中文接收乱码问题
- openerp 7.0邮件接收中文附件乱码问题解决办法
- indy httpserver 接收URL包含中文参数乱码的问题
- C# Asp.net 前台使用utf-8编码传递中文参数 后台接收乱码的问题
- 解决Django发送中文邮件时的编码及乱码问题
- 已解决了ajax(源文件编码gb2312)发送+php接收(源文件编码gb2312)中文乱码问题(utf-8也通用)
- struts2.2.3 配置中文乱码拦截过滤器 解决接收中文参数乱码问题
- jsp,java中文乱码问题另类解决方案,jni加密、解密编码
- sendmail发送邮件中文乱码问题
- java scanner 接收键盘输入 中文乱码问题
- dojo+JBoss7设置URI编码为UTF-8,解决传参中文乱码问题
- JAVA ,SSH中文及其乱码问题的解决 6大配置点 使用UTF-8编码
- 解决php接收shell返回的结果中文乱码问题
- 安卓使用Socket发送中文,C语言服务端接收乱码问题解决方案
- 解决全局utf-8编码下asp.net接收gb2312乱码的问题
- Java jsp/servlet GET/POST 字符集编码问题(中文乱码)
- 更改邮件发送语言为英语,解决编码为UTF8邮箱注册账号,邮件内容乱码问题