通常用indy和fastnet收邮件,若邮件过大就会没有响应,收取不成功。通过试验,用ics控件包中的smpt来收邮件就没有这种问题,但是ics的帮助资料较少,其附带的例子并没有说明如何收取邮件的附件。(我用的是ics5。下载地址:http://www.overbyte.be),本例子使用SyncPop3Cli控件来下载邮件,并取得附件。
一、基本设置
syncp3cl1.AuthType := popAuthLogin;//需要认证 syncp3cl1.Host := 'pop3.163.com';//收邮件服务器 syncp3cl1.MultiThreaded := False;//多线程 syncp3cl1.PassWord := '密码'; syncp3cl1.UserName := '用户名'; syncp3cl1.Port := '110';//端口
二、收邮件
1、 syncp3cl1.OpenSync;//打开连接 2、syncp3cl1.StatSync;//取得当前邮件数等信息
syncp3cl1.MsgCount;//当前邮件总数
syncp3cl1.MsgNum := 1;//设置要获取第几个邮件的摘要 syncp3cl1.TopSync;//取邮件摘要
3、这时就可读取一系列邮件的基本信息,如:
syncp3cl1.HeaderSubject;//取得邮件标题
syncp3cl1.HeaderDate;//日期
等等
4、
要删除邮件就这样:
syncp3cl1.MsgNum := 1;//要删除的邮件号 syncp3cl1.DeleSync;//执行删除 5、
要接收完整邮件就这样:
lbl1.Caption = '数据下载中。';//设置下载标记
syncp3cl1.MsgNum :=1;//要接收的附件号 syncp3cl1.RetrSync; //开始下载邮件。
6、以上的操作中会触发MessageLine事件。
所以我们可以在此把收到的数据保存起来。然后再进一步处理。
procedure TForm1.syncp3cl1MessageLine(Sender: TObject); begin if lbl1.Caption = '数据下载中。' then //只要下载的数据,其他信息的不要。 memo1.lines.Add((Sender as TPop3Cli).LastResponse);//接收到的数据保存起来,若是大邮件最好用流 end; 这样就会得到一个完整的邮件了。
7、接下来就是邮件解码的工作了。
若是base64的解码,可用我找到的:http://lyq2276959.blog.163.com/blog/static/28097203201022510218725/
注意:附件的解码最好一行一行解,然后连接起来(因为附件经base64编码后会分成若干行,一行是60字符,所以解码时要去掉换行回车等非法字符。这时用流就最方便了。)
如:
收到如下邮件信息:
Received: from lyq2276959 (unknown [59.34.112.1]) by smtp7 (Coremail) with SMTP id C8CowLCLxwd1prFLduQ3AA--.3951S3; Tue, 30 Mar 2010 15:21:25 +0800 (CST) From: <lyq2276959@163.com> To: lyq2276959@163.com Subject: 邮件标题 Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="==========54535aavfgq====" X-CM-TRANSID:C8CowLCLxwd1prFLduQ3AA--.3951S3 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjxU0YFADUUUU Message-Id: <4BB1A676.045482.14532@m12-11.163.com> Date: Tue, 30 Mar 2010 15:21:26 +0800 (CST) X-CM-SenderInfo: bdqwlmqrtzqiywtou0bp/1tbiJRCjNECeIdQRzgAAsW
--==========54535aavfgq==== Content-Type: text/plain; charset=gb2312
本邮件是测试的,测试日期:2010-03-30 15:23:11 --==========54535aavfgq==== Content-Type: application/octet-stream; name="附件名.exe" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="附件名.exe"
AAEAAFN0YW5kYXJkIEpldCBEQgAAAAAAtW4DYmAJwlXpqWdyQD8AnH6fkP+F mjHFebrtMLzfzJ1i2eDL00H7irxOhvvsN11EnPrGXijmE7aKYFSUezbrV9+x d/QTQ8+vsTM0YXlbkrV8KgXxfJkBG5j9Ek9KlGw+YCZflfjQiSSFZ8YfJ0TS 7s9l7f8Hx0aheBYM7ektAAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AQAAAAwAAQQIAAQAAQAAAAwAAQQJAAQAAAAAAAwAAQQKAAQAqAMAAA== --==========54535aavfgq====-- 经分析可知邮件的附件名是:附件名.exe,其中蓝色文字部分就是附件的具体数据。
fs := TStringStream.Create(''); for k := 附件起始行 to 附件结束行 do //这样分行解码,自然就去掉换行回车符的 ) : begin a := Base64Decode(list.Strings[k]);//本邮件附件是经base64编码的,所以相应地解码 fs.WriteString(a); end; ff := TFileStream.Create(ExtractFileDir(Application.ExeName) + '\temp.exe', fmCreate); fs.Position := 0; ff.CopyFrom(fs, fs.Size); ff.Free; fs.Free; 这样就可得到附件temp.exe了。
8、收工
syncp3cl1.QuitSync;//退出连接 |