Django 5 配置邮件发送功能,使用 QQ 邮箱的 smtp 发送邮件。

Django 5 中如果你要使用评论等功能,可能需要为 django 5 网站启用邮件功能,要使用 QQ 邮箱发送邮件需要,配置 QQ 邮箱的 smtp 服务,同时还要启用 django 5 的 smtp 功能。

Django 5 邮件服务配置

Django 5 需要在 settings.py 文件中添加以下配置启用 smtp,以实现使用 smtp 发送邮件:

EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.qq.com"
EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST_USER = "u1shizhi@qq.com"
EMAIL_HOST_PASSWORD = "jisljedsljdiwjg"

配置解释

EMAIL_BACKEND
  邮件服务后端,使用邮件服务商发送邮件,需要配置使用 smtp 邮件后端。
  smtp 邮件后端为 django.core.mail.backends.smtp.EmailBackend

EMAIL_HOST
  smtp 服务器地址,使用邮件服务商发送邮件,需要配置使用 smtp 邮件后端。
  QQ邮箱 smtp 服务器地址为 smtp.qq.com

EMAIL_USE_SSL & EMAIL_USE_TLS
EMAIL_USE_SSL 表示是否使用隐式 TSL 连接传输数据,其对应的端口是 465
EMAIL_USE_TLS 表示是否使用显式 TSL 连接传输数据,其对应的端口是 587
EMAIL_USE_SSL & EMAIL_USE_TLS 的默认值为 False,并且只能设置其中一项为 True
  QQ 邮箱的端口 465587 都可以使用,如果使用 465 端口,需要配置 EMAIL_USE_SSL = True;如果使用 587 端口,需要配置 EMAIL_USE_TLS = True

EMAIL_PORT
  QQ邮箱 TSL 端口是 465587 都使用,非 TSL 端口是 25
  在此使用QQ邮箱 587 端口,需要配置 EMAIL_PORT = 587

EMAIL_HOST_USER
  邮件地址,填入你自己的QQ邮箱地址。

EMAIL_HOST_PASSWORD
  QQ邮箱使用授权码作为第三方应用的专用密码。   在此输入你的QQ对应邮箱的授权码。

QQ邮箱开启 SMTP 服务

默认情况下QQ邮箱的 smtp 服务是关闭的,不允许使用 smtp 服务发送邮件,如果你要使用QQ邮箱的 smtp 服务,需要先开启 smtp 服务。

开启QQ邮箱 smtp 服务

  1. 登陆 QQ 邮箱
  2. 点击邮箱界面右上方的 “账号与安全” 按钮
  3. 点击 "安全设置" 菜单
  4. 点击 “POP3/IMAP/SMTP/Exchange/CardDAV 服务” 下的 “开启服务” 按钮,按照提示开启 smtp 服务
  5. 复制给出的授权码(一定要保存好,该授权码在 EMAIL_HOST_PASSWORD 中使用)

测试 Django 5 发送邮件功能

在网站的跟目录,运行 shell 进入 python 命令行,测试 Django 5 发送邮件功能是否配置正确:

python manage.py shell

django.core.mail 模块提供的 send_mail 函数发送邮件,在命令行输入如下 python 代码:

from django.core import mail
mail.send_mail(
    subject="邮件标题",
    message="邮件正文",
    from_email="u1shizhi@qq.com",
    recipient_list=["u1shizhi@qq.com"],
)

进入你的邮箱,查看是否收到邮件,如果收到邮件,则说明邮件功能配置正确。

参数解释

subject:发送邮件的标题
message:是邮件发送的正文内容
from_email:发送人的邮箱地址
recipient_list:收件人列表,可以配置多个邮箱地址

以 HTML 方式发送邮件正文

django.core.mail 模块的 send_mail 函数提供了 html_message 参数,以实现在邮件正文中发送 HTML 信息:

在 shell 命令行输入如下 python 代码:

from django.core import mail
mail.send_mail(
    subject="邮件标题",
    html_message="<h2>邮件正文</h2>",
    from_email="u1shizhi@qq.com",
    recipient_list=["u1shizhi@qq.com"],
)

批量发送邮件

django.core.mail 模块提供的 send_mass_mail 函数发送邮件,在命令行输入如下 python 代码:

send_mass_mail 的参数和参数顺序都是固定的,分别是邮件标题,正文,邮件发送人,和邮件接收人列表;并且不支持 html_message 参数。

from django.core.mail import send_mass_mail

message1 = (
    "邮件标题1",
    "正文一",
    "u1shizhi@qq.com",
    ["u1shizhi@qq.com"],
)
message2 = (
    "邮件标题2",
    "正文二",
    "u1shizhi@qq.com",
    ["u1shizhi@qq.com"],
)
send_mass_mail((message1, message2), fail_silently=False)

接收不到邮件的处理

如果你已经配置了所有的参数,但是在邮箱内接收不到任何的邮件,你有可能是在开发环境中启用了其他 EMAIL_BACKEND,该配置覆盖了前面的 smtp 后端配置。

例如你可能启用了控制台后端:

EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"

解决方法

删除其他的邮件后端配置即可。