为什么nmpop3outlook收到邮件乱码的主题是乱码

Linux安全网 --- 专注Linux操作系统安全运维。
Indy总有大大小小的Bug,但是有时候你又离不开它,真是进退两难的感觉。最新的Indy10同样有不少的BUG,最近在做邮件接收的一个模块,碰到了令人头痛的乱码问题,一阵研究之后,得出如下心得:
在接收邮件的时候,一般是这样的代码:
for i := 1 to MailCount do begin IdMessage1.C FContent := ''; IdMessage1.ContentType := 'Multipart/*'; IdMessage1.CharSet := 'GB2312'; FPOP3.Reieve(i, IdMessage1);
FFrom := (IdMessage1.From.Tt); FSubject := IdMessage1.S FFrom := CheckTxt(FFrom); FSubject := CheckTxt(FSubject); Fcontent := IdMessage1.Body.T&
for j := 0 to pr(IdMessage1.MessageParts.Count) do begin if IdMessage1.MessageParts.Items[j] is TIdText then begin //正文 FContent := FContent + TIdText(IdMessage1.MessageParts.Items[j]).Body.T
Fcontent := IdMessage1.Body.T&这一句保证邮件是SinglePart的时候同样显示内容,但是可能存在乱码,解决方法在下面。
首先解决邮件是MultiPart的时候,邮件体乱码的解决方法(方法来源于网上,参见:http://blog.csdn.net/kevinsh/article/detai/6163029)
在IdMessageClient单元的ProcessTextPart函数中增加这一段(try和RemoveLastBlankLine(LTxt.Body)之间)
try //ReadStringsAsContentType(LMStream, LTxt.Body, LHdrs.Values[SContentType], QuoteMIME); {$IFDEF STRING_IS_ANSI}
:= GetOEMCP; LDestEoding := TIdTextEncoding.GetEncoding(cp); ReadStringsAsContentType(LMStream, LTxt.Body, LHdrs.Values[SContentType], QuoteMIME, LDestEncoding); {$ELSE} ReadStringsAsContentType(LMStream, LTxt.Body, LHdrs.Values[SContentType], QuoteMIME); {$ENDIF} RemoveLastBlankLine(LTxt.Body);
改完后,发现GB2312编码的邮件标题和邮件体都存在乱码现象,解决方法如下:
IdGlobalProtos.pas单元ReadStringsAsChar改成下面:
procere ReadStringsAsCharset(AStream: TS AStrings: TS const ACharset: String {$IFDEF STRING_IS_ANSI}; ADestEncoding: TIdTextEncoding = nil{$ENDIF});var LEncoding: TIdTextE cp:Wbegin //LEncoding := CharsetToEncoding(ACharset);
{$IFDEF DOTNET_OR_ICONV} LEncoding := TIdTextEncoding.GetEncoding(ACharSet); {$ELSE} CP := CharsetToCodePage(ACharSet); Assert(CP && 0); LEncoding := TIdTextEncoding.GetEncoding(CP); {$ENDIF}
{$IFNDEF DOTNET} try {$ENDIF} {$IFDEF HAS_TEncoding} AStrings.LoadFromStream(AStream, LEncoding); {$ELSE} //AStrings.Text := ReadStringFromStream(AStream, -1, LEncoding{$IFDEF STRING_IS_ANSI}, ADestEncoding{$ENDIF}); AStrings.Text := ReadStringFromStream(AStream, -1, ADestEncoding); {$ENDIF} {$IFNDEF DOTNET} finally LEncoding.F {$ENDIF}
IdHeaderCoderPlain.pas单元的类方法TIdHeaderCoderPlain.Decode改成这样:
class function TIdHeaderCoderPlain.Decode(const ACharSet: const AData: TIdBytes): Svar LEncoding: TIdTextE LBytes: TIdB {$IFNDEF DOTNET_OR_ICONV} CP: W {$ENDIF}begin {if ACharSet && 'GB2312' then Relt := BytesToString(AData, Indy8BitEncoding); else } begin Result := ''; LBytes := try {$IFDEF DOTNET_OR_ICONV} LEncoding := TIdTextEncoding.GetEncoding(ACharSet); {$ELSE} CP := CharsetToCodePage(ACharSet); Assert(CP && 0); LEncoding := TIdTextEncoding.GetEncoding(CP); {$ENDIF} {$IFNDEF DOTNET} try {$ENDIF} LBytes := AD if LEncoding && TIdTextEncoding.Unicode then begin LBytes := TIdTextEncoding.Convert(LEncoding, TIdTextEncoding.Unicode, LBytes); Result := TIdTextEncoding.Unicode.GetString(LBytes, 0, Length(LBytes)); {$IFNDEF DOTNET} finally LEncoding.F {$ENDIF} except
重新编译Indy(废话),OK,这样应该能解决绝大多数的邮件乱码问题了。如果您发现了还有什么更好的方法,希望一起交流
最新图文资讯
相关文章列表:
理智评论文明上网,拒绝恶意谩骂
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明jmail组件pop3接收邮件题目出现乱码_百度知道Memo1-&Lines-&Assign(NMPOP31-&MailMessage-&Body);为什么显示的都是乱七八糟的字母?显示不出内容?
[问题点数:0分]
Memo1-&Lines-&Assign(NMPOP31-&MailMessage-&Body);为什么显示的都是乱七八糟的字母?显示不出内容?
[问题点数:0分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。python 收取邮件都是乱码。_百度知道vb jmail+ pop3接收邮件附件出现乱码,高手进。_百度知道

参考资料

 

随机推荐