您的位置:首页 > 编程语言 > Python开发

Python模块探秘之一:smtplib,实现纯文本邮件的发送

2016-10-28 10:28 1101 查看
转自:http://blog.csdn.net/marksinoberg/article/details/51501377

今天学到了如何使用Python的smtplib库发送邮件,中间也是遇到了各种各样的错误和困难,还好都一一的解决了。下面来谈一谈我的这段经历。


配置你的邮箱

为什么要配置邮箱呢?具体要配置什么呢?

因为我们申请的一些免费邮箱都是默认不开启smtp/pop协议的。 

SMTP是发邮件使用到的计算机网络中应用层协议中的一个;而POP则是收邮件时使用到的计算机网络中的应用层协议的其中一个。这都是理论性的知识了,上过计算机网络这门课的想必都知道,就不多说了。

配置就是要开启这项服务。否则我们就不能实现用Python代码来控制发送和接收邮件了。

我们在配置完成之后,系统会提示给我们一个邮箱客户端的授权码。作用就是我们登陆的时候替代原来的登陆密码。大家一定要完善保存咯。我这里采用的是163的邮箱,所以是可以自己设置这个授权码的。


使用代码发邮件

还是按照,先看代码再研究的策略。如下:
<code class="hljs python has-numbering" style="box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; padding: 0px; color: inherit; border-radius: 0px; white-space: pre; display: block; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 0, 0);"># coding:utf-8</span>

<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(0, 0, 136);">import</span> smtplib
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(0, 0, 136);">from</span> email.mime.text <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(0, 0, 136);">import</span> MIMEText
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(0, 0, 136);">from</span> email.header <span class="hljs-keyword" style="box-sizing: border-box; color: rgb(0, 0, 136);">import</span> Header

<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">"""
请确保自己的邮箱的smtp协议开启,都则会出现认证的错误的,如ssh等
"""</span>

sender = <span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">"1564086XXXX@163.com"</span>
<span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 0, 0);"># 收件人,可以是多个</span>
receivers = [<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'102170XXXX@qq.com'</span>]

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 0, 0);"># 三个参数:第一个为纯文本,第二个plain设置文本格式,第三个为编码格式</span>
message = MIMEText(<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'这里是发送的邮件的主要的内容。Pure Text Here!'</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'plain'</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'utf-8'</span>)
message[<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'From'</span>] = Header(<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'来自Mark'</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'utf-8'</span>)
message[<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'To'</span>] = Header(<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'测试标题'</span>,<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'utf-8'</span>)

subject = <span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'哈哈哈哈哈哈,这是邮件的主题 '</span>
message[<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'Subject'</span>] = Header(subject,<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'utf-8'</span>)

<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(0, 0, 136);">try</span>:
smtpObj = smtplib.SMTP()
smtpObj.connect(<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'smtp.163.com'</span>,<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 102, 102);">25</span>)
smtpObj.login(sender,<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'你的客户端授权码'</span>)
smtpObj.sendmail(sender,receivers,message.as_string())
smtpObj.quit()
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(0, 0, 136);">print</span> <span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'邮件已成功发送了'</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(0, 0, 136);">except</span> smtplib.SMTPException,e:
<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(0, 0, 136);">print</span>  e.message

</code><ul class="pre-numbering" style="box-sizing: border-box; margin: 0px; position: absolute; width: 50px; top: 0px; left: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li></ul><ul class="pre-numbering" style="box-sizing: border-box; margin: 0px; position: absolute; width: 50px; top: 0px; left: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li></ul>


测试的结果:
<code class="hljs ruby has-numbering" style="box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; padding: 0px; color: inherit; border-radius: 0px; white-space: pre; display: block; word-wrap: normal; background: transparent;"><span class="hljs-constant" style="box-sizing: border-box;">D</span><span class="hljs-symbol" style="box-sizing: border-box; color: rgb(0, 102, 102);">:</span>\<span class="hljs-constant" style="box-sizing: border-box;">Software</span>\<span class="hljs-constant" style="box-sizing: border-box;">Python2</span>\python.exe <span class="hljs-constant" style="box-sizing: border-box;">E</span><span class="hljs-symbol" style="box-sizing: border-box; color: rgb(0, 102, 102);">:/Code/Python/MyTestSet/mail/PureText</span>.py
邮件已成功发送了

<span class="hljs-constant" style="box-sizing: border-box;">Process</span> finished with exit code <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 102, 102);">0</span></code><ul class="pre-numbering" style="box-sizing: border-box; margin: 0px; position: absolute; width: 50px; top: 0px; left: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; margin: 0px; position: absolute; width: 50px; top: 0px; left: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>




确实是成功发送了的。


代码探查

下面就来深入的研究一下发送邮件实现的流程吧。我们注意到了,最最主要的是下面的这样一段代码。
<code class="hljs perl has-numbering" style="box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; padding: 0px; color: inherit; border-radius: 0px; white-space: pre; display: block; word-wrap: normal; background: transparent;">    smtpObj = smtplib.SMTP()
smtpObj.<span class="hljs-keyword" style="box-sizing: border-box; color: rgb(0, 0, 136);">connect</span>(<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'smtp.163.com'</span>,<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 102, 102);">25</span>)
smtpObj.login(sender,<span class="hljs-string" style="box-sizing: border-box; color: rgb(0, 136, 0);">'你的客户端授权码'</span>)
smtpObj.sendmail(sender,receivers,\
message.as_string()
smtpObj.quit()</code><ul class="pre-numbering" style="box-sizing: border-box; margin: 0px; position: absolute; width: 50px; top: 0px; left: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; margin: 0px; position: absolute; width: 50px; top: 0px; left: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>


不难看出,主要是经历了下面的这些流程:
获得SMTP服务
连接服务器
模拟客户端登陆
实现发送邮件

退出登录
其中核心的也就是客户端登陆和发送邮件的两个步骤。模拟登陆的时候需要注意的就是使用你自己的授权码就行了,没什么难度。而发送邮件的时候需要注意一下参数。发件人是一个,而收件人是一个列表,里面可以有很多个收件人(这样可以借助这个列表实现邮件的群发)。

其他需要注意的也就是使用MIME类型的数据,和使用utf-8编码就行了。属于非智力相关的内容。所以不用太在意。会用就可以了。

这样看来,发个邮件什么的也不是很难嘛。(^__^) 嘻嘻……


错误总结

错误一:500、530等5开头的错误,大致为什么ssh异常啊什么的。有点web常识的都知道,5开头的错误代码一般都是服务器内部的错误,所以这基本上可以判断出我们的代码其实没有出错。我们主要的排错方向应该是服务器端了(当然了,凡是没有任何的绝对,但这种情况出现的概率确实是很小的)。这时,我们要检查一下自己的邮箱的SMTP/POP服务开启了没有啊等等

错误二 :授权码没有写或者填写成了自己的邮箱之前的密码,错误提示一般都是认证相关的。这一点属于低级错误了。因为在配置完自己的SMTP/POP服务之后,系统会发还一个短信提示,告知用户要使用授权码替代原密码登陆邮箱。所以使用你的授权码进行登录呗。

错误三:代码中的错误。这就更加的不应该了,少写了必填项,或者编码没添加等类似的错误是我们应该极力避免的,所以尽量保证自己的代码的正确。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: