如何使用 Django 发送电子邮件:完整的 SMTP 指南

发布: (2025年12月12日 GMT+8 04:00)
4 min read
原文: Dev.to

Source: Dev.to

理解 Django 的邮件系统

Django 通过其 django.core.mail 模块提供了一个强大的发送邮件框架。该模块包含用于发送普通、HTML 和批量邮件的函数和类。

该模块需要一个后端才能正常工作,因此你需要为项目配置想要使用的邮件后端。

Django 邮件系统概览

Django 支持许多开箱即用的邮件后端。SMTP 后端 是最流行的,适用于大多数应用。

除了默认后端之外,你还可以构建自定义邮件后端,但本指南侧重于内置的 SMTP 邮件后端。

如何使用 Django 发送邮件

前置条件

  • 项目中已安装 Django(本指南使用 Django 5.0,亦适用于 Django 3.x 及以上)
  • 具备 Django 与 Python 的基础知识
  • 一个可运行的 Django 项目
    (如果需要创建项目,请参阅官方 Django 安装指南)
  • 一个邮件服务提供商(示例使用 SendLayer,任何 SMTP 提供商均可)

如果选择 SendLayer,你可以使用免费账户,最多可发送 200 封邮件。

在 SendLayer 开始免费试用

创建账户后,需要授权发送域名,这可以提升投递成功率并验证你的账户。

配置邮件后端

打开项目的 settings.py,添加以下配置(将占位符替换为你自己的 SMTP 凭证):

# Django email configuration
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.sendlayer.net'      # Replace with your SMTP server
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'your-sendlayer-username'
EMAIL_HOST_PASSWORD = 'your-sendlayer-password'

Django 邮件设置配置

从 SendLayer(或你使用的其他提供商)账户中获取 SMTP 凭证,并相应替换占位符。

保护凭证安全

将用户名和密码直接写在代码中并不安全。请使用环境变量。

  1. 在项目根目录创建 .env 文件:

    EMAIL_HOST_USER='your-sendlayer-username'
    EMAIL_HOST_PASSWORD='your-sendlayer-password'
  2. 安装 python-decouple

    pip install python-decouple
  3. settings.py 中读取变量:

    from decouple import config
    
    EMAIL_HOST_USER = config('EMAIL_HOST_USER')
    EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD')

方法 1:使用 send_mail() 函数发送普通邮件

send_mail() 是用于发送简易文本邮件的内置快捷方式。

必需参数

  • subject:邮件主题
  • message:纯文本正文
  • from_email:发件人地址
  • recipient_list:收件人地址列表

可选参数

  • fail_silentlyFalse 会抛出异常;True 会抑制异常
  • connection:自定义邮件后端(默认使用 settings 中定义的后端)
  • html_message:邮件正文的 HTML 版本

示例

from django.core.mail import send_mail

send_mail(
    subject='Welcome to Our App',
    message='Thank you for signing up!',
    from_email='paulie@example.com',
    recipient_list=['user@example.com'],
    fail_silently=False,
)

专业提示: 使用 SendLayer 时,from_email 必须是已授权域名下的地址(例如 @example.com)。

发送给多个收件人

from django.core.mail import send_mail

send_mail(
    subject='Welcome to Our App',
    message='Thank you for signing up!',
    from_email='paulie@example.com',
    recipient_list=[
        'user1@example.com',
        'user2@example.com',
        'user3@example.com',
    ],
    fail_silently=False,
)

方法 2:使用 EmailMessage 类发送邮件

EmailMessage 类比 send_mail() 更灵活,允许添加附件、设置自定义头部以及发送 HTML 内容。

EmailMessage 与 send_mail 函数对比

Back to Blog

相关文章

阅读更多 »

Django:6.0 有哪些新特性

2025-12-03 !https://adamj.eu/tech/assets/2025-12-03-django-mosaic.webp Django 6.0 已于今日发布 https://www.djangoproject.com/weblog/2025/dec/03/django-60-r...