您的位置:资讯频道 > 技术文档 > 控件开发基础

关于用Delphi中的Indy控件实现收发邮件的几点学习记录

来源:CSDN   作者:zenith   时间:2007-12-04  点击:650 次

导读:
  这几天心里颇不宁静,不是因为项目延期,而是因为自己几个月前做的邮件发送程序至今无任何进展,虽然一向谦虚的人在网上发贴总以“小弟”自称。也发过N多关于此类问题的贴子,但总是收益甚少,但也十分感谢参与贴子的各位同仁。必竟,用 Indy 控件实现收发邮件的例子太少了,于是小弟决定写一篇关于 Indy 收发邮件的文章,供大家参考。由于本人才疏学浅,故难免有不少谬误,还请各位见谅。
  在做例子之前,应明白整个发送和接收邮件流程:
  
  从此流程可以看出,客户向 smtp 服务器发出邮件后,由 smtp 服务器负责向收件人发出最终信件,这个过程由服务器完成,客户无需操心。客户所关心的只是怎样将邮件发送到 smtp 服务器上去。POP3更简单了,只需要正确登录到 POP3服务器上,再下载需要的邮件即可。
  用 Indy 创建收发电子邮件的例子:
  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;
  希望对大家有所帮助。

相关文章:

    暂无相关新闻。