关于用Delphi中的Indy控件实现收发邮件的几点学习记录     
        这几天心里颇不宁静,不是因为项目延期,而是因为自己几个月前做的邮件发送程序至今无任何进展,虽然一向谦虚的人在网上发贴总以“小弟”自称。也发过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,j : integer;
  tmp, sub : string;
begin
  IdPOP31.Connect();    //连接到POP3服务器
  mailcount := IdPOP31.CheckMessages;  //得到邮箱邮件的各数
  for i:=1 to mailcount do   //遍历每一封邮件
  begin
     IdMessage1.Clear;
     IdPOP31.retrieveHeader(i,IdMessage1);  //得到邮件的头信息
     sub := IdMessage1.Subject;      //得到邮件的标题
     Memo1.Lines.Add(sub);    //显示标题
     IdPOP31.Retrieve(i,IdMessage1);  //接收到邮件所有内容
     tmp := IdMessage1.Body.Text;   //邮件正文
     memo1.Lines.Add(tmp);  //显示正文

for j:=0 to IdMessage1.MessageParts.Count-1 do  //查看邮件所有内容,保证能够下载所有附件
     try
        if (IdMessage1.MessageParts.Items[j] is TIdAttachment) then   //匹配邮件条目是否是附件
        begin
          TIdAttachment(IdMessage1.MessageParts.Items[j]).SaveToFile('c:\'+TIdAttachment(IdMessage1.MessageParts.Items[j]).FileName);    //以原有文件名保存附件在指定目录
        end;
     except
       continue;
     end;

end;
  IdPOP31.Disconnect;   //断开连接
end;

注意:以上在下载邮件附件时,若附件名包含汉字,则会触发异常,这就需要您想法转换汉字编码。若附件名没有汉字,以上代码不会出现异常。

希望对大家有所帮助。

http://blog.csdn.net/luo809976897/article/details/24429255

Delphi中,indy控件实现收发邮件的几点学习记录( 可以考虑加入多线程,用多个邮箱做一个邮箱群发器) 转的更多相关文章

  1. Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决

    Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决 EmbeddedWBWebBrowserDelphi  最近用E ...

  2. Delphi中TxmlDocument控件的用法 转

    Delphi中对XML文件的解析做的很好,比直接使用MS的MSXML2_TLB中的接口要方便很多,现称述于下面. 在讲之前先给出一个XML实例,在讲某些部分是要结合实例比较容易理解. 1<?xm ...

  3. [转载]: delphi中XLSReadWrite控件的使用(1)---简介

    XLSReadWrite控件简介: 一个你需要的,能在Delphi和.NET下访问Excel文件的完美解决方案. 一个经典的读写Excel的控件,对于使用Excel 开发很有帮助 官方网站: http ...

  4. delphi中panel控件应用

    delphi中的panel控件是怎么使用的?研究了很久了,还是搞不懂,只知道把它放到form上面,其他操作一律不懂了,有谁可以请教一下,如何把其他控件放到里面去呢?谢谢 提问者采纳   直接把控件放到 ...

  5. 转Delphi中XLSReadWrite控件的使用(1)---简介

    XLSReadWrite控件简介: 一个你需要的,能在Delphi和.NET下访问Excel文件的完美解决方案. 一个经典的读写Excel的控件,对于使用Excel 开发很有帮助 官方网站: http ...

  6. delphi中DateTimePicker控件同时输入日期和时间

    将DateTimePicker的Format属性中加入日期格式设成 'yyyy-MM-dd HH:mm',注意大小写 , 将kind设置为dtkTime即可,可以在每次Form onShow时将Dat ...

  7. delphi 中 image 控件加载bmp、JPG、GIF、PNG等图片的办法

    procedure TForm1.Button1Click(Sender: TObject);var  jpg: TJPEGImage; // 要use Jpeg单元begin  // 显示jpg大图 ...

  8. 怎样在delphi中实现控件的拖拽

    下面这2种方法都能实现对控件和窗体的拖拽 方法1 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift ...

  9. 怎样在delphi中实现控件和窗体的拖拽

    下面这2种方法都能实现对控件和窗体的拖拽 方法1 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift ...

随机推荐

  1. 【19.05%】【codeforces 731F】 Video Cards

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  2. 【25.23%】【codeforces 731C】Socks

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  3. matlab 编程的细节问题

    1. reshape 对元素的操作 使用单一维度对矩阵进行操作时,矩阵是逐列地进行编号的(如下矩阵中的 4, 5, 6,分别在矩阵 A 的第 4, 5, 6 索引处,而不是以行进行排序的 2,5,8 ...

  4. Smarty优缺点

    Smarty优点: 1. 速度:采用smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的. 2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PH ...

  5. jQuery中的Deferred和promise

    promise:http://www.alloyteam.com/2014/05/javascript-promise-mode/ 1 jQuery 中的 Deferred 和 Promises : ...

  6. OpenCV For iOS 1:&#160;连接OpenCV 3.0

    本文的内容參考Instant OpenCV for iOS结合最新的开发平台完毕. 本系列文章採用的的开发环境为: 1)Xcode 6 2)OpenCV for iOS 3.0.0 alpha 接下来 ...

  7. exponential family distribution(指数族分布)

    1. exponential family 给定参数 η,关于 x 的指数族分布定义为如下的形式: p(x∣∣η)=h(x)g(η)exp{ηTu(x)} 其中 x 可以为标量也可以为矢量,可以为离散 ...

  8. Method of packet transmission from node and content owner in content-centric networking

    A method of transmitting a content reply packet from a content owner in content-centric networking ( ...

  9. C#中HttpWebRequest与HttpWebResponse的使用方法

    关键字:C# HttpWebRequest HttpWebResponse HTTP GET POST 请求 这个类是专门为HTTP的GET和POST请求写的,解决了编码,证书,自动带Cookie等问 ...

  10. Codeforces Round #248 (Div. 2) B称号 【数据结构:树状数组】

    主题链接:http://codeforces.com/contest/433/problem/B 题目大意:给n(1 ≤ n ≤ 105)个数据(1 ≤ vi ≤ 109),当中有m(1 ≤ m ≤  ...