这篇文章主要介绍了在Python的Flask框架下收发电子邮件的教程,主要用到了Flask中的Flask-mail工具,需要的朋友可以参考下
简述
在大多数此类教程中都会不遗余力的介绍如何使用数据库。今天我们对数据库暂且不表,而是来关注另一个在web应用中很重要的特性:如何推送邮件给用户。
在某个轻量级应用中我们可能会添加一个如下的邮件服务功能:当用户有了新的粉丝后,我们发送一封邮件通知用户。有很多方法可以实现这个特性,而我们希望提供出一种可复用的通用框架来处理。
Flask-Mail介绍
对于我们来说是幸运的,现在已经有很多外部插件来处理邮件,虽说不能百分百按照我们的想法去处理,但已经相当接近了。
在虚拟环境中安装 Flask-Mail是相当简单的。Windows以外的用户可以利用以下命令来安装:
?
1 flask/bin/pip install flask-mailWindows用户的安装稍有不同,因为Flask-Mail所使用的一些模块不能再Windows系统上运行,你可以使用以下命令:
?
1 flaskScriptspip install --no-deps lamson chardet flask-mail配置:
回想一下前文中单元测试部分的案例,我们通过添加配置支持了一个这样的功能:当应用的某个版本测试出错时可以邮件通知我们。从这个例子就可以看出如何配置使用邮件支持。
再次提醒大家,我们需要设置两个方面的内容:
邮件服务器信息
用户邮箱地址
如下正是前文中所用到的配置
?
1 2 3 4 5 6 7 8 9 10 # email server MAIL_SERVER = 'your.mailserver.com' MAIL_PORT = 25 MAIL_USE_TLS = False MAIL_USE_SSL = False MAIL_USERNAME = 'you' MAIL_PASSWORD = 'your-password' # administrator list ADMINS = ['[email protected]']其中并没有设置切实可用的邮件服务器和邮箱。现在我们通过一个例子来看如何使用gmail邮箱账户来发送邮件:
?
1 2 3 4 5 6 7 8 9 10 # 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邮件服务器,发送邮件:
?
1 2 from flask.ext.mail import Mail mail = Mail(app)发个邮件试试!
为了了解flask-mail如何工作的,我们可以从命令行发一封邮件看看。进入python shell并执行如下的脚本:
?
1 2 3 4 5 6 7 >>> from flask.ext.mail import Message >>> from app import mail >>> from config import ADMINS >>> msg = Message('test subject', sender = ADMINS[0], recipients = ADMINS) >>> msg.body = 'text body' >>> msg.html = '<b>HTML</b> body' >>> mail.send(msg)上面这段代码会根据inconfig.py中配置的邮箱地址列表,以首个邮箱作为发件人给所有邮箱发送一封邮件。邮件内容会以文本和html两种格式呈现,而你能看到哪种格式取决于你的邮件客户端。
多么简单小巧!你完全可以现在就把它集成到你的应用中。
邮件框架
我们现在可以编写一个帮助函数来发送邮件。这是以上测试中一个通用版的测试。我们把这个函数放进一个新的原文件中用作邮件支持(fileapp/emails.py):
?
1 2 3 4 5 6 7 8 from flask.ext.mail import Message from app import mail def send_email(subject, sender, recipients, text_body, html_body): msg = Message(subject, sender, recipients) msg.body = text_body msg.html = html_body mail.send(msg)Flask-Mail的邮件支持超出了我们目前的使用范围,像密件抄送和附件的功能并不会在此应用中得以使用。
Follower 提醒
现在,我们已经有了发邮件的基本框架,我们可以写发送follower提醒的函数了 (fileapp/emails.py):
?
1 2 3 4 5 6 7 8 9 10 11 from flask import render_template from config import ADMINS def follower_notification(followed, follower): send_email("[microblog] %s is now following you!" % follower.nickname, ADMINS[0], [followed.email], render_template("follower_email.txt", user = followed, follower = follower), render_template("follower_email.html", user = followed, follower = follower))你在这里找到任何惊喜了吗?我们的老朋友render_template函数有一次出现了。
如果你还记得,我们使用这个函数在views渲染模版. 就像在views里写html不好一样,使用邮件模版是理想的选择。我们要可能的将逻辑和表现分开,所以email模版也会和其它试图模版一起放到在模版文件夹里.
所以,我们需要为follower提醒邮件写纯文本和网页版的邮件模版,下面这个是纯文本的版本 (fileapp/templates/follower_email.txt):
?
1 2 3 4 5 6 7 8 9 Dear {{user.nickname}}, {{follower.nickname}} is now a follower. Click on the following link to visit {{follower.nickname}}'s profile page: {{url_for("user", nickname = follower.nickname, _external = True)}} Regards, The microblog admin下面这个是网页版的邮件,效果会更好(fileapp/templates/follower_email.html):
?
1 2 3 4 5 6 7 8 9 10 11 12 13 <p>Dear {{user.nickname}},</p> <p><a href="{{url_for("user", nickname = follower.nickname, _external = True)}}">{{follower.nickname}}</a> is now a follower.</p> <table> <tr valign="top&quo