Python学习之Flask-Mail异步邮件发送

本文介绍了如何使用 Flask-Mail 插件在 Python web 应用中发送电子邮件,并通过多线程实现异步发送,避免请求处理过程中的延迟。

学习Pythonweb中的微型flask框架有几天了,深深的感觉flask上的插件用着非常的方便,使用起来也是非常的舒服,突然有种不想学javaweb的冲动!(东西太多了。。)

首先介绍下flask-mail:

  1. python 标准库中的smtplib 包 可以用在 flask 程序中发送电子邮件
  2. 而 flask-mail封装了smtplib 可以更好的与 Flask 框架集成起来

注意:在使用Flask-Mail发送邮件之前首先要确保你使用的邮箱中的smtp服务开启,不同邮箱的开启方法不同,这个自己百度就行,这里介绍下QQ邮箱的打开方法。


在QQ邮箱中的设置中找到账户:

这里写图片描述


在下面找到服务选项:

这里写图片描述


注意:记得保存好给你的授权码,在程序中如果尽量不要把授权码直接写入,可以保存到环境变量中使用的时候从环境中导入。


还有每个邮箱的端口也是不一样的,具体看邮箱的客户端中的设置,比如腾讯的协议如下:

这里写图片描述


具体代码如下:

import threading

from flask import Flask
from flask.ext.mail import Mail, Message

app = Flask(__name__)
app.config.update(
    DEBUG = True,
    MAIL_SERVER='smtp.qq.com',
    MAIL_PROT=465,
    MAIL_USE_TLS = True,
    MAIL_USE_SSL = False,
    MAIL_USERNAME = '邮箱地址',
    MAIL_PASSWORD = = os.environ.get('MAIL_PASSWORD'),#从系统中获取授权码
    MAIL_DEBUG = True
)

mail = Mail(app)

@app.route('/')
def index():
    send_mail()
    print('email send!!')
    return "Sent"

def send_async_email(app, msg):
    with app.app_context():
        mail.send(msg)

def send_mail():
    #sender-发件人邮箱    recipients-收件人邮箱
    msg = Message("Hi!This is a test ",sender='*********@qq.com', recipients=['*********@qq.com'])
    msg.body = "This is a first email"
    #Flask支持很多,比如附件和抄送等功能,根据需要自己添加就可以
    # msg.attach 邮件附件添加   
    # msg.attach("文件名", "类型", 读取文件)
    #     with app.open_resource("F:\2281393651481.jpg") as fp:
    #         msg.attach("image.jpg", "image/jpg", fp.read())
    thr = threading.Thread(target =send_async_email, args = [app,msg])#创建线程
    thr.start()

if __name__ == "__main__":
    app.run()

Flask-Mail 使用同步模式发送电子邮件。
从电子邮件发送开始,直到电子邮件交付后,给浏览器发回其响应,在整个过程中,Web服务器会一直阻塞。如果我们试图发送电子邮件到一个服务器是缓慢的,甚至更糟糕的,暂时处于脱机状态,所以使用多线程异步发送电子邮件可以避免处理请求过程中不必要的延迟,将发送电子邮件的函数移到后台线程中,能够使程序更加流畅!但实际上,还可以用其他的方式,比如线程和多进程模块也可以实现异步任务。
这个根据需求来具体实现。


以上就是使用flask-mail来实现异步邮件发送的一些基本内容

<think>我们使用Flask-Mail扩展来发送电子邮件。首先,确保已经安装了Flask-Mail。 安装命令:pip install Flask-Mail 以下是一个使用Flask-Mail发送邮件的简单示例。我们将创建一个Flask应用,并配置邮件服务器,然后发送一封测试邮件。 步骤: 1. 导入必要的模块。 2. 创建Flask应用实例。 3. 配置邮件服务器(如:MAIL_SERVER, MAIL_PORT, MAIL_USE_TLS, MAIL_USERNAME, MAIL_PASSWORD等)。 4. 初始化Mail对象。 5. 定义路由和视图函数,在视图函数中发送邮件。 注意:在实际使用中,请将邮箱的用户名和密码等敏感信息保存在环境变量中,不要直接写在代码里。 示例代码:</think>以下是使用 Flask-Mail 发送邮件的详细实现方案。Flask-MailFlask 的扩展库,简化了在 Flask 应用中发送邮件的流程。 ### 解决方案步骤 1. **安装依赖** 2. **配置 Flask 应用** 3. **创建邮件发送函数** 4. **编写路由触发邮件发送** #### 完整代码示例 ```python # 安装必要库 (提前执行) # pip install Flask Flask-Mail from flask import Flask from flask_mail import Mail, Message app = Flask(__name__) # 配置邮件服务器参数 (以QQ邮箱为例) app.config['MAIL_SERVER'] = 'smtp.qq.com' # 邮件服务器地址 app.config['MAIL_PORT'] = 465 # SSL端口 app.config['MAIL_USE_SSL'] = True # 启用SSL加密 app.config['MAIL_USERNAME'] = 'your_email@qq.com' # 发件邮箱 app.config['MAIL_PASSWORD'] = 'your_authorization_code' # 邮箱授权码(非登录密码) app.config['MAIL_DEFAULT_SENDER'] = 'your_email@qq.com' # 默认发件人 # 初始化Mail扩展 mail = Mail(app) # 邮件发送函数 def send_email(subject, recipients, body): msg = Message( subject=subject, # 邮件主题 recipients=recipients, # 收件人列表 body=body # 邮件正文 ) mail.send(msg) return "邮件发送成功!" # 测试路由 @app.route('/send') def trigger_email(): return send_email( subject="Flask-Mail测试邮件", recipients=["target_email@example.com"], # 替换为实际收件邮箱 body="这是一封来自Flask-Mail的测试邮件!" ) if __name__ == '__main__': app.run(debug=True) ``` ### 关键代码解释 1. **配置参数说明** - `MAIL_SERVER`: SMTP 服务器地址(QQ邮箱: `smtp.qq.com`,Gmail: `smtp.gmail.com`) - `MAIL_PORT`: 加密端口(SSL 一般为 465,TLS 为 587) - `MAIL_USE_SSL`: 启用 SSL 加密(更安全) - `MAIL_USERNAME`: 发件邮箱地址 - `MAIL_PASSWORD`: **邮箱授权码**(需在邮箱设置中生成,不是登录密码) - `MAIL_DEFAULT_SENDER`: 默认发件人(可选) 2. **核心组件** - `Mail()`: 将 Flask 应用与邮件服务绑定 - `Message()`: 创建邮件对象 - `subject`: 邮件标题 - `recipients`: 收件人列表(支持多个) - `body`: 纯文本邮件内容 - 也可用 `html` 参数发送 HTML 邮件 3. **发送流程** ```python msg = Message("标题", recipients=["收件人"]) msg.body = "文本内容" mail.send(msg) # 异步发送 ``` ### 邮箱配置注意事项 1. **获取授权码** - QQ邮箱:设置 → 账户 → 开启 POP3/SMTP → 生成授权码 - Gmail:Google 账户 → 安全性 → 应用专用密码 2. **安全建议** - 不要硬编码密码,使用环境变量: ```python import os app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD') ``` 3. **常见错误** - 端口错误:SSL 必须用 465 端口 - 未启用加密:`MAIL_USE_SSL` 或 `MAIL_USE_TLS` 需至少启用一个 - 授权码错误:确认使用授权码而非邮箱密码 ### 进阶用法 发送 HTML 邮件: ```python msg = Message("HTML邮件", recipients=["user@example.com"]) msg.html = "<h1>标题</h1><p>带样式的正文</p>" mail.send(msg) ``` 添加附件: ```python with app.open_resource("report.pdf") as fp: msg.attach("report.pdf", "application/pdf", fp.read()) ``` ### 调试技巧 1. 启用测试模式(不实际发送): ```python app.config['MAIL_SUPPRESS_SEND'] = True # 开发环境使用 ``` 2. 查看邮件内容: ```python with mail.record_messages() as outbox: send_test_email() assert len(outbox) == 1 print(outbox[0].body) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值