如何解决 Indy 的 IdPOP3 和 IdMessage 做邮件收发时的乱码问题

LngDotin 2008-03-15 10:53:48
用 Indy 的 IdPOP3 和 IdMessage 做邮件收发的程序。

现况如下:
  能检测到未读邮件数目,也能正常收取,但收到邮件的名字都是诸如:=?gbk?B?NjY2NrT408q8/rLiytQ=?=这样的乱码(名字仅为数字时正常),邮件内容则为空白,接收源码如下:
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
String TempStr;

Button2->Enabled=false;
Memo1->Clear();
for(int i=1;i<=IdPOP31->CheckMessages();i++)
{ IdMessage1->Clear();
try
{ StatusBar1->SimpleText=" 正在收取邮件第 "+IntToStr(i)+" 封邮件......";
//IdMessage1->From->Name="Carny";
IdMessage1->ContentType="text/html";
//IdMessage1->CharSet="US-ASCII";
IdMessage1->CharSet="GB2312";
IdMessage1->ContentTransferEncoding="base64";
IdPOP31->RetrieveHeader(i,IdMessage1);
TempStr=IdMessage1->Subject; //(IdMessage1->Subject);
Memo1->Lines->Add(TempStr);
IdPOP31->Retrieve(i,IdMessage1);
TempStr=IdMessage1->Body->Text;
Memo1->Lines->Add(TempStr);
StatusBar1->SimpleText=" 第 "+IntToStr(i)+" 封邮件接收成功......";
}
catch(...)
{ IdPOP31->DisconnectSocket();
IdPOP31->Disconnect();
StatusBar1->SimpleText=" 收取邮件时发生未知错误!";
Application->MessageBox("收取邮件时发生未知错误!","错误提示",MB_ICONWARNING);
}
}
IdPOP31->Disconnect();
}

//---------------------------------------------------------------------------

问题如下:
  收到的邮件名字是 base64 编码吗?怎样能解析出正常的文字?为什么邮件的 Body 收到的是一版空白?
  请经验的老兄支招,谢绝灌水,如有可能请给代码示例一下最好,先谢过您了。
...全文
573 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
misaiya 2009-10-15
  • 打赏
  • 举报
回复
发送的时候是GBK编码?
promiseclx 2009-04-16
  • 打赏
  • 举报
回复
如何检测未读邮件数目?发一份共同研究。chenlx10@163.com
vbcrack 2008-11-25
  • 打赏
  • 举报
回复
up
关注……
jddj007 2008-03-26
  • 打赏
  • 举报
回复
不懂,鉴定完毕
ydlchina 2008-03-16
  • 打赏
  • 举报
回复
到网上下载indy10 memo有个Indy_10_MailClient文件夹里面有详细的方法
玄之丞 2008-03-15
  • 打赏
  • 举报
回复
有可能是编码不符。先试试base64解码。
用Delphi2010 实现邮件附件收发功能 TIdPOP3组件简介 TIdPOP3 是用来接收邮件服务器的邮件信息到用户端的一个组件。它实现了RFC 1939协议。 在使用TIdPOP3组件需设置它的几个成员属性。 Host :指定邮件服务器,一般为pop3邮件服务器的地址,如 pop3.126.com。 Username :用户名,也就是邮箱名,如billanking2002@126.com。 Password :邮箱密码,在进行收发邮件组件需要凭密码进行登录。 其它成员属性 Connected:返回它与邮件服务器的连接状态,这true表示已经连接。 CheckMessages:邮件数,如果连接服务器成功,则可以获得服务器端的邮件数。 成员函数 procedure Connect(const ATimeout: Integer = IdTimeoutDefault); 与服务器连接函数。参数为无效连接等待的毫秒数。 function RetrieveHeader(const MsgNum: Integer; AMsg: TIdMessage): Boolean; 接收邮件头信息,它有两个参数,MsgNum表示在接收第几个邮件,从1开始,AMsg为邮件消息组件实例。 function Retrieve(const MsgNum: Integer; AMsg: TIdMessage): Boolean; 接收邮件主体信息,它与 RetrieveHeader的参数是一样的。接收的邮件内容将保存在AMsg中。 function Delete(const MsgNum: Integer): Boolean; 删除邮件服务器中第几个邮件。从1开始。 procedure Disconnect; override; 关闭连接。 TIdMessage组件简介 TIdMessage用来支持邮件消息协议,如POP3,SMTP,NNTP等。TIdMessage支持多用途Internet邮件扩展(MIME)协议。 常用的TIdMessage的属性: Subject:邮件主题,这个字符串经过BASE64编码的。所以在使用需对它进行解码。 MessageParts:这是TIdMessageParts类的一个实例,它用来存储邮件的信息。如邮件内容及附件信息。在进行解析需要判断它是否为附件或文本,如果为附件,其文件名是经过BASE64编码的。判断常量分别为TIdText , TIdAttachment。 Body:这是个字符串列表,包含构成该邮件的正文内容。 Form:发送邮件者的地址信息。 Recipients:收件人地址信息。 BccList:抄送地址列表。 CharSet:指示邮件信息中使用的字符集。 ContentType:指定MIME媒体数据类型,描述正文中包含的数据,使用户代理决定如何显示数据,常用的有text/html,text/xml。 TIdSMTP组件简介 TIdSMTP是TIdMessageClient派生出的一个简单邮件传输协议和SMTP客户端。 它的主要功能是发送邮件信息。 常用的属性: Host :SMTP邮件服务器的地址,如smtp.126.com。它与上面的POP3地址不一样。 AuthenticationType:服务器认证类型,它有atNone,atLogin两种,即不需要认证和需要凭用户名和密码进行认证。 Username:用户名,这里与TIdPOP3 有点不一样,即它不需要后缀,如billanking2002 Password:邮箱登录密码。如果AuthenticationType设置了atLongin则必须设置密码和用户名。

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧