前言
很久很久没写东西了,可以说最近很忙也可以说最近并没有想象中的那么忙,但人总会有些惰性的心理作祟经常告诉自己“我很忙”。不过拖木小鱼(我们家养的一只猫)的福,这个五一只能老老实实待在家里照顾她,于是清闲的想写些东西了。不论是为了给自己做个总结还是作为一个过来人给后人留下一些有用的东西,有些东西“应该”写出来。
最近因为“工作需要”,从PHP转投Python了大军。一开始确实会让人很多不习惯的地方,比如if为什么后面就需要“(){}”了,比如为什么数组好端端的就变成了dic、list、tuple,比如……还有很多很多,虽然PHP已经算是很不正经的脚本语言了,但和Python比起来瞬间感觉正经了很多。但不管怎么说Python确实是一门值得学习的语言,正所谓“人生苦短,我用Python”。
这是一个基于SMTP协议发送邮件的逻辑流程以及Python代码实现。

正题
 邮件的主要逻辑流程
一、格式化邮件数据
(1)编码格式的选择:Unicode和UTF-8的区别与选择请自行百度,但为了冲出亚洲走向全世界,别用GBK2312之类的编码格式;
(2)邮件类型的选择:包括纯邮件类型和带附件的邮件类型,而纯邮件类型又会分为普通的文本邮件和html格式的邮件等等;
(3)格式化收件人发件人邮件地址:为了安全格式化邮件地址避免出现攻击性的字符,存在多个收件人时格式化成特定的格式等等;
(4)将附件转换成可以用于传输的base64数据。
注意:为了邮件的安全性邮件服务提供商一般都会屏蔽html格式中的图片显示,譬如:<img src=”http://www.mudoom.com/xxx.jpg” />这样的图片显示会被屏蔽,此时通过将图片作为邮件附件并修改img中src为图片ID的方式,譬如:<Img src=’cid:xxx.jpg’>,即可在邮件中直接显示图片。

二、开启和邮件服务器之间的SMTP连接
(1)客户端请求邮件服务器创建SMTP连接(say hello):如果没有特别的原因最好都使用SSL进行请求(实际测试中发现qq邮箱虽然说明了必须使用SSL,但在非SSL的请求依然能够成功发送邮件),互联网是一个不那么安全的环境;
(2)邮件服务器响应请求,和客户端间创建一条连接,等待处理客户端传输过来的数据;

三、用邮件账户的账号密码登录
(1)客户端向邮件服务器发送邮箱账号密码进行登录:如果是本地自己搭建的邮件服务器而又允许不使用账号密码则可以不发送登录请求。

四、发送邮件数据
(1)使用TCP发送邮件数据
拓展:Google最近曝光率挺高用于既有TCP稳定性又有UDP高速性的QUIC,或许会成为下一代TCP/UDP的方向。

五、关闭和邮件服务器的SMTP连接
(1)邮件发送完毕后客户端向邮件服务器发送关闭连接请求(End):虽然邮件服务器会有默认的等待时间,超出等待时间后会自动关闭连接,但为了更合理的利用邮件服务器的资源,在邮件传输结束的时候应该主动发送关闭请求。

Python代码实现
基于smtplib包制作而成,但在实践中发现一个不知道算不算是smtplib留的一个坑,在网络断开的情况下发送邮件时会抛出一个socket.gaierror的异常,但是smtplib中并没有捕获这个异常,导致程序会因这个异常终止,因此代码中针对这部分的异常进行处理,确保不会异常终止。
话不多说,直接上代码:
github地址:https://github.com/ZoaChou/Python-learn/blob/master/application/controller/mailer.py
欢迎各种形式的留言和交流 :)

Please,喜欢使用爬虫直接抓文章的站长以及简单复制粘贴又不注明出处的copyer请尊重文章作者的著作权,如需转载请邮件征得作者(Zoa Chou)同意,谢谢。
End,给自己一个近期任务:完善并公开本站的所有源码(使用PHP,基于ThinkPHP),方便coder交流学习 :)