python flask-mail

大家好,我是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 对通过第三方应用发送邮件有严格要求。通常需要:
    1. 启用 IMAP (在 Gmail 设置的“转发和 POP/IMAP”中)。
    2. 使用应用密码(如果您启用了两步验证)。

发送电子邮件

配置完成后,您可以使用 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 邮件内容:

  1. 创建邮件模板文件: 将您的 HTML 内容保存在 templates 文件夹内,例如 email/welcome.html

  2. 在视图中渲染模板: 在您的路由函数中,导入并使用 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 "欢迎邮件发送成功!"
    

这样可以使您的邮件代码更清晰、更易于维护和更改格式。