django发送邮件

在Python中已经内置了一个smtp邮件发送模块,Django在此基础上进行了简单地封装,让我们在Django环境中可以更方便更灵活的发送邮件。

所有的功能都在django.core.mail中。

一、快速上手

两行就可以搞定一封邮件:

from django.core.mail import send_mail

send_mail(
    ‘Subject here‘,
    ‘Here is the message.‘,
    ‘[email protected]‘,
    [‘[email protected]‘],
    fail_silently=False,
)

导入功能模块,然后发送邮件,so easy!

默认情况下,使用配置文件中的EMAIL_HOSTEMAIL_PORT设置SMTP服务器主机和端口,EMAIL_HOST_USEREMAIL_HOST_PASSWORD是用户名和密码。如果设置了EMAIL_USE_TLSEMAIL_USE_SSL,它们将控制是否使用相应的加密链接。

二、单发 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_emailrecipient_list参数是必须的,其它的可选。

  • subject:邮件主题。字符串。
  • message:邮件具体内容。字符串。
  • from_email:邮件发送者。字符串。
  • recipient_list:收件人。一个由邮箱地址组成的字符串列表。recipient_list中的每一个成员都会在邮件信息的“To:”区域看到其它成员。
  • fail_silently: 一个布尔值。如果它是False,send_mail发送失败时,将会引发一个smtplib.SMTPException异常。
  • auth_user: 可选的用户名用来验证SMTP服务器,如果你要特别指定使用哪个邮箱帐号,就指定这个参数。如果没有提供这个值,Django将会使用settings中EMAIL_HOST_USER的值。如果两者都不提供,那你还发什么???
  • auth_password: 可选的密码用来验证SMTP服务器。如果没有提供这个值,Django 将会使用settings中EMAIL_HOST_PASSWORD的值。和上面那个参数是一家的。
  • connection: 可选的用来发送邮件的电子邮件后端。
  • html_message: 如果提供了html_message,可以发送带HTML代码的邮件。

send_mail()方法返回值将是成功发送出去的邮件数量(只会是0或1,因为它只能发送一封邮件)。

三、群发 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‘, ‘[email protected]‘, [‘[email protected]‘, ‘[email protected]‘])

message2 = (‘Another Subject‘, ‘Here is another message‘, ‘[email protected]‘, [‘[email protected]‘])

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, [‘[email protected]‘])
        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异常。

五、发送多媒体邮件

默认情况下,发送的邮件都是纯文本格式的。但有时候我们希望能在邮件里带一些超级链接、图片,甚至视频和JS动作。

Django为我们提供了一个EmailMultiAlternatives类,可以同时发送文本和HTML内容,下面是个范例,我们照着写就行:

from django.core.mail import EmailMultiAlternatives

subject, from_email, to = ‘hello‘, ‘[email protected]‘, ‘[email protected]‘
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()

需要提醒的是,接收方的邮件服务商不一定支持多媒体邮件,也许是为了安全,也许是别的原因。为了保证你的邮件内容能被阅读,请务必同时发送纯文本邮件。

原文地址:https://www.cnblogs.com/navysummer/p/10200284.html

时间: 2024-10-01 20:24:14

django发送邮件的相关文章

Django 发送邮件

Django 发送邮件 本章节涉及django的发邮件模块send_mail.send_mass_mail.EmailMultiAlternatives from django.core.mail import send_mail from django.core.mail import send_mass_mail from django.core.mail import EmailMultiAlternatives 1. 配置相关参数 如果用的是 163的企业邮箱,settings配置类似于

django发送邮件的坑

django发送邮件的坑 配置django发邮件的时候本地发送时好好的,但是放到阿里云的服务器上却不能发送. 经过一系列的排查后终于发现是阿里云把25端口给封了. 后来改用smtps的方式发送,更改django的setting的邮件配置 1 EMAIL_PORT = 465 2 3 4 5 6 EMAIL_USE_SSL = True 将端口改为465 增加配置项: EMAIL_USE_SSL = True 到阿里云控制台开放465端口 重新运行django和celery 原文地址:https:

django 发送邮件的两个问题

基本配置 参考django doc中的文档:发送邮件 配置如下,settings中配置: EMAIL_HOST = 'smtp.163.com' EMAIL_PORT = '25' EMAIL_HOST_USER = '[email protected]' EMAIL_HOST_PASSWORD = '******' # 填密码 然后调用send_mail发送邮件即可 subject = u'号码通激活' print name message = u'用户:' + name + u' 您好,首先

Django发送邮件及邮件激活

根据前端请求头中传入的JWT token的信息,使用DRF中追加的JWT认证判断是否登录 axios.get(this.host + '/user/', { // 向后端传递JWT token的方法 headers: { 'Authorization': 'JWT ' + this.token }, responseType: 'json', }) 在settins配置文件中添加配置DRF的JWT # 配置DRF REST_FRAMEWORK = { # 异常处理 'EXCEPTION_HAND

Django发送邮件方法

在Django中将渲染后的模板进行邮件发送,可以使用send_email方法 首先在settings.py中添加如下配置 # 邮件配置SSL加密方式 EMAIL_HOST = 'smtp.qq.com' EMAIL_PORT = 465 # 使用SSL加密方式端口为465 EMAIL_HOST_USER = '[email protected]' EMAIL_HOST_PASSWORD = 'pwd' EMAIL_USE_SSL = True # 使用SSL加密方式 EMAIL_FROM = '

Django——发送邮件

在Python中已经内置了一个smtp邮件发送模块,Django在此基础上进行了简单地封装,让我们在Django环境中可以更方便更灵活的发送邮件. 所有的功能都在django.core.mail中. 记录一个简单的示例 1.配置 首先获取邮箱的授权码(以新浪邮箱为例) 然后是settings.py的配置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.sina.com' # 中间的“

django 发送邮件功能

setting.py 1 # 邮件配置 2 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 3 EMAIL_HOST = 'smtp.exmail.qq.com' # 发送邮件的服务器地址 4 EMAIL_HOST_USER = '[email protected]' # 不含‘@126.com’的后缀 5 EMAIL_HOST_PASSWORD = '' # 非邮箱登录密码 6 EMAIL_PORT = 25 7 EM

django发送邮件配置

配置如下,settings中配置: EMAIL_HOST = 'smtp.163.com' EMAIL_PORT = '25' EMAIL_HOST_USER = '[email protected]' EMAIL_HOST_PASSWORD = '******' # 填密码 然后调用send_mail发送邮件即可 subject = u'号码通激活' print name message = u'用户:' + name + u' 您好,首先非常感谢你的注册' + u"\n点击链接就可以激活邮箱

使用django发送邮件时的连接超时问题解决

一.报错 研究报错半天,没看出代码有什么毛病,就是发送邮件时连接超时,发送邮件的连接用户名密码都没有错误,于是就网上各种查... 终于皇天不负有心人,找到答案了.. 在服务器上输入telnet smtp.mxhichina.com 25,果然跟上述结果不一样,是这样的:Trying 205.204.101.152..., 于是,网上查找资料,端口号25时禁用的,如果你发的邮件时安全连接就用465端口号,否则80就可以了! 原文地址:https://www.cnblogs.com/zhangnin