一、前言
项目需求很简单,就是用python发送告警邮件功能。本文使用163邮箱演示发送邮件,基于python email和 smtplib 包实现。这篇博客总结下学习过程和遇到的问题,以待以后再用到相同需求时,能快速解决。
二、代码:
扔一段可行的代码,先跑通再说:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
class Client:
def __init__(self):
# 邮件信息
self.server = 'smtp.163.com'
self.sender = 'send_test@163.com'
self.receiver = ['receive_test@163.com']
self.password = '123456789'
def send_mail(self, msg):
# 设置邮件内容
message = MIMEText(msg.decode('utf-8').encode('gb2312'), 'plain', 'gb2312')
message['Subject'] = 'email_test_subject'
message['From'] = self.sender
message['To'] = ','.join(self.receiver)
# 发送邮件
try:
smtp = smtplib.SMTP(self.server)
smtp.set_debuglevel(1)
smtp.login(self.sender, self.password)
smtp.sendmail(self.sender, self.receiver, message.as_string())
smtp.quit()
print "send mail succeed"
except Exception, ex:
print "send mail error : \n", ex
# 测试
if __name__ == '__main__':
msg = 'hello! 你好,我是一封邮件!'
client = Client()
client.send_mail(msg)
运行结果
截取部分的运行结果,就表示发送成功了~~
收到的邮件如下:
参数说明:
self.sender = ‘send_test@163.com’ 发件邮箱
self.receiver = [‘receive_test@163.com’] 收件邮箱
self.server = ‘smtp.163.com’ STMP服务器地址
self.password = ‘123456789’ STMP服务密码
其中STMP是发送邮件协议。STMP服务密码必须先事在发件邮箱中(本文是 send_test@163.com)开通STMP服务后并设置密码才能得到,详情可参照下一小节。
三、问题和解答
踩的最大的坑就是不知道以下代码中的参数怎么填:
smtp = smtplib.SMTP(self.server)
smtp.login(self.sender, self.password)
如果stmp服务器地址写错,有如下错误:
[Errno 61] Connection refused
如果发件箱stmp服务没开,或者密码写错,有如下错误:
smtplib.SMTPAuthenticationError: (535, 'Error: authentication failed')
解决以上两个错误,参考如下步骤:
首先,要在代码中设置 self.server = smtp.163.com。
其次,要开启163邮箱的STMP服务,点此阅读。
最后,设置smtp.login(self.sender, self.password) 参数,见上文示例代码。
四、小结和参考:
到此为止,我的需求已经基本实现了,如果读者对于Python发送邮件功能还有进一步需求,如发送附件、图片、HTML类型邮件等功能,可参阅本文文献。
1. http://stackoverflow.com/questions/6270782/how-to-send-an-email-with-python
2. http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832745198026a685614e7462fb57dbf733cc9f3ad000
3. http://www.cnblogs.com/lonelycatcher/archive/2012/02/09/2343463.html
4. http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html