Delphi中,indy控件实现收发邮件的几点学习记录( 可以考虑加入多线程,用多个邮箱做一个邮箱群发器) 转
关于用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控件实现收发邮件的几点学习记录( 可以考虑加入多线程,用多个邮箱做一个邮箱群发器) 转的更多相关文章
- Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决
Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决 EmbeddedWBWebBrowserDelphi 最近用E ...
- Delphi中TxmlDocument控件的用法 转
Delphi中对XML文件的解析做的很好,比直接使用MS的MSXML2_TLB中的接口要方便很多,现称述于下面. 在讲之前先给出一个XML实例,在讲某些部分是要结合实例比较容易理解. 1<?xm ...
- [转载]: delphi中XLSReadWrite控件的使用(1)---简介
XLSReadWrite控件简介: 一个你需要的,能在Delphi和.NET下访问Excel文件的完美解决方案. 一个经典的读写Excel的控件,对于使用Excel 开发很有帮助 官方网站: http ...
- delphi中panel控件应用
delphi中的panel控件是怎么使用的?研究了很久了,还是搞不懂,只知道把它放到form上面,其他操作一律不懂了,有谁可以请教一下,如何把其他控件放到里面去呢?谢谢 提问者采纳 直接把控件放到 ...
- 转Delphi中XLSReadWrite控件的使用(1)---简介
XLSReadWrite控件简介: 一个你需要的,能在Delphi和.NET下访问Excel文件的完美解决方案. 一个经典的读写Excel的控件,对于使用Excel 开发很有帮助 官方网站: http ...
- delphi中DateTimePicker控件同时输入日期和时间
将DateTimePicker的Format属性中加入日期格式设成 'yyyy-MM-dd HH:mm',注意大小写 , 将kind设置为dtkTime即可,可以在每次Form onShow时将Dat ...
- delphi 中 image 控件加载bmp、JPG、GIF、PNG等图片的办法
procedure TForm1.Button1Click(Sender: TObject);var jpg: TJPEGImage; // 要use Jpeg单元begin // 显示jpg大图 ...
- 怎样在delphi中实现控件的拖拽
下面这2种方法都能实现对控件和窗体的拖拽 方法1 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift ...
- 怎样在delphi中实现控件和窗体的拖拽
下面这2种方法都能实现对控件和窗体的拖拽 方法1 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift ...
随机推荐
- 让C#语言充当自身脚本!——.NET中的动态编译
原文:让C#语言充当自身脚本!--.NET中的动态编译 代码的动态编译并执行是.NET平台提供给我们的很强大的一个工具,用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代码 ...
- 生成式模型(generative) vs 判别式模型(discriminative)
Andrew Ng, On Discriminative vs. Generative classifiers: A comparison of logistic regression and nai ...
- 五笔字根--good
https://gss0.baidu.com/94o3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/4b90f603738da977b1b5ce57b251f8198 ...
- JS高级程序设计拾遗
<JavaScript高级程序设计(第三版)>反反复复看了好多遍了,这次复习作为2017年上半年的最后一次,将所有模糊的.记不清的地方记录下来,方便以后巩固. 0. <script& ...
- Bit error testing and training in double data rate (ddr) memory system
DDR PHY interface bit error testing and training is provided for Double Data Rate memory systems. An ...
- Array类型判断
http://www.cnblogs.com/YaoAzhen/archive/2010/01/27/1657696.html
- 科学的解决Http Token拦截器TokenInterceptor实现
1.写在前面 在做项目的时候,有时对接口要求比较严谨.先介绍下情况. 我这边Http 方式采用的是 OKhttp+Retrofit 后台一共分为三种token,分别是实名token(accessTok ...
- 深入Qt 学习 -- 反射机制(比较简单清楚)
相对于Java天生的这一特性, C++并不具备;但进入到Qt领域,这一切都变得简单自如了. 从Qt的元对象系统可知,除了提供信号/槽机制的特性之外,它还提供了以下特性: ■ QObject::meta ...
- Matlab随笔之分段线性函数化为线性规划
原文:Matlab随笔之分段线性函数化为线性规划 eg: 10x, 0<=x<=500 c(x)=1000+8x, 500<=x<=1000 300 ...
- linux_crontab_定时删除
#每天2:30 删除4天前qac的原始log30 2 * * * find /home/iknow/ETL/RetlPull/retl-pull/data/qac -name qac.log.new. ...