Python Flask框架基础(六)电子邮件

方式一:使用Flask-Mail

web程序发送电子邮件借助Flask-Mail扩展只需要几行代码就可以实现。

Flask-Mail库包装了Python标准库中的smtplib包,简化了在Flask程序中发送电子邮件的过程。

首先要实例化Mail类,并传入程序实例以完成初始化。

from flask_mail import Mail

app = Flask(__mail__)

mail = Mail(app)

配置Flask-Mail

flask-mail通过连接SMTP服务器来发送邮件,因此在开始发送邮件前需要配置SMTP服务器。常用的Flask-Mail配置变量如下表。

配置变量说明
MAIL_SERVER用于发送邮件的SMTP服务器
MAIL_PORT发信端口
MAIL_USE_TLS是否使用startTLS
MAIL_USE_SSL是否使用SSL/TLS
MAIL_USERNAME发信服务器的用户名
MAIL_PASSWORD发信服务器的密码
MAIL_DEFAULT_SENDER默认的发信人

随着配置项增多,改用app.config对象的update方法来加载配置,如下代码所示。

import os
from flask import Flask
from flask_mail import Mail

app = Flask(__name__)

app.config.update(
    ...
    MAIL_SERVER=os.getenv('MAIL_SERVER"),
    MAIL_PORT=581, 
    MAIL_USE_TLS=True,
    MAIL_USERNAME=os.getenv('MAIL _USERNAME'),
    MAIL_PASSWORD=os.getenv('MAIL_PASSWORD'),
    MAIL_DEFAULT_SENDER= ('Grey Li', os.getenv ("MATI_USERNAME")
    )

mail = Mail(app)

由于邮箱账户密码属于敏感信息,不能直接写在脚本中,所以设置为在系统环境变量中获取。这些环境变量可以存储在.env文件中。

构建邮件数据

邮件通过从Flask-Mail中倒入的Message类来表示。邮件至少要包含主题、收件人、正文、发信人这几个元素。发信人(sender)在前面我们已经使用 MAIL_DEFAULT_SENDER 配置变量指定过了,剩下的分别通过 Message 类的构造方法中的subject、recipients、body 关键字传入参数,其中 recipients 为一个包含电子邮件地址的列表。

>>> message = Message(subject='Hello, World',recipients='Zorn <zorn@example. com>'], body='Across the Great Wall we can reach every corner in the world.'

发送邮件

通过对 mail 对象调用send()方法,传人我们在上面构建的邮件对象即可发送邮件:

>>> mail.send (message)

为了方便重用,我们把这些代码包装成一个通用的发信函数send_mail(),如代码所示。

from flask
mail import Mail, Message
...
mail = Mail(app)
...
def send_mail (subject, to, body):
    message = Message(subject, recipients=[to], body=body)
    mail.send(message)

在视图函数中发送邮件代码示例。


@app. route ('/subscribe', methods= [ 'GET', 'POST' ])
def subscribe () :
       form = SubscribeForm()
       if form. validate_on_submit():
       email = form.email.data
       flash('Welcome on board!')
       send_email('Subscribe Success' , email, 'hello thank you!')
       return redirect (url_for ('index') )

return render_template ('index.html', form=form)

方式二:使用SendGrid Web API转发

和使用SMTP服务器发送邮件相比,使用Web API发送邮件更加安全,而且省去了建立SMTP连接的繁琐过程,因此速度更快,尤其发送大批量邮件的情况下。

当使用SendGrid Web API发送邮件时,我们只需要在程序中向SendGrid提供的Web API发出一个POST请求,并附带必要的信息,比如密钥、邮件主题、收件人、正文等,SendGrid就会为我们发送邮件。

首先使用pipenv安装这个接口库:

pipenv install sendgrid

创建发信对象

首先实例化SendGridAPIClient类创建一个发信客户端对象:

import os
import sendgrid
from sendgrid.helpers.mail import *

sg = sendgrid.SendGridAPIClient(os.getenv('SENDGRID_API_KEY'))

SENDGRID_API_KEY需要我们在SendGrid官网注册一个免费账户,然后申请一个API密钥。这个API密钥的值就是SENDGRID_API_KEY,作为发信账户的密码。

构建邮件数据

Email、Content、Mail三个函数来自于上面导入的sendgrid.helpers.mail库。

from_email = Email('xxxxxx123@xxx.com')
to_email = Eamil('xxxxxx456@xxx.com')
subject = 'hello world!'
content = Content('text/plain','Across the Great Wall we can reach every corner.')

#生成邮件对象mail
mail = Mail(from_email,subject,to_email,content) 

发送邮件

通过对表示邮件客户端的sg对象调用sg.client.mail.send.post()方法,并将表示数据的字典使用关键字request_body传入即可发送发信的POST请求。发信的方法会返回响应,我们可以查看响应内容。

response = sg.client.mail.send.post(request_body = mail.get())

print(response.status_code)
print(response.body)
print(response.headers)

参考资料:《Flask Web开发实战入门、进阶与原理解析》李辉 著

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值