Django邮件发送模块smtp使用详解

蓝鲸
蓝鲸
发布时间:2026-10-13| 6人浏览过
原创

本文详解Django内置的smtp邮件发送模块,涵盖基础配置、单发send_mail()与群发send_mass_mail()的参数用法、头部注入防护及多媒体邮件发送技巧,帮助开发者高效实现邮件功能。

Django SMTP邮件发送概述

前言

Python标准库中已包含smtp邮件发送模块,Django在此基础上进行了封装,使得在Django项目中发送邮件更加便捷和灵活。

所有相关功能均封装在django.core.mail模块中。

快速上手与基础配置

一、快速上手

仅需两行代码即可完成邮件发送:


from django.core.mail import send_mail

send_mail(
  'Subject here',
  'Here is the message.',
  'from@example.com',
  ['to@example.com'],
  fail_silently=False,
)

导入所需功能模块并调用发送函数,操作十分简便。

默认情况下,Django会使用配置文件中的EMAIL_HOST和EMAIL_PORT指定SMTP服务器的主机地址和端口,通过EMAIL_HOST_USER和EMAIL_HOST_PASSWORD设置用户名与密码。若配置了EMAIL_USE_TLS或EMAIL_USE_SSL,则分别控制是否启用相应的加密连接。

单发功能 send_mail()详解

二、单发 send_mail()

方法原型:send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None)[source]

接下来介绍send_mail()方法,它接收多个参数,其中subject、message、from_email和recipient_list为必填项,其余为可选参数。

  • subject:邮件主题,类型为字符串。
  • message:邮件正文内容,类型为字符串。
  • from_email:发件人邮箱地址,类型为字符串。
  • recipient_list:收件人列表,由邮箱地址字符串组成。列表中的每个收件人在邮件的“To:”字段中都能看到其他收件人的地址。
  • fail_silently:布尔值。若设为False,当发送失败时将抛出smtplib.SMTPException异常。
  • auth_user:可选参数,用于指定验证SMTP服务器的用户名。若需指定特定邮箱账号,请设置此参数。若未提供,Django将使用settings中配置的EMAIL_HOST_USER值。若两者均未提供,则无法发送邮件。
  • auth_password:可选参数,用于指定验证SMTP服务器的密码。若未提供,Django将使用settings中配置的EMAIL_HOST_PASSWORD值。该参数与auth_user配合使用。
  • connection:可选参数,指定用于发送邮件的电子邮件后端。
  • html_message:若提供此参数,可发送包含HTML代码的邮件。

send_mail()方法的返回值是成功发送的邮件数量,由于该函数每次仅发送一封邮件,因此返回值只能是0或1。

群发功能 send_mass_mail()详解

三、群发 send_mass_mail()

方法原型:send_mass_mail(datatuple,fail_silently = False,auth_user = None,auth_password = None ,connection = None)[source]

send_mass_mail()用于处理大批量邮件任务,即群发场景。

其参数datatuple为必需参数,接收一个元组,元组中每个元素的格式如下:

(subject, message, from_email, recipient_list) 上述四个字段的含义与send_mail()中的参数一致。

例如,以下代码可向两组不同的收件人发送两条不同的消息,但仅建立一次到邮件服务器的连接:


message1 = ('Subject here', 'Here is the message', 'from@example.com', ['first@example.com', 'other@example.com'])

message2 = ('Another Subject', 'Here is another message', 'from@example.com', ['second@test.com'])

send_mass_mail((message1, message2), fail_silently=False)

send_mass_mail()方法的返回值是成功发送的邮件总数量。

使用send_mail()时,每次调用都会与SMTP服务器建立一次新连接,即“发一次连一次”,效率较低。而send_mass_mail()仅建立一次连接即可发送所有邮件,效率更高。

安全防护与多媒体邮件发送

四、防止头部注入攻击

当根据用户表单输入动态构造电子邮件时,存在头部注入攻击的风险。Django提供了一定的防范机制,但更多情况下仍需开发者自行编写安全代码。

以下示例接收用户输入的主题、邮件内容和发送方,并将邮件发送至系统管理员:


from django.core.mail import send_mail, BadHeaderError
from django.http import HttpResponse, HttpResponseRedirect

def send_email(request):
  subject = request.POST.get('subject', '')
  message = request.POST.get('message', '')
  from_email = request.POST.get('from_email', '')
  if subject and message and from_email:
    try:
      send_mail(subject, message, from_email, ['admin@example.com'])
    except BadHeaderError:
      return HttpResponse('Invalid header found.')
    return HttpResponseRedirect('/contact/thanks/')
  else:
    # In reality we'd use a form class
    # to get proper validation errors.
    return HttpResponse('Make sure all fields are entered and valid.')

若检测到用户输入包含头部注入攻击的可能性,将抛出BadHeaderError异常。

五、发送多媒体邮件

默认情况下,发送的邮件为纯文本格式。但有时需要在邮件中包含超级链接、图片,甚至视频和JavaScript动作。

Django提供了EmailMultiAlternatives类,可同时发送文本和HTML内容,参考以下范例:


from django.core.mail import EmailMultiAlternatives

subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'
text_content = 'This is an important message.'
html_content = '<p>This is an <strong>important</strong> message.</p>'
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()

需注意,接收方的邮件服务商可能不支持多媒体邮件,这可能是出于安全考虑或其他原因。为确保邮件内容可读,请务必同时发送纯文本版本。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

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

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 算法库。