HanDs
管理员

[Delphi文章] 用ics收邮件 





学习中请遵循国家相关法律法规,黑客不作恶。没有网络安全就没有国家安全

本站需要登陆后才能查看

通常用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: <[email protected]>
To: [email protected]
Subject: 邮件标题
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="==========54535aavfgq===="
X-CM-TRANSID:C8CowLCLxwd1prFLduQ3AA--.3951S3
X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73
 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjxU0YFADUUUU
Message-Id: <[email protected]>
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;//退出连接


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
ic s 邮件
#1楼
发帖时间:2016-7-9   |   查看数:0   |   回复数:0
游客组
快速回复