大家好,我是python网页后端flask的讲师geo
Flask-Mail 是一个 Flask 扩展,用于在 Flask 应用程序中发送电子邮件。
Flask-Mail 基本教学
安装
首先,您需要安装 Flask 和 Flask-Mail:
pip install Flask Flask-Mail
配置 Flask 应用程序
要在您的 Flask 应用程序中使用 Flask-Mail,您需要进行一些配置。这些配置通常放在您的应用配置中(例如 config.py 或直接在应用工厂中)。
以下是使用 Gmail 作为邮件服务器的常见配置(请注意,对于 Gmail,您可能需要启用“IMAP 访问”并使用“应用密码”而不是常规密码,以避免 SMTPAuthenticationError):
from flask import Flask
app = Flask(__name__)
# --- 邮件配置 ---
app.config['MAIL_SERVER'] = 'smtp.gmail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True # 使用 TLS 加密
app.config['MAIL_USERNAME'] = '您的Gmail邮箱地址' # 例如:'your_email@gmail.com'
app.config['MAIL_PASSWORD'] = '您的应用密码或常规密码' # 推荐使用Gmail应用密码
app.config['MAIL_DEFAULT_SENDER'] = '您的Gmail邮箱地址' # 默认发件人
# --- 邮件配置结束 ---
from flask_mail import Mail
mail = Mail(app)
注意:
- 安全性:将敏感信息(如
MAIL_PASSWORD)直接放在代码中是不安全的。在实际项目中,应使用环境变量或配置文件来存储。 - Gmail 特殊要求:Gmail 对通过第三方应用发送邮件有严格要求。通常需要:
- 启用 IMAP (在 Gmail 设置的“转发和 POP/IMAP”中)。
- 使用应用密码(如果您启用了两步验证)。
发送电子邮件
配置完成后,您可以使用 mail.send() 方法来发送邮件。
from flask import Flask
from flask_mail import Mail, Message
# ... (您的应用配置和 mail 对象的初始化,如上所示) ...
# 示例路由:发送一封邮件
@app.route('/send_test_email')
def send_test_email():
try:
msg = Message(
subject="测试邮件 Flask-Mail", # 邮件主题
recipients=["收件人邮箱地址"], # 收件人列表
body="这是一封使用 Flask-Mail 发送的纯文本测试邮件。" # 纯文本内容
# html="<h1>这是一封HTML邮件</h1>" # 如果需要发送HTML内容,使用 html 参数
)
# 可选:如果你没有设置 MAIL_DEFAULT_SENDER,可以在这里指定
# msg.sender = "另一个邮箱地址"
mail.send(msg)
return "邮件发送成功!"
except Exception as e:
return f"邮件发送失败: {e}"
if __name__ == '__main__':
app.run(debug=True)
关键组件解释
| 组件 | 描述 |
|---|---|
Flask-Mail |
Flask 扩展本身。 |
Mail(app) |
初始化 Flask-Mail 扩展,将其与您的 Flask 应用关联。 |
Message |
用于创建邮件对象。您需要设置 subject(主题)、recipients(收件人列表)和 body(纯文本内容)或 html(HTML 内容)。 |
mail.send(msg) |
实际发送邮件的函数。 |
好的,发送 HTML 格式的邮件 相对简单,只需要在创建 Message 对象时,使用 html 参数代替或与 body 参数一起使用即可。
当您同时提供 body (纯文本) 和 html (HTML 内容) 时,收件人的邮件客户端会选择最佳的显示方式。这是最佳实践,因为它可以确保即使收件人的客户端不支持 HTML 渲染,也能看到纯文本内容。
发送 HTML 邮件示例
下面是一个完整的示例,展示了如何配置和发送一封包含 HTML 格式内容的邮件:
from flask import Flask
from flask_mail import Mail, Message
# 1. 初始化和配置应用
app = Flask(__name__)
# --- 邮件配置 (假设使用 Gmail) ---
app.config['MAIL_SERVER'] = 'smtp.gmail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = '您的Gmail邮箱地址'
app.config['MAIL_PASSWORD'] = '您的应用密码'
app.config['MAIL_DEFAULT_SENDER'] = '您的Gmail邮箱地址'
# --- 邮件配置结束 ---
mail = Mail(app)
@app.route('/send_html_email')
def send_html_email():
# 2. 准备 HTML 内容
# 提示:在实际项目中,您通常会使用 render_template() 来加载和渲染 HTML 模板。
html_content = """
<html>
<head></head>
<body>
<h1 style="color: blue;">欢迎使用 Flask-Mail!</h1>
<p>这是一封由 **Flask 应用程序** 发送的 HTML 格式邮件。</p>
<ul>
<li>您可以添加 <b>粗体</b> 文本。</li>
<li>您可以使用 <a href="https://flask.palletsprojects.com/" target="_blank">链接</a>。</li>
</ul>
<p>谢谢!</p>
</body>
</html>
"""
# 3. 创建 Message 对象并使用 'html' 参数
msg = Message(
subject="Flask-Mail HTML 格式测试邮件", # 邮件主题
recipients=["收件人邮箱地址"], # 更改为实际收件人
body="请注意:如果您的客户端不支持 HTML,您将看到此纯文本内容。", # 纯文本备用内容
html=html_content # 重要的:HTML 内容
)
# 4. 发送邮件
try:
mail.send(msg)
return "HTML 邮件发送成功!"
except Exception as e:
return f"邮件发送失败: {e}"
if __name__ == '__main__':
# 为了测试方便,可以运行此脚本
# ⚠️ 实际使用时,请确保配置正确,尤其是 Gmail 的应用密码
app.run(debug=True)
最佳实践:使用模板引擎 (推荐)
在真实的 Flask 应用程序中,硬编码 HTML 字符串是不灵活的。最佳实践是使用 Flask 内置的 Jinja2 模板引擎来生成 HTML 邮件内容:
-
创建邮件模板文件: 将您的 HTML 内容保存在
templates文件夹内,例如email/welcome.html。 -
在视图中渲染模板: 在您的路由函数中,导入并使用
render_template来生成 HTML 字符串:from flask import render_template # ... @app.route('/send_welcome_email/<user_name>') def send_welcome_email(user_name): # 渲染 HTML 模板,传入动态数据 html_content = render_template( 'email/welcome.html', name=user_name, site_url='https://yourwebsite.com' ) msg = Message( subject=f"欢迎, {user_name}!", recipients=["收件人邮箱"], body=f"欢迎加入我们的平台,{user_name}!", # 纯文本备用 html=html_content ) # ... mail.send(msg) ... return "欢迎邮件发送成功!"
这样可以使您的邮件代码更清晰、更易于维护和更改格式。