11.Django发送邮件

阅读: 61928     评论:35

通常而言,我们在用户注册成功,实际登陆之前,会发送一封电子邮件到对方的注册邮箱中,表示欢迎。进一步的还可能要求用户点击邮件中的链接,进行注册确认。

下面就让我们先看看如何在Django中发送邮件吧。

一、在Django中发送邮件

其实在Python中已经内置了一个smtp邮件发送模块,Django在此基础上进行了简单地封装。

首先,我们需要在项目的settings文件中配置邮件发送参数,分别如下:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.sina.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'xxx@sina.com'
EMAIL_HOST_PASSWORD = 'xxxxxxxxxxx'
  • 第一行指定发送邮件的后端模块,大多数情况下照抄!
  • 第二行,不用说,发送方的smtp服务器地址,建议使用新浪家的;
  • 第三行,smtp服务端口,默认为25;
  • 第四行,你在发送服务器的用户名;
  • 第五行,对应用户的密码。

特别说明:

  • 某些邮件公司可能不开放smtp服务
  • 某些公司要求使用ssl安全机制
  • 某些smtp服务对主机名格式有要求

这些都是前人踩过的坑。如果你在测试中出现了问题,请不要找Django的麻烦,99%的原因和你的邮件服务有关。

配置好了参数,就可以先测试一下邮件功能了。

在项目根目录下新建一个send_mail.py文件,然后写入下面的内容:

import os
from django.core.mail import send_mail

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

if __name__ == '__main__':   

    send_mail(
        '来自www.liujiangblog.com的测试邮件',
        '欢迎访问www.liujiangblog.com,这里是刘江的博客和教程站点,本站专注于Python、Django和机器学习技术的分享!',
        'xxx@sina.com',
        ['xxx@qq.com'],
    )

对于send_mail方法,第一个参数是邮件主题subject;第二个参数是邮件具体内容;第三个参数是邮件发送方,需要和你settings中的一致;第四个参数是接受方的邮件地址列表。请按你自己实际情况修改发送方和接收方的邮箱地址。

另外,由于我们当前是单独运行send_mail.py文件,无法自动链接Django环境,需要通过os模块对环境变量进行设置,也就是:

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

运行send_mail.py文件,注意不是运行Django服务器。然后到你的目的地邮箱查看邮件是否收到。

image

二、发送HTML格式的邮件

通常情况下,我们发送的邮件内容都是纯文本格式。但是很多情况下,我们需要发送带有HTML格式的内容,比如说超级链接。一般情况下,为了安全考虑,很多邮件服务提供商都会禁止使用HTML内容,幸运的是对于以httphttps开头的链接还是可以点击的。

下面是发送HTML格式的邮件例子。删除send_mail.py原来的所有内容,添加下面的代码:

import os
from django.core.mail import EmailMultiAlternatives

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

if __name__ == '__main__':

    subject, from_email, to = '来自www.liujiangblog.com的测试邮件', 'xxx@sina.com', 'xxx@qq.com'
    text_content = '欢迎访问www.liujiangblog.com,这里是刘江的博客和教程站点,专注于Python和Django技术的分享!'
    html_content = '<p>欢迎访问<a href="http://www.liujiangblog.com" target=blank>www.liujiangblog.com</a>,这里是刘江的博客和教程站点,本站专注于Python、Django和机器学习技术的分享!</p>'
    msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
    msg.attach_alternative(html_content, "text/html")
    msg.send()

其中的text_content是用于当HTML内容无效时的替代txt文本。

打开测试用的接收邮箱,可以看到链接能够正常点击,如下图所示:

image

这个send_mail.py文件只是一个测试脚本,使用完毕后可以从项目里删除。


 10. 注册视图 12. 邮件注册确认 

评论总数: 35


点击登录后方可评论

发送qq邮件一堆错误,好不容易调试成功



发送请求邮件一堆错误,好不容易调试成功



运行send_mail模块,报以下问题:是配置文件写错了么? django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_BACKEND, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.



检查代码多打了个字符!哎~粗心大意真要不得!



为啥mysite模块加载不进去啊



mysite要修改为settings文件所在的目录名



出现了这种错误“smtplib.SMTPAuthenticationError: (535, b'5.7.11 the behavior of this user triggered some restrictions to this account')”。大概率是把 EMAIL_HOST_PASSWORD设置为邮箱的登陆密码了,实际上不是,要去sina邮箱的设置内开启smtp功能,开启认证之后,会给你一串字符,把这串字符复制到 EMAIL_HOST_PASSWORD就可以了。



邮件服务器使用465端口,在settings配置文件中需要添加ssl如下: EMAIL_USE_SSL = True EMAIL_PORT = 465



报错:ModuleNotFoundError: No module named 'django_afx' 我的projectname是django_afx 我设置os.environ["DJANGO_SETTINGS_MODULE"]='django_afx.settings'



已经解决,拖到manage.py同层级可行,假如我放在某个app里,试了很多没法引用到settings



您好,我想问下,如何将超级管理员加入到User表里,不需要手动加?实际使用应该是超级管理员拥有这些权限的



出现“smtplib.SMTPAuthenticationError: (535, b'5.7.12 SMTP access disabled')”错误的话,是授权码问题。在步骤一中的EMAIL_HOST_PASSWORD = 'xxxxxxxxxxx' 里的'xxxxxxxxxxx'换成你对应的授权码即可。



请问出现socket.gaierror: [Errno 11001] getaddrinfo failed怎么解决,邮箱用的QQ,开启了SMTP了也写了HOSTPASSWORD了



填入授权码了



解决了,就因为多打了空格



请问如何单独运行这个py文件,



在pycharm里,右键直接run。或者在命令行中,python send_mail.py



EMAIL_HOST_PASSWORD不是密码,而是qq邮箱的授权码



只能发英文的邮件,头部加了# -*- coding: utf-8 -*-



这个应该是你本身环境造成的



发送HTML邮件时,参数text_content没起作用吧?



为了避免有些浏览器或邮箱不识别HTML邮件,就需要顺便发送纯文本邮件。



发送HTML邮件时,参数text_content没起作用吧??



smtplib.SMTPAuthenticationError: (502, b'unimplemented (#5.5.1)')。。。。这怎么搞



不报错了,但是没收到邮件



居然被腾讯拦截当成垃圾邮件了



```py #!/usr/bin/env python # -*- coding: utf-8 -*- # Created by TaoYuan on 2018/1/23 0023. # @Link : http://blog.csdn.net/lftaoyuan # Github : https://github.com/seeways import os from django.core.mail import send_mail, EmailMultiAlternatives os.environ['DJANGO_SETTINGS_MODULE'] = 'MyBlog.settings' if __name__ == '__main__': subject = "来自TaoYuan的测试邮件" from_email = "m18816740231@163.com" to = ["1876665310@qq.com"] text_content = "Github: https://github.com/seeways CSDN: http://blog.csdn.net/lftaoyuan" html_content = "<p>Github:<a href='https://github.com/seeways'>seeways</a></p><br><p>CSDN:<a " \ "href='http://blog.csdn.net/lftaoyuan'>TaoYuan</a></p> " # send_mail(主题, 内容, 发送者, 接收列表,其他默认参数) send_mail( subject, text_content, from_email, to, html_message=html_content ) # 优先发送html_content, html内容无效时,发送text # msg = EmailMultiAlternatives(subject, text_content, from_email, to) # msg.attach_alternative(html_content, "text/html") # msg.send() ```



建议给评论区加上MarkDown模块



为什么,我总是报错,按照你的做法, send_mail.py 页面运行报错 smtplib.SMTPAuthenticationError: (535, b'5.7.8 authentication failed') 验证码失败?是什么意思



smtplib.SMTPAuthenticationError: (535, b'5.7.11 the behavior of this user triggered some restrictions to this account')



发送邮件过程中出现的很多问题都不是Python和Django相关的,跟邮箱设置、邮箱服务器限制、网络防火墙等等都紧密相关。



你去邮箱设置里把smtp服务先打开才行



你这个错误怎么解决的,我也出现这个问题了



请问这个问题你解决了吗?我照着百度说的在新浪邮箱里面设置开启SMTP服务,但是仍然会继续报这个错误



两点:1、设置中EMAIL_HOST = 'smtp.qq.com',我这里用的qq邮箱,就对应改过来了。<br>2、EMAIL_HOST_PASSWORD是授权码,要去自己邮箱开启smtp服务。