当梦想照进现实

Python smtplib发送邮件

2014.03.31

孤单的三爷

背景

做SEO会涉及很多数据,旁边NB的同事用公司的VPS实现了简单的自动化SEO数据监控系统,用来监控每天的抓取数据,并用formail发送邮件,然后用gmail筛选条件转发给我。但后来忽然发现收不到邮件了(可能跟伪造发件邮箱有关),并且有些频道需要自己去设置,于是就打算自己搞一下。formail不会用,python还算会一点,于是就瞅上了smtplib。

代码

其实smtplib很简单,发送常规邮件的核心代码也只有3,4行。完整代码请见:

#coding:utf-8
import smtplib  
from email.mime.text import MIMEText  # 引入smtplib和MIMEText

host = 'smtp.163.com'  # 设置发件服务器地址
port = 25  # 设置发件服务器端口号。注意,这里有SSL和非SSL两种形式
sender = 'alexkh3@163.com'  # 设置发件邮箱,一定要自己注册的邮箱
pwd = 'XXXXXX'  # 设置发件邮箱的密码,等会登陆会用到
receiver = 'zhangyanan2@tuniu.com' # 设置邮件接收人,这里是我的公司邮箱
body = '<h1>Hi</h1><p>test</p>' # 设置邮件正文,这里是支持HTML的

msg = MIMEText(body, 'html') # 设置正文为符合邮件格式的HTML内容
msg['subject'] = 'Hello world' # 设置邮件标题
msg['from'] = sender  # 设置发送人
msg['to'] = receiver  # 设置接收人

s = smtplib.SMTP(host, port)  # 注意!如果是使用SSL端口,这里就要改为SMTP_SSL
s.login(sender, pwd)  # 登陆邮箱
s.sendmail(sender, receiver, msg.as_string())  # 发送邮件!

print 'over'  # 发送成功就会提示

其实核心代码也就3行,其他都是固定设置:

s = smtplib.SMTP(host, port)
s.login(sender, pwd)
s.sendmail(sender, receiver, msg.as_string())

另外注意下,如果是使用SSL发送,需要使用SMTP_SSL,其他都是一样的(这是个坑,之前搞了好久都不成功,后来才发现是这个问题)。

升级

当初搞了3个脚本,每个脚本里面都有一坨这些代码,于是想到了封装。只要封装一下,以后再使用的时候只需要import+一行代码就可以了。于是就有了下面的代码:

def sm(receiver, title, body):
        host = 'smtp.163.com'
        port = 25
        sender = 'alexkh3@163.com'
        pwd = 'XXXXXX'

        msg = MIMEText(body, 'html')
        msg['subject'] = title
        msg['from'] = sender
        msg['to'] = receiver

        s = smtplib.SMTP(host, port)
        s.login(sender, pwd)
        s.sendmail(sender, receiver, msg.as_string())

        print 'The mail named %s to %s is sended successly.' % (title, receiver)

这样以后只要import进来,然后sm(receiver, title, body)就OK了。

附表 - 常用邮箱发件服务器及端口

邮箱品牌 发件服务器 非SSL协议端口 SSL协议端口
163 smtp.163.com 25 465/587
gmail smtp.gmail.com - 465
qq smtp.qq.com 25 465/587

后记

  1. 好久没发博了,markdown和farbox的语法都忘了,惭愧啊;
  2. 家里装修,加上工作忙乱,一直没发文;另一方面也不知道写啥,好像忽然没了信心;
  3. 希望以后能多分享点,虽然很初级,但自己水平就是这样啊;
  4. 因为没有附件,所以代码部分很简单,如果带了附件,推荐下Envelope,描述里说是Mailing for human beings(模仿requests)。
Comments
Write a Comment