Django邮件发送:send_mail与EmailMessage实战指南

江岸
江岸
发布时间:2026-10-11| 3人浏览过
原创

在Django开发中,邮件发送是用户验证、密码重置及系统通知的常见需求。Django通过django.core.mail模块提供了从简单到高级的多种邮件发送方案。本文深入解析send_mail、send_mass_mail及EmailMessage类的实现细节,结合配置与代码示例,帮助开发者掌握高效、安全的邮件发送技巧。

核心模块与基础函数

Django的邮件功能核心位于django.core.mail模块。该模块封装了Python标准的smtplib,简化了SMTP协议的交互过程。开发者最常用的两个函数是send_mail和send_mass_mail,它们适用于不同的业务场景。

send_mail:单条邮件发送

send_mail用于发送单封邮件给多个收件人。其返回值是成功发送的消息数量,通常返回1。该函数每次建立SMTP连接仅发送一种格式的消息。

def send_mail(subject, message, from_email, recipient_list,
  fail_silently=False, auth_user=None, auth_password=None,
  connection=None, html_message=None):
 pass

关键参数说明:

  • subject:邮件主题。
  • message:纯文本邮件内容。
  • from_email:发件人地址。
  • recipient_list:收件人列表,支持多个地址。
  • html_message:可选参数,用于发送HTML格式邮件。
  • fail_silently:若为True,忽略发送异常;否则抛出异常。
  • auth_user/auth_password:若未在settings中配置,需在此传递。

send_mass_mail:批量高效发送

当需要发送多封内容不同的邮件时,send_mass_mail效率更高。它通过一次SMTP连接发送多个不同的消息对象,避免了频繁建立连接的开销。

def send_mass_mail(datatuple, fail_silently=False, auth_user=None,
   auth_password=None, connection=None):
 pass

参数datatuple是一个元组,每个元素格式为(subject, message, from_email, recipient_list)。与send_mail不同,它不支持直接传递HTML内容,且每次连接可发送多个message。

Settings配置与认证

在settings.py中配置邮件后端,可简化代码中的参数传递。若未显式传递auth_user和auth_password,Django将自动读取配置中的值。

# settings.py
EMAIL_HOST = 'smtp.sina.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'viptestfordjango@sina.com'
EMAIL_HOST_PASSWORD = '******'
EMAIL_USE_TLS = False
EMAIL_FROM = 'viptestfordjango@sina.com'

注意:使用25端口时通常不使用TLS加密。若使用465端口,需设置EMAIL_USE_SSL = True。SSL和TLS只需启用其一。

实战示例:验证码与批量通知

发送验证码

利用send_mail的html_message参数,可轻松实现带格式的验证码发送。

from django.core.mail import send_mail
from project.settings import EMAIL_FROM
from random import randint
from string import lowercase, uppercase, digits

def send_code_email(email):
    code = ''
    seeds = lowercase + uppercase + digits
    length = len(seeds)
    for i in range(4):
        code += seeds[randint(0, length - 1)]
    
    send_title = '重置密码'
    send_message = f'你的验证码是:{code}。'
    # 使用html_message支持HTML格式
    send_status = send_mail(
        send_title, 
        send_message, 
        EMAIL_FROM, 
        [email],
        html_message=f'

你的验证码是:{code}

' ) return send_status

批量发送不同内容邮件

使用send_mass_mail向不同用户发送个性化内容。

from django.core.mail import send_mass_mail

def send_hello_email(email1, email2):
    message1 = ('新年好', '新年好', EMAIL_FROM, [email1])
    message2 = ('Happy New Year', 'Happy New Year', EMAIL_FROM, [email2])
    send_status = send_mass_mail((message1, message2), fail_silently=False)

高级用法:EmailMessage类

当需要支持抄送(CC)、密送(BCC)、附件或自定义头部信息时,需直接使用EmailMessage类。基础函数send_mail和send_mass_mail功能有限,无法直接支持这些高级特性。

类定义与参数

class EmailMessage(object):
    def __init__(self, subject='', body='', from_email=None, to=None, bcc=None,
        connection=None, attachments=None, headers=None, cc=None,
        reply_to=None):
        pass

关键参数:

  • cc, bcc, reply_to:均为列表。
  • attachments:元素为MIMEBase对象或元组。元组格式为(显示文件名, 文件数据, 文件类型)。

使用示例

from django.core.mail import EmailMessage

email = EmailMessage(
    'Hello',
    'Body goes here',
    'from@example.com',
    ['to1@example.com', 'to2@example.com'],
    ['bcc@example.com'],
    reply_to=['another@example.com'],
    headers={'Message-ID': 'foo'},
)

连接管理与后端机制

Django通过get_connection()获取邮件后端对象。默认后端为backends.smtp.EmailBackend,继承自BaseEmailBackend。

上下文管理器:自动连接管理

使用with语句可自动控制连接的打开与关闭,确保资源释放。

from django.core import mail

with mail.get_connection() as connection:
    mail.EmailMessage(
        subject1, body1, from1, [to1],
        connection=connection,
    ).send()
    mail.EmailMessage(
        subject2, body2, from2, [to2],
        connection=connection,
    ).send()

手动控制连接

开发者也可手动调用open()和close()方法,并通过send_messages()发送EmailMessage对象列表。

from django.core import mail

connection = mail.get_connection()
connection.open()
try:
    email1 = mail.EmailMessage(
        'Hello',
        'Body goes here',
        'from@example.com',
        ['to1@example.com'],
        connection=connection,
    )
    email1.send()
    
    email2 = mail.EmailMessage(
        'Hello',
        'Body goes here',
        'from@example.com',
        ['to2@example.com'],
    )
    email3 = mail.EmailMessage(
        'Hello',
        'Body goes here',
        'from@example.com',
        ['to3@example.com'],
    )
    connection.send_messages([email2, email3])
finally:
    connection.close()

后端类型

可在settings.py中指定后端:

  • Console backend:将邮件写入stdout,用于调试。
  • Dummy backend:无实际作用,用于测试。
  • SMTP backend:默认后端,通过SMTP协议发送邮件。
EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'

自定义后端需继承BaseEmailBackend,并实现send_messages、open和close方法。

总结

Django提供了灵活的邮件发送方案。简单场景使用send_mail或send_mass_mail;复杂场景(附件、抄送等)使用EmailMessage。合理配置settings.py并管理好SMTP连接,可提升应用性能与稳定性。

以上就是Django中send_mail功能实现详解的详细内容,更多关于Django邮件发送、EmailMessage用法及Python后端开发的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。