ESMTP邮件发送程序

下载本节例子程序和源代码 (9.67 KB)

最近在CSDN论坛上看到许多人问着同一个问题——如何编写带服务器验证的 ESMTP 邮件发送程序,回答的人还真不少:有建议用 MAPI 的、有建议使用别人的类库的……其实我对此是颇不以为然的。ESMTP 的编写并不困难,关键是弄清楚了协议——只要严格按照协议来进行,就一定能OK,反而编程的技巧在此倒是无足轻重的。换句话说,写这个程序是Easy job,没有必要用到 MAPI 等“庞然大物”啊。

既然如此,让我们来使用 Win32ASM 编写一个自己的 ESMTP “引擎”,可以用在你的病毒或者木马上哦!   :)

我们先来看看 SMTP 的发送协议,在 rfc821(smtp) 和 rfc1521(mime) 里面写得非常清楚,读者请自行参考这两个文档。什么?看不懂英文?……没关系,我给大家整理一下。ESMTP 的整个发送过程如下:

Socket连接后,按 ESMTP 协议通讯(注意每条命令结尾符“回车/换行/./回车/换行”结束):
1、EHLO <Domain>/r/n
         这条命令可以不要,但是按照标准的写法,还是加上好。
         Example: EHLO smtp.163.net/r/n
2、AUTH LOGIN/r/n
         告诉服务器,要进行验证了。
3、Base64_Username/r/n
         发送经过 Base64 编码的用户名给服务器。
4、Base64_Password/r/n
         发送经过 Base64 编码的密码给服务器。
5、MAIL FROM:/r/n
         发送者的Email地址。
         Example: MAIL FROM: lcother@163.net/r/n
6、RCPT TO:/r/n
         目标Email地址。
         Example: RCPT TO: target@163.net/r/n
7、DATA/r/n
         开始传送数据。
8、发送数据/r/n./r/n
         注意:SMTP协议只发送信息,至于如何区分CC、BCC、Subject、Body等不属于SMTP的范围,详情请查看RFC文档MAIL格式部分
         简单说一下MAIL格式:Sunject:<主题>/r/n/r/n<内容>,还有好多……
         返回值为“250 ***”表示正常,同时***里含有MessageID等信息(前面的命令都有相应的返回信息)
9、QUIT/r/n
         Over,走人……

上面的是 ESMTP 的协议,如果我们严格按照上面的协议,就可以写出 ESMTP 的发送程序了。大家看出来了吗?其实 ESMTP 与 SMTP 唯一不同的地方,就是在于第三步和第四步——缺少了这两个步骤, ESMTP 就等于 SMTP 了。

至于如何区分正文和附件,其实是在 DATA/r/n 后,通过一个叫做“Boundary”的分隔字符串来分隔开来的,这个“Boundary”可以是任意的字符串,随你喜欢怎么取都行,但是必须注意的是,分隔的时候要按照“--Boundary”的格式,结束的时候要用“--Boundary--”。而附件的内容,是通过 Base64 编码,包含在 DATA 里面进行发送;如果有多个附件,就要进行循环,把每个附件的内容包含进去,直至结束。

这样说会不会太抽象了?好吧,我举个例子:

"EHLO smtp.163.net", 13, 10
"AUTH LOGIN", 13, 10
"lcother", 13, 10
"lcother_password", 13, 10
"MAIL FROM:lcother@163.net", 13, 10
"RCPT TO:target@163.net", 13, 10
"DATA", 13, 10
"From: 老罗", 13, 10,/
"To: Somebody", 13, 10, /
"Subject: 你好吗?", 13, 10, 0
"MIME-Version: 1.0", 13, 10, /
"X-Mailer: LCMailer by LC", 13, 10, /
"Content-type:multipart/mixed;Boundary=www.LuoCong.com", 13, 10, 13, 10, /
"--www.LuoCong.com", 13, 10, /
"Content-type:text/plain;Charset=GB2312", 13, 10, /
"Content-Transfer-Encoding:8bit", 13, 10, 13, 10, /
"好久不见,最近过得好吗?(正文内容)", 13, 10, 13, 10, 0, /
.if (有附件)
     "--www.luocong.com", 13, 10, /
     .while (files to be sent)
         13, 10, /
         13, 10, /
         "--", 13, 10, /
         "Content-Type:application/octet-stream;Name=文件名", 0, /
         "Content-Disposition:attachment;FileName=文件名", 0, /
         13, 10, /
         "Content-Transfer-Encoding:Base64", 13, 10, 13, 10, 0, /
         经过 Base64 编码的文件内容, 13, 10, 0/
     .endw
.endif
13, 10, /
"--www.luocong.com--", /
13, 10, ".", 13, 10
"QUIT", 13, 10
 

posted @ 2007-10-25 13:00  Socrates  阅读(252)  评论(0编辑  收藏  举报