|
自己的邮箱经常收到垃圾邮件,即便是最先进的反垃圾邮件引擎也无法保证完美的拦截率。于是自己对于邮件的发送接收产生了兴趣,正好刚学了Python,看到其有丰富的Internet应用包,于是赶紧来试试吧!自己用了两天时间写了一个发送邮件的小程序,只能说是一个雏形吧,没有交互界面,功能也不完善,但是还是学到了不少东西,下面先简单补充下email中可能用到的知识,然后讲解下我们的代码。
想要了解Email,最好的方法莫过于分析一个Email文件了,这里截取了一个测试的邮件,做下简单的分析:
Received: from mail.sdas.org (unknown [172.16.1.9])
by mail.sdas.org (AnyMacro(G7)) with SMTP id D2A8210009D
for <******@sdas.org>; Wed, 23 Jul 2014 16:40:04 +0800 (HKT)
X-scanvirus: By EQAVSE AntiVirus Engine
X-scanresult: CLEAN
X-MAILFROM: <sysadmin_oa@126.com> //发送邮件SMTP的邮箱
X-RCPTTO: <******@sdas.org>
X-FROMIP: 123.125.50.110 //发送邮件的SMTP服务器的IP,北京市联通
X-EQManager-Scaned: 1
X-Received:m50-110.126.com,123.125.50.110,20140723163845
Received: from m50-110.126.com (123.125.50.110)
by localhost with SMTP; 23 Jul 2014 08:38:45 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=126.com; //域名服务器数字签名 防止伪造域名发送垃圾邮件
s=s110527; h=MIME-Version:from:subject:Message-Id:Date; bh=d7E0W
8XWKkHJfmeJfJpA6z4IXUHGL6PMSKBntFW0WQ4=; b=CkOh1jpeyoreLs5qk41Sg
ZqEsgXfJEEo9y83736JjeUIkDYTAOafSzhWaxWVLpos4bd1mgWj60FJJN23qc0ui
MxTY6r6KX5HC6BBg8cLOu0mf73pEW/v5QhQ1Fa8jYlSJ2puO5pFg/7asJfjZ0xlL
UD5u68gPeA9drgCZLlVOqo=
Received: from [172.16.20.110] (unknown [60.208.139.35]) //山东省济南市联通
by smtp4 (Coremail) with SMTP id jdKowEBJjlPmdM9T6c_WCA--.1152S2;
Wed, 23 Jul 2014 16:40:07 +0800 (CST)
Content-Type: multipart/mixed; boundary="===============0886446980=="
MIME-Version: 1.0
to: ******@sdas.org
from: suon@sdas.org
subject: Test
X-CM-TRANSID:jdKowEBJjlPmdM9T6c_WCA--.1152S2
Message-Id:<53CF74E7.A5D465.10027@m50-110.126.com>
X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73
VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjxUvk9NDUUUU
X-Originating-IP: [60.208.139.35]
Date: Wed, 23 Jul 2014 16:40:07 +0800 (CST)
Sender: sysadmin_oa@126.com //标识了原始发送方
X-CM-SenderInfo: pv1vtv5plqs0bd6rjloofrz/1tbitQrRREX9rRLCZAAAsL
X-MT-SPAMFLAG: NO;1406104804;MT_IP_WHITELIST
--===============0886446980==
Content-Type: text/plain; charset="us-ascii" //邮件部分的内容
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
HAHA,baby, see my email, love U
--===============0886446980==--
Email格式是比较容易理解的,下面简要分析下吧:第六行和第八行显示的是邮件的真实发送方和发送的邮件服务器的IP地址;第十三行使用的是现在普遍的DKIM机制,其实就是域名密钥验证,用于防止邮件伪造域名,对于使用真实SMTP服务器的我们来说关系并不是很大,大家可以理解成一种认证发送方域名数字签名就可以了;第十九行显示了邮件最近的一个邮件服务器地址,第三十八行显示了邮件的内容部分,可以看到Type和charset参数;这里出现了MIME-Version,所谓MIME的意义在于为每个数据部分贴上标签,使得浏览器读取该部分时通过MIME标签选择合适的插件来解读这些数据,比如text可以使用记事本,pdf就使用PDF插件,等等;除了us-ascii之外另外一种常用的是base64编码,它可以将3个字节24位的数据编程4个6位的数据,每个组前两位添0,base64编码主要用于在邮件附件中嵌入二进制数据或作为HTTP协议的部分。
DKIM介绍:http://baike.baidu.com/link?url= ... Stmjz704uJMEkH-o-s_
Base64介绍:http://baike.baidu.com/view/469071.htm?fr=aladdin
************************************************************************************************************
好了,接下来说说我们的邮件发送程序吧,其核心思想是自己构造出email消息,然后通过合法邮箱的smtp服务器发送到指定目标。其中主要解决Email邮件的构造和SMTP发送问题,具体代码如下:
# -*- coding: cp936 -*-
#A Email Send Tool
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
#Define the Sender and Receiver
sender = 'test@sdas.org'
receiver = '******@sdas.org'
subject = 'Response!'
body = '你好 这是一个邮件发送的测试 收到请回复 谢谢!我的邮箱是test@sdas.com'
print 'Emial Header Initialing...'
#Build the Email Message
m = MIMEMultipart()
m['to'] = receiver
m['from'] = sender
m['subject'] = subject
m.attach(MIMEText(body, 'html', 'gb2312'))
print 'Email build...'
#Send the Email
server = smtplib.SMTP('smtp.126.com')
server.login('sysadmin_oa@126.com', '********')
server.sendmail('sysadmin_oa@126.com', receiver, m.as_string())
server.close()
print 'Email Send Success!'
raw_input('Enter for Exit...')
第一行中因为我们的代码中有中文,而Python默认的为ascii编码,因此需要指定编码方式为cp939,该编码的兼容性比gb2312还要好一些;
第三行到第五行导入了我们要使用的Python标准模块。首先构造Email消息使用的是MIMEMultipart函数添加一个MIME消息部分,然后使用MIMEText()函数将指定的字符串生成Email消息内容,最后通过smtp.SMTP建立连接发送邮件;
第八行到第十一行定义了下面要用到的Email消息的头部信息,包括发件人,收件人以及邮件主题和邮件内容等;
第十四到第十九行使用MIMEMultipart()建议一个消息对象m,然后填充该消息对象的头部信息,之后添加使用MIMEText()函数生成的消息部分,注意这里的MIMEText()指定了消息格式为'html'以及字符集为'gb2312',使用默认的'plain'格式邮件查看会出现乱码;
第二十二到第二十五行使用提前准备的测试邮箱启动SMTP服务,发送邮件,这里需要先认证发送者身份,因此使用smtp.login()方法,最后smtp.close()关闭此次连接;
运行结果如下:
:
【本节要点:
1. 邮件构造模块email;
2. 邮件消息创建:email.mime.multipart中的MIMEMultipart()创建MIME消息对象m;
3. 邮件内容填充:email.mime.text中的MIMEText(msg, 'html', 'gb2312')函数,其中还有发送邮件时的m.as_string()函数将内容转换为字符串发送;
4. 邮件发送:模块smtp;
5. smtp.SMTP('SMTP Server域名')建立连接到SMTP服务器的对象;
6. 邮件发送:server.connect()或server.login(username, passwd);
7. 邮件发送:server.sendmail('你的SMTP邮箱账号', Receiver, msg);
8. 邮件发送:server.close()关闭邮件发送对象;】
|
|
|