Django邮件发送模块smtp使用详解
本文详解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()
需注意,接收方的邮件服务商可能不支持多媒体邮件,这可能是出于安全考虑或其他原因。为确保邮件内容可读,请务必同时发送纯文本版本。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













