Python【十四】:雏形-邮件发送程序

1700阅读 0评论2014-07-28 godymoon
分类:Python/Ruby

     自己的邮箱经常收到垃圾邮件,即便是最先进的反垃圾邮件引擎也无法保证完美的拦截率。于是自己对于邮件的发送接收产生了兴趣,正好刚学了Python,看到其有丰富的Internet应用包,于是赶紧来试试吧!自己用了两天时间写了一个发送邮件的小程序,只能说是一个雏形吧,没有交互界面,功能也不完善,但是还是学到了不少东西,下面先简单补充下email中可能用到的知识,然后讲解下我们的代码。
   想要了解Email,最好的方法莫过于分析一个Email文件了,这里截取了一个测试的邮件,做下简单的分析:

点击(此处)折叠或打开

  1. Received: from mail.sdas.org (unknown [172.16.1.9])
  2.     by mail.sdas.org (AnyMacro(G7)) with SMTP id D2A8210009D
  3.     for <******@sdas.org>; Wed, 23 Jul 2014 16:40:04 +0800 (HKT)
  4. X-scanvirus: By EQAVSE AntiVirus Engine
  5. X-scanresult: CLEAN
  6. X-MAILFROM: <sysadmin_oa@126.com> //发送邮件SMTP的邮箱
  7. X-RCPTTO: <******@sdas.org>
  8. X-FROMIP: 123.125.50.110 //发送邮件的SMTP服务器的IP,北京市联通
  9. X-EQManager-Scaned: 1
  10. X-Received:m50-110.126.com,123.125.50.110,20140723163845
  11. Received: from m50-110.126.com (123.125.50.110)
  12.   by localhost with SMTP; 23 Jul 2014 08:38:45 -0000
  13. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=126.com; //域名服务器数字签名 防止伪造域名发送垃圾邮件
  14.     s=s110527; h=MIME-Version:from:subject:Message-Id:Date; bh=d7E0W
  15.     8XWKkHJfmeJfJpA6z4IXUHGL6PMSKBntFW0WQ4=; b=CkOh1jpeyoreLs5qk41Sg
  16.     ZqEsgXfJEEo9y83736JjeUIkDYTAOafSzhWaxWVLpos4bd1mgWj60FJJN23qc0ui
  17.     MxTY6r6KX5HC6BBg8cLOu0mf73pEW/v5QhQ1Fa8jYlSJ2puO5pFg/7asJfjZ0xlL
  18.     UD5u68gPeA9drgCZLlVOqo=
  19. Received: from [172.16.20.110] (unknown [60.208.139.35]) //山东省济南市联通
  20.     by smtp4 (Coremail) with SMTP id jdKowEBJjlPmdM9T6c_WCA--.1152S2;
  21.     Wed, 23 Jul 2014 16:40:07 +0800 (CST)
  22. Content-Type: multipart/mixed; boundary="===============0886446980=="
  23. MIME-Version: 1.0
  24. to: ******@sdas.org
  25. from: suon@sdas.org
  26. subject: Test
  27. X-CM-TRANSID:jdKowEBJjlPmdM9T6c_WCA--.1152S2
  28. Message-Id:<53CF74E7.A5D465.10027@m50-110.126.com>
  29. X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73
  30.     VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjxUvk9NDUUUU
  31. X-Originating-IP: [60.208.139.35]
  32. Date: Wed, 23 Jul 2014 16:40:07 +0800 (CST)
  33. Sender: sysadmin_oa@126.com //标识了原始发送方
  34. X-CM-SenderInfo: pv1vtv5plqs0bd6rjloofrz/1tbitQrRREX9rRLCZAAAsL
  35. X-MT-SPAMFLAG: NO;1406104804;MT_IP_WHITELIST

  36. --===============0886446980==
  37. Content-Type: text/plain; charset="us-ascii" //邮件部分的内容
  38. MIME-Version: 1.0
  39. Content-Transfer-Encoding: 8bit

  40. HAHA,baby, see my email, love U
  41. --===============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介绍:
Base64介绍:

************************************************************************************************************
   
   好了,接下来说说我们的邮件发送程序吧,其核心思想是自己构造出email消息,然后通过合法邮箱的smtp服务器发送到指定目标。其中主要解决Email邮件的构造和SMTP发送问题,具体代码如下:

点击(此处)折叠或打开

  1. # -*- coding: cp936 -*-
  2. #A Email Send Tool
  3. import smtplib
  4. from email.mime.text import MIMEText
  5. from email.mime.multipart import MIMEMultipart

  6. #Define the Sender and Receiver
  7. sender = 'test@sdas.org'
  8. receiver = '******@sdas.org'
  9. subject = 'Response!'
  10. body = '你好 这是一个邮件发送的测试 收到请回复 谢谢!我的邮箱是test@sdas.com'
  11. print 'Emial Header Initialing...'
  12. #Build the Email Message
  13. m = MIMEMultipart()
  14. m['to'] = receiver
  15. m['from'] = sender
  16. m['subject'] = subject

  17. m.attach(MIMEText(body, 'html', 'gb2312'))
  18. print 'Email build...'
  19. #Send the Email
  20. server = smtplib.SMTP('smtp.126.com')
  21. server.login('sysadmin_oa@126.com', '********')
  22. server.sendmail('sysadmin_oa@126.com', receiver, m.as_string())
  23. server.close()
  24. print 'Email Send Success!'
  25. 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()关闭邮件发送对象;】


上一篇:linux高级技巧:集群的搭建(一)
下一篇:linux高级技巧:heartbeat+lvs(一)