英文博客地址:blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xi-email-support
中文翻译地址:http://www.pythondoc.com/flask-mega-tutorial/email.html
开源中国社区:http://www.oschina.net/translate/the-flask-mega-tutorial-part-xi-email-support
对于我们这个应用,我们可能想要有这样的功能,当有一个新的关注者的时候,发一封邮件给用户。
幸运地,Flask 已经存在处理邮件的扩展,尽管不是 100% 支持我们想要的功能,但是已经很好了。
在前面我们就已经安装了Flask-Mail,安装命令为:
flask/bin/pip install flask-mail
一、配置
需要设置两个方面的内容:
- 邮件服务器信息
- 用户邮箱地址
# email server MAIL_SERVER = ‘your.mailserver.com‘ MAIL_PORT = 25 MAIL_USERNAME = None MAIL_PASSWORD = None # administrator list ADMINS = [‘[email protected]‘]
上面是之前的代码,其中并没有设置切实可用的邮件服务器和邮箱。现在我们通过一个例子来看如何使用gmail邮箱账户来发送邮件:
# email server MAIL_SERVER = ‘smtp.googlemail.com‘ MAIL_PORT = 465 MAIL_USE_TLS = False MAIL_USE_SSL = True MAIL_USERNAME = os.environ.get(‘MAIL_USERNAME‘) MAIL_PASSWORD = os.environ.get(‘MAIL_PASSWORD‘) # administrator list ADMINS = [‘[email protected]‘]
Note: We are not going to enhance the server setup to allow those that require an encrypted communication through TLS or SSL.
(大概意思应该是:我们不会提高服务器设置,让那些需要加密通信的通过TLS或者SSL)
上面的代码是要求把用户名和密码写到环境变量中,再从环境变量中读取,这样会比较安全。不过我暂时不会怎么把信息写入环境变量,所以暂时还是直接写入源码了:
# email server MAIL_SERVER = ‘smtp.googlemail.com‘ MAIL_PORT = 465 MAIL_USE_TLS = False MAIL_USE_SSL = True MAIL_USERNAME = ‘your-gmail-username‘ MAIL_PASSWORD = ‘your-gmail-password‘ # administrator list ADMINS = [‘[email protected]‘]
我们也需要初始化一个 Mail 对象,这个对象为我们连接到 SMTP 服务器并且发送邮件(文件 app/__init__.py):
from flask.ext.mail import Mail mail = Mail(app)
然后试一下发邮件:
>>> from flask.ext.mail import Message >>> from app import app, mail >>> from config import ADMINS >>> msg = Message(‘test subject‘, sender=ADMINS[0], recipients=ADMINS) >>> msg.body = ‘text body‘ >>> msg.html = ‘<b>HTML</b> body‘ >>> with app.app_context(): ... mail.send(msg) ....
然后发现忧桑地被墙了,暂时找不到解决办法,错误代码:
socket.error: [Errno 101] Network is unreachable
使用gmail不成功我就改QQ邮箱试一下了。
# mail server settings MAIL_SERVER = ‘smtp.qq.com‘ MAIL_PORT = 587 MAIL_USE_TLS = True MAIL_USE_SSL = False MAIL_USERNAME = ‘your-gmail-username‘ MAIL_PASSWORD = ‘your-gmail-password‘ # administrator list ADMINS = [‘your-gmail-username@qq.com‘]
改成QQ邮箱出现错误:
raise SMTPAuthenticationError(code, resp) smtplib.SMTPAuthenticationError: (454, ‘Authentication failed, please open smtp flag first!‘)
原因是我没有开启POP3/SMTP服务
解决方法:在QQ邮箱的设置里面,找到账户-》POP3/IMAP/SMTP选择开启POP3/SMTP服务
smtplib.SMTPAuthenticationError: (535, ‘Authentication failed‘)
上面的错误是说我验证失败了,因为我刚才开启了POP3/SMTP服务,需要有一个独立密码,而我一开始用的是我的QQ密码。
改正了密码之后就可以了。
备注:因为我不断在修改配置文件,所以我就把命令行的代码直接放到一个test.py文件里面了:
#!flask/bin/python from flask.ext.mail import Message from app import app, mail from config import ADMINS msg = Message(‘test subject‘, sender=ADMINS[0], recipients=ADMINS) msg.body = ‘text body‘ msg.html = ‘<b>HTML</b> body‘ with app.app_context(): mail.send(msg)