背景
做SEO会涉及很多数据,旁边NB的同事用公司的VPS实现了简单的自动化SEO数据监控系统,用来监控每天的抓取数据,并用formail发送邮件,然后用gmail筛选条件转

mail python
发给我。但后来忽然发现收不到邮件了(可能跟伪造发件邮箱有关),并且有些频道需要自己去设置,于是就打算自己搞一下。formail不会用,python还算会一点,于是就瞅上了smtplib。
代码
其实smtplib很简单,发送常规邮件的核心代码也只有3,4行。完整代码请见:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<span class="c">#coding:utf-8</span> <span class="kn">import</span> <span class="nn">smtplib</span> <span class="kn">from</span> <span class="nn">email.mime.text</span> <span class="kn">import</span> <span class="n">MIMEText</span> <span class="c"># 引入smtplib和MIMEText</span> <span class="n">host</span> <span class="o">=</span> <span class="s">'smtp.163.com'</span> <span class="c"># 设置发件服务器地址</span> <span class="n">port</span> <span class="o">=</span> <span class="mi">25</span> <span class="c"># 设置发件服务器端口号。注意,这里有SSL和非SSL两种形式</span> <span class="n">sender</span> <span class="o">=</span> <span class="s">'alexkh3@163.com'</span> <span class="c"># 设置发件邮箱,一定要自己注册的邮箱</span> <span class="n">pwd</span> <span class="o">=</span> <span class="s">'XXXXXX'</span> <span class="c"># 设置发件邮箱的密码,等会登陆会用到</span> <span class="n">receiver</span> <span class="o">=</span> <span class="s">'zhangyanan2@tuniu.com'</span> <span class="c"># 设置邮件接收人,这里是我的公司邮箱</span> <span class="n">body</span> <span class="o">=</span> <span class="s">'<h1>Hi</h1><p>test</p>'</span> <span class="c"># 设置邮件正文,这里是支持HTML的</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">MIMEText</span><span class="p">(</span><span class="n">body</span><span class="p">,</span> <span class="s">'html'</span><span class="p">)</span> <span class="c"># 设置正文为符合邮件格式的HTML内容</span> <span class="n">msg</span><span class="p">[</span><span class="s">'subject'</span><span class="p">]</span> <span class="o">=</span> <span class="s">'Hello world'</span> <span class="c"># 设置邮件标题</span> <span class="n">msg</span><span class="p">[</span><span class="s">'from'</span><span class="p">]</span> <span class="o">=</span> <span class="n">sender</span> <span class="c"># 设置发送人</span> <span class="n">msg</span><span class="p">[</span><span class="s">'to'</span><span class="p">]</span> <span class="o">=</span> <span class="n">receiver</span> <span class="c"># 设置接收人</span> <span class="n">s</span> <span class="o">=</span> <span class="n">smtplib</span><span class="o">.</span><span class="n">SMTP</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span> <span class="c"># 注意!如果是使用SSL端口,这里就要改为SMTP_SSL</span> <span class="n">s</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">pwd</span><span class="p">)</span> <span class="c"># 登陆邮箱</span> <span class="n">s</span><span class="o">.</span><span class="n">sendmail</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">msg</span><span class="o">.</span><span class="n">as_string</span><span class="p">())</span> <span class="c"># 发送邮件!</span> <span class="k">print</span> <span class="s">'over'</span> <span class="c"># 发送成功就会提示</span> |
其实核心代码也就3行,其他都是固定设置:
1 2 3 |
<span class="n">s</span> <span class="o">=</span> <span class="n">smtplib</span><span class="o">.</span><span class="n">SMTP</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span> <span class="n">s</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">pwd</span><span class="p">)</span> <span class="n">s</span><span class="o">.</span><span class="n">sendmail</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">msg</span><span class="o">.</span><span class="n">as_string</span><span class="p">())</span> |
另外注意下,如果是使用SSL发送,需要使用SMTP_SSL
,其他都是一样的(这是个坑,之前搞了好久都不成功,后来才发现是这个问题)。
升级
当初搞了3个脚本,每个脚本里面都有一坨这些代码,于是想到了封装。只要封装一下,以后再使用的时候只需要import+一行代码就可以了。于是就有了下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="k">def</span> <span class="nf">sm</span><span class="p">(</span><span class="n">receiver</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">body</span><span class="p">):</span> <span class="n">host</span> <span class="o">=</span> <span class="s">'smtp.163.com'</span> <span class="n">port</span> <span class="o">=</span> <span class="mi">25</span> <span class="n">sender</span> <span class="o">=</span> <span class="s">'alexkh3@163.com'</span> <span class="n">pwd</span> <span class="o">=</span> <span class="s">'XXXXXX'</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">MIMEText</span><span class="p">(</span><span class="n">body</span><span class="p">,</span> <span class="s">'html'</span><span class="p">)</span> <span class="n">msg</span><span class="p">[</span><span class="s">'subject'</span><span class="p">]</span> <span class="o">=</span> <span class="n">title</span> <span class="n">msg</span><span class="p">[</span><span class="s">'from'</span><span class="p">]</span> <span class="o">=</span> <span class="n">sender</span> <span class="n">msg</span><span class="p">[</span><span class="s">'to'</span><span class="p">]</span> <span class="o">=</span> <span class="n">receiver</span> <span class="n">s</span> <span class="o">=</span> <span class="n">smtplib</span><span class="o">.</span><span class="n">SMTP</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span> <span class="n">s</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">pwd</span><span class="p">)</span> <span class="n">s</span><span class="o">.</span><span class="n">sendmail</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">msg</span><span class="o">.</span><span class="n">as_string</span><span class="p">())</span> <span class="k">print</span> <span class="s">'The mail named </span><span class="si">%s</span><span class="s"> to </span><span class="si">%s</span><span class="s"> is sended successly.'</span> <span class="o">%</span> <span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">receiver</span><span class="p">)</span> |
这样以后只要import进来,然后sm(receiver, title, body)就OK了。
附表 - 常用邮箱发件服务器及端口
邮箱品牌 | 发件服务器 | 非SSL协议端口 | SSL协议端口 |
---|---|---|---|
163 | smtp.163.com | 25 | 465/587 |
gmail | smtp.gmail.com | - | 465 |
smtp.qq.com | 25 | 465/587 |
后记
- 好久没发博了,markdown和farbox的语法都忘了,惭愧啊;
- 家里装修,加上工作忙乱,一直没发文;另一方面也不知道写啥,好像忽然没了信心;
- 希望以后能多分享点,虽然很初级,但自己水平就是这样啊;
- 因为没有附件,所以代码部分很简单,如果带了附件,推荐下Envelope,描述里说是
Mailing for human beings
(模仿requests)。
