发送邮件
虽然Python通过使用smtplib
模块发送电子邮件相对容易,但Django提供了一些轻量级包装。提供这些包装器是为了使发送电子邮件更加快速,以便在开发过程中轻松测试电子邮件发送,并为不能使用SMTP的平台提供支持。代码存在于django.core.mail
模块中。
上手快速
分为两行:
from django.core.mail import send_mail send_mail( '主题', '将要发送的消息', 'from@example.com', # 发送人 ['to@example.com'], # 接收人 fail_silently=False, )
想要使用还得在settings.py中进行配置
设置EMAIL_HOST
和EMAIL_PORT
指定的SMTP主机和端口,例如qq邮箱的HOST和PORT是:'smtp.qq.com'和465设置EMAIL_HOST_USER
和EMAIL_HOST_PASSWORD为要发送邮件的账号跟授权码。
-
EMAIL_USE_TLS
并EMAIL_USE_SSL
设置控制安全连接是否被使用。
例如settings.py:
# 配置发送邮件相关信息 EMAIL_USE_SSL = True EMAIL_HOST = 'smtp.qq.com' # 如果是 163 改成 smtp.163.com EMAIL_PORT = 465 EMAIL_HOST_USER = '2789519045@qq.com' # 帐号 EMAIL_HOST_PASSWORD = 'dfsmismiilkydghh' # 授权码,QQ邮箱需要授权码作为第三方客户端的登录密码 DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
send_mail()
send_mail(subject,message,from_email,recipient_list,fail_silently = False,auth_user = None,auth_password = None,connection = None,html_message = None)
发送电子邮件的最简单方法是使用 django.core.mail.send_mail()
。
subject
,message
,from_email
和recipient_list
参数是必需的。
subject
:字符串,发送邮件的主题。message
:字符串,发送邮件的消息。from_email
:字符串,发件人信息。recipient_list
:A list of strings, each an email address. Each member ofrecipient_list
will see the other recipients in the "To:" field of the email message.fail_silently
:布尔值。当它的False
,如果出现错误,send_mail()
将引发一个smtplib.SMTPException
。auth_user
:用于向SMTP服务器进行身份验证的可选用户名。如果没有提供,Django将使用EMAIL_HOST_USER
设置的值 。auth_password
:用于向SMTP服务器进行身份验证的可选密码。如果没有提供,Django将使用EMAIL_HOST_PASSWORD
设置的值 。connection
:用于发送邮件的可选电子邮件后端。如果未指定,将使用默认后端的实例。html_message
:如果html_message
被提供,发送的邮件信息是html类型的。
返回值将是成功传递的消息数(可以是0
或者1
因为它只能发送一条消息)。
send_mass_mail()
send_mass_mail(datatuple,fail_silently = False,auth_user = None,auth_password = None,connection = None)
django.core.mail.send_mass_mail()
旨在处理群发电子邮件。
datatuple
是一个元组,其中每个元素都采用以下格式:
(subject, message, from_email, recipient_list)
fail_silently
,auth_user和
auth_password
的功能于send_mail()的相同
。
datatuple里面每个单独的元素都会生成单独的电子邮件。
例如,以下代码将向两组不同的收件人发送两条不同的邮件; 但是,只打开一个与邮件服务器的连接:
message1 = ('主题', '要发送的信息', 'from@example.com', ['first@example.com', 'other@example.com']) # 该条信息会发送给两个人 message2 = ('另一个主题', '要发送的信息', 'from@example.com', ['second@test.com']) # 该信息会发送给一个人 send_mass_mail((message1, message2), fail_silently=False) # 该方法会发送两个邮件,分别发送给两个人和一个人
返回值将是成功传递的消息数。
防止标题注入
标头注入是一种安全漏洞,攻击者在其中插入额外的电子邮件标头来控制脚本生成的电子邮件中的“收件人:”和“发件人:”。
上面概述的Django电子邮件功能都可以通过禁止标头值中的换行来防止标头注入。如果有subject
,from_email
或 recipient_list
包含换行符(在Unix,Windows或Mac风格中),电子邮件功能(例如send_mail()
)将引发 django.core.mail.BadHeaderError
(子类ValueError
),因此不会发送电子邮件。在将所有数据传递给电子邮件功能之前,您有责任对其进行验证。
如果a message
包含字符串开头的标题,则标题将仅作为电子邮件消息的第一位打印。
这是一个示例视图,它 从请求的POST数据中获取a subject
,message
并将from_email
其发送到admin@example .com并在完成后重定向到“/ contact / thanks /”:
from django.core.mail import BadHeaderError, send_mail 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.')
通过EmailMultiAlternatives发送
msg = EmailMultiAlternatives(“主题”, "邮件内容,可以是html字符串", email_from, [new_email]) msg.attach_alternative(html_content, "text/html") # 发送邮件 msg.send()