Python发送邮件脚本
GabrielCall
7年前
<p>在一些场景中经常需要发送邮件, 像是持续集成和运维报警等. 而使用Python脚本能够很快捷方便得实现发送各种邮件的需求.这里就通过Python基于SMTP(Simple Mail Transfer Protocol)实现一套可以群发,Html内容和附件的脚本。</p> <p>既然是要发送各种类型的邮件, 首先需要有一个邮箱.这里就以腾讯企业邮箱为例.做完一下三个准备工作之后就可以开始写脚本了。</p> <p>准备</p> <p>在设置中开启所有SMTP相关服务.</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/6da1ba8e8e94dbb512e7ba89a1e54f59.png"></p> <p>记录发送邮件服务器地址, 连接方式和端口</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/23929a2fc6ece5fee2e7729507ac07a1.png"></p> <p>新增一个授权密码并记录起来.</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/05ee39b38a92088b99de79f77ee6da5b.jpg"></p> <p>连接邮件服务器并登陆</p> <p>Python中有smtplib模块可供使用, 将它导入进来. 在发送邮件服务器地址信息那里可以看到连接有两种方式, 一种是普通连接, 一种是经过加密的连接. 在脚本中就根据需求去构建两种不同的链接对象. 通过邮件服务器地址这里的server_host也就是smtp.exmail.qq.com和默认的服务器端口(SMTP方式默认使用25端口而SMTP_SSL就是默认使用465端口, 通常邮件服务器都是可以使用默认端口的)建立与邮件服务器之间的连接. 并通过邮箱账户和上面第三步中设置的授权密码登录邮箱服务器. 没有异常信息的话就连接邮件服务器并登录成功了.</p> <p><img src="https://simg.open-open.com/show/176c0d99a7f150e6bc320ae46f6c3ee0.png"></p> <p>发送文本邮件</p> <p>发送邮件之前先验证一下当前是否已经登录到邮件服务器. 再通过email模块中的MIMEText构建出包含发件人, 收件人列表, 邮件标题和邮件内容的消息体.因为这里是发送文本内容的邮件, 所以content_type是plain.</p> <p><img src="https://simg.open-open.com/show/0810ec14bfe7420c4e2201a998f5128e.png"></p> <p>构建完消息体之后就可以直接调用SMTP的sendmail方法, 将消息体从发件方发送到收件列表中的收件邮箱中去.</p> <p><img src="https://simg.open-open.com/show/8957a7898695433d4fbc3a0b2363b560.png"></p> <p>发送Html邮件</p> <p>如果发送普通文本邮件成功了, 那么想要发送html内容的邮件就很简单了, 稍微改一下上面的代码给content_type多一种html的选择就可以了. 通过外部的参数控制构建消息体是纯文件内容还是html内容. 这样就可以使用一些html模板来发送固定格式的邮件.</p> <p><img src="https://simg.open-open.com/show/1a15e925e493e25dfcae1cd4717c93df.png"></p> <p>发送附件</p> <p>首先从email模块中引入MIMEMultipart. 从这个MIME扩展类的名字也可以看出它的作用是可以构建多个MIME的消息体, 并将它们装配起来.继续修改前面的代码. 根据发件人, 收件人列表和邮箱标题构建出多MIME实例.</p> <p><img src="https://simg.open-open.com/show/f14babb48cd6143abaa1adb9094251cc.png"></p> <p>接着根据参数决定构建纯文本还是Html内容的消息体, 将该包含邮件内容的消息体装载进上面初始化过的multi_msg中. 完成邮件内容部分的填充.</p> <p><img src="https://simg.open-open.com/show/bba8949a7042b164149d140698123cd9.png"></p> <p>完成代码改造之后就要加入对附件的支持, 遍历外部传入的文件列表, 并根据文件构建出包含附件的消息体, 将其依次装载进multi_msg中.</p> <p><img src="https://simg.open-open.com/show/64856e401967f72a3ac5ca94de18ed57.png"></p> <p>打开遍历文件列表时拿到附件, 将其初始化为MIME消息体, 并且设置附件的文件属性和附件的名字.</p> <p><img src="https://simg.open-open.com/show/308b22f394dce15572230e09248c1962.png"></p> <p>汇总</p> <p>功能代码完成之后再通过getopt构建出来外部参数指令, 方便外部调用脚本.</p> <p><img src="https://simg.open-open.com/show/28ee17e06de0a3aa1aa5c65533b675c5.png"></p> <p>执行脚本</p> <p><img src="https://simg.open-open.com/show/190e801e50990788f8b448fe14287e99.png"></p> <p>收到群发带附件的邮件</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/225267a207ffa390487ff612918081de.jpg"></p> <p> </p> <p>来自:http://developer.51cto.com/art/201704/538117.htm</p> <p> </p>