我用IDPop3收邮件,但为什么Subject显示的是乱码(100分)

  • 主题发起人 主题发起人 szkxy
  • 开始时间 开始时间
S

szkxy

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的控件是IDPop3,但收下来的邮件主题,如果是中文的,就会显示乱码,不过有的E-mail
不会,如果转换成正常显示呢?
另外为什么我用IPSMTP发出去的E-mail会没有Message-ID呢?
 
邮件编码问题,
0 7BIT
1 8BIT
2 BINARY
3 BASE64
4 QUOTED-PRINTABLE
5 OTHER


 
那我应该如何解决呢?
 
这是Indy的问题,你用Delphi自带的Demo也是这样,它没有考虑好多语言字符集的问题。
当邮件主题中有指定字符集的信息且不是以“ISO”打头的话就会出现这个问题。
(而中文主题有很多是以“=?gb2312”打头的,有些则不是,就不会出现乱码)
最简单的解决办法是把IdHeaderCoder.pas的140行从
if Pos('=?ISO', UpperCase(Header)) > 0 then
改成
if Pos('=?', UpperCase(Header)) > 0 then //去掉对“ISO”的判断
这样可以一劳永逸,并且我试过没什么副作用(至少我没发现:)

Message-ID一般是邮件服务器加上的(你随便找一封用免费邮箱发的信看一下详细信息就明白了),
不知道你的为什么没有,是不是自己写的邮件服务器?
如果要的话就得自己在IdMessage.ExtraHeaders里加了,只是取值麻烦一些(要保证唯一性),
不过最好还是在邮件服务器那边加。
 
5rain6sky,你用Indy的IDSMTP发过mail吗?特别是对需要身份验证的Mail Server.另外为何
我用OutLook发的mail有Message-id,Mail Server是一样的.为什么我用IDSMTP却没呢?我的
邮件收发程序一直有问题,希望你能帮我全部搞掂!谢了!
 
是不是改了IdHeaderCoder.pas之后再编译一次就生效了,我刚刚改了C:/Program Files/Borland/Delphi6/
Source/IdHeaderCoder.pas,但结果还是一样.
 
呵呵,你非要Message-ID干吗?你要对它做什么后续处理或是对邮件进行区分吗?
如果没用,那就完全是邮件服务器的事儿,你用smtp客户端发信是不用考虑的。

身份验证的问题很简单,把smtp控件的AuthenticationType属性设为atLogin,
然后填好它的UserID和Password,剩下的就一样了。
你可以参考一下Delphi自带的例子——($Delphi)/Demo/Indy/MailClient/MailDemo.dpr

改了还不行?那你先把改过的IdHeaderCoder.pas拷到你的程序的编译目录下再试试,
如果再不行就把那个乱码的信头帖出来看看。
 
我想用Message-ID来保存邮件到本地,不过暂时不管,但是我之前,把smtp控件的
AuthenticationType属性设为atLogin,然后填好它的UserID和Password,却不能将邮件
发出,所以现在只能通过直接发到对方IP,但是有新的问题,那就是取得那个IP很困难,见:
http://www.delphibbs.com/delphibbs/dispq.asp?LID=1222873
我的subject显示的是=?gb2312?B?0ru1wNDEw03M4g==?=,其实它是中文,在OutLook能显示.
 
你给出的标题怎么是“一道心肕题”?呵呵,不管它,反正是中文,编码也没什么问题。
我估计是重编译的问题,你找到你机器里的IdHeaderCoder.dcu,把它们全部删掉,
再来个Rebuild All,如果真的改对了地方应该是不会再出现乱码的。

你是想用Message-ID做邮件的唯一标识了?
我觉得不太好,因为它并不可靠,并且没有统一的规范。
自己设计一个简单的区分规则就够了(比如结合时间、发件人等)。

不知道你用的哪个smtp服务器,报了什么错呢?用OutLook发有没有同样的问题?
取DNS的话你看看Indy的IdDNSResolver控件能不能用得上,我没用过,不好说。
不过不是很明白你的做法,什么叫“直接发到对方IP”?
我想你不是指“特快专递”的方式吧,如果是最终可能还是躲不过对方服务器的验证。
 
没错,我就是指“特快专递”的方式,现在可以发了,不过需要知道DNS Server,我知道
ipconfig/all 可以获得.但不知用Delphi如何获得,其实我试过delphi带的demo,也不能发
出去,虽然没有出错,但对方却收不到,不知是怎么回事.
 
我删除掉了所有的IdHeaderCoder.dcu,但是Rebuild All 以后再搜索就找不到该文件了,当
然还是有?=gb2312...等乱码!我用的是IDPop3,IDMessage.
 
乱码问题解决了,按你的方法做就行了.
现在我只剩下发邮件的问题了.如果不用"特快专递"为什么发不出去呢?
 
试探性地问一句:你是不是用21CN的SMTP发信的?如果是就好办了:)
(我一下子找不到我答过的那个问题了,你先说一下是不是,如果是我再跟你详说)
 
是的!我就是用21cn
 
哈哈,看来这个21CN真是为祸不浅啊——
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1210187
把IdMessage.pas的第465行注释掉就OK了!
 
还有为什么IdMessage.Date返回的只有日期,如何取得时间呢?
 
IdMessage.Date是完整的时间呀,你用DateTimeToStr或者FormatDateTime都可以显示完全。
比如你把MailDemo的Main.pas的242行里的DateToStr改成DateTimeToStr或TimeToStr看看……
 
5rain6sky,你真厉害,我终于可以用21cn发邮件了,你帮我解决了很多问题,也为我解释了很
多疑惑,更使我对Delphi Source感性趣,那样可以自己扩充她的功能,你太厉害了,我真的很
佩服你,今天我从你这学了不少.
所以很想试探性地问一句,能否把你的email或OICQ发给我(szkxy@21cn.com)?
我只想遇到难题时找你,不会随便一碰到问题便来打扰你的.
 
呵呵,你太客气了[:)]
我的email:5rain6sky@163.com
 
不玩这个,不会。
 
后退
顶部