Indy TIdPOP3和TIdMessage如何接收邮件附件

thaoqi 2010-09-21 10:34:51
最近用Indy的TIdPOP3和TIdMessage做一个邮件接收工具的时候,遇到接收邮件附件的问题:我用IdPop31.Retrieve接收完邮件后,对比WEB邮箱中的邮件信息,几个邮件明明是有附件的,但是我使用TIdMessage.AttachmentCount得到的值始终为0,这是为什么?还有就是接受附件,应该如何保存下来
...全文
382 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ecjtu5208 2010-09-21
  • 打赏
  • 举报
回复
一半的分?唉。。。。难道我那个方法不能求出总数?我惊讶。

var
Attachmentcount:integer; //保存附件个数

if (IdMessage1.MessageParts.Items[i] is TIdAttachment) then
begin
inc(Attachmentcount); //如果是附件那么Attachmentcount+1
end

最后得到的Attachmentcount则是总数。
然后你拿这个Attachmentcount随便做你要做的什么,你要做循环就去做啊


for i:=1 to Attachmentcount do
begin
//做你要做的。
end;

你可以得到这个数目之后再保存啊。没必要和我写的那个一样啊。变通,我们需要的是变通。

if (IdMessage1.MessageParts.Items[i] is TIdAttachment) then
begin
TIdAttachment(Message2000.MessageParts.Items[i]).SaveToFile()//是附件,存起来
end

你觉得呢?
thaoqi 2010-09-21
  • 打赏
  • 举报
回复
前面的是没问题,就是附件总数的问题没有解决,我总不能先把附件保存出来以后再计算总数吧?在未知总数的情况下,我的循环怎么都是扯淡的,所以只能给你一半的分数
ecjtu5208 2010-09-21
  • 打赏
  • 举报
回复
这还不好办?

if (IdMessage1.MessageParts.Items[i] is TIdAttachment) then
begin
TIdAttachment(Message2000.MessageParts.Items[i]).SaveToFile()//是附件,存起来
inc(Attachmentcount); //是附件统统给哥加起来。
end

弱弱的问一句,上面给的方法成不成?
就是那个

用这个 TIdAttachment.Create(IdMessage1.MessageParts,filename);
这玩意有保存
TIdAttachment(IdMessage1.MessageParts.Items[i]).SaveToFile()来收附件的

我希望你给我全分。我不容易啊。给你倒腾的,累啊。呵呵。



thaoqi 2010-09-21
  • 打赏
  • 举报
回复
那 怎么正确的知道邮件的附件数量?
ecjtu5208 2010-09-21
  • 打赏
  • 举报
回复
句子要改的啊,别复制粘贴啊。
ecjtu5208 2010-09-21
  • 打赏
  • 举报
回复
用这个 TIdAttachment.Create(IdMessage1.MessageParts,filename);
这玩意有保存
TIdAttachment(Message2000.MessageParts.Items[i]).SaveToFile()来收附件的
ecjtu5208 2010-09-21
  • 打赏
  • 举报
回复
啊?晕倒,等等,待俺测试一下去。
thaoqi 2010-09-21
  • 打赏
  • 举报
回复
老大 我问的是接受附件 不是接收邮件 不过还是谢谢一个先
ecjtu5208 2010-09-21
  • 打赏
  • 举报
回复
这年头,抢分真TM难。
还有好多不结贴的。
呱噪
ecjtu5208 2010-09-21
  • 打赏
  • 举报
回复

var
filename:string;
begin
if idsmtp1.Connected then
idsmtp1.Disconnect
else
begin
idsmtp1.Host := 'smtp.usish.com';
idsmtp1.Username := 'huang_xiao';
idsmtp1.Password:='huang';
idsmtp1.authenticationtype:=atlogin;
idsmtp1.Port:=25;
idsmtp1.Connect;
end;
idmessage1.From.Address:='huang_xiao@usish.com';
idmessage1.Recipients.EMailAddresses:='huang_xiao@usish.com';
idmessage1.From.Name:='THOMAS';
idmessage1.Subject:='test';
idmessage1.Body.Text:='hengheng';
filename := 'c:\x.ods';
TIdAttachment.Create(IdMessage1.MessageParts,filename);
idsmtp1.Send(idmessage1);
end;




1、创建工程,在窗体中加入IdSMTP1、IdMessage1和IdPOP31(Indy控件标签组)控件各一个。

2、设置 IdSMTP1.Host := 'SMTP.163.com';(我用的是163检试,具体也可选择其它服务器) IdSMTP1.Username := 'caoyan528';(此处即表示邮箱的帐号名,例如邮箱为:aaaaaa@163.com,则Username即为aaaaaa) IdSMTP1.Password := 'XXXXXXXX';(此处即为邮箱的密码,如aaaaaa@163.com邮箱密码为123456,则Password即为123456)。

3、设置IdMessage1.From.Address := 'caoyan_528@163.com';(注意,此处的邮箱地址应在smtp.163.com中存在且就为以上设置的Username),IdMessage1.Recipients.EMailAddresses := ‘caoyan528@gmail.com’(此处表示收件人地址,只要是任何一个存在的邮箱地址即可) IdMessage1.Subject:= '第一个邮件客户端';(主题)具体源代码如下:

procedure TForm1.Button4Click(Sender: TObject);
var
filename : String;

tmpEMailItem : TIdEMailAddressItem;
// tmpEmailAdd : TIdEmailAddressList;
begin
try
IdSMTP1.Host := 'SMTP.163.com';

IdSMTP1.AuthenticationType := atLogin; //保证登录模式为Login
IdSMTP1.Username := 'caoyan_528';
IdSMTP1.Password := 'XXXXXX';
filename := 'E:\邮件发送程序\2003-12-22_253_04.jpg'; //需要添加的附件文件
TIdAttachment.Create(IdMessage1.MessageParts,filename); //添加附件

IdMessage1.From.Address := 'caoyan_528@163.com';
IdMessage1.Recipients.EMailAddresses:='caoyan528@gmail.com';

tmpEMailItem := IdMessage1.Recipients.Add; //添加一个地址列表

tmpEMailItem.Text := 'caoyan528@gmail.com'; //写一个收件人

idMessage1.BccList.Add.Text := 'caoyan_528@yahoo.com.cn'; //书写多个目标地址,实现群发

idMessage1.BccList.Add.Text := 'caoyan_528@163.com'; //书写多个目标地址,实现群发


IdMessage1.Subject:= '第一个邮件客户端';
IdMessage1.Body.Text := Memo1.Text; //此处为邮件正文

IdMessage1.CharSet := 'gb2312'; //保证附件正文汉字的正常显示
IdMessage1.Body.Assign(Memo1.Lines);
if IdSMTP1.AuthSchemesSupported.IndexOf('LOGIN')>-1 then
begin
IdSMTP1.AuthenticationType := atLogin; //连接前要保存为Login 上面己设,此处不必要
IdSMTP1.Authenticate;
end;

IdSMTP1.Connect(); //连接SMTP服务器
IdSMTP1.Authenticate;
IdSMTP1.Send(IdMessage1); //向服务器发送邮箱
finally
IdSMTP1.Disconnect; //断开与服务器的连接
end;
end;

自此,memo1中所写的内容被当作邮件发送了出去。而filename所指的附件也一同被发送到了服务器。


4、接收邮件

收以上的流程图不难看出,接收邮件完全是POP3服务器来完成的,客户只需连接到POP3服务器即可下载邮件。具体做法如下:

设置IdPOP31.Host := POP.163.com IdPOP31.Username := 'caoyan_528'; IdPOP31.Password:= 'XXXXX'; (此处的设置与SMTP的设置相同) 源代码如下:

procedure TForm1.Button5Click(Sender: TObject);
var
mailcount : integer;
i : integer;
tmp : string;
begin
IdPOP31.Connect(); //连接到POP3服务器
mailcount := IdPOP31.CheckMessages; //得到邮箱邮件的各数
for i:=1 to mailcount do //遍历每一封邮件
begin
IdMessage1.Clear;
IdPOP31.retrieveHeader(i,IdMessage1); //得到邮件的头信息
tmp := IdMessage1.Subject; //得到邮件的标题
Memo1.Lines.Add(tmp);
IdPOP31.Retrieve(i,IdMessage1); //接收到邮件所有内容
tmp := IdMessage1.Body.Text; //邮件正文
memo1.Lines.Add(tmp);
end;
IdPOP31.Disconnect; //断开连接
end;

用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则必须设置密码和用户名。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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