Django实现发送邮件功能

版权声明:本文为博主原创文章,未经博主允许不得转载。原账号CreabineChen现已不用,所有博客均已迁移过来。 https://blog.csdn.net/Creabine/article/details/53857826
最近用python写了官网的后台。官网的后台功能比较简单,一个多语言支持,一个联系我们,即给公司发邮件的功能。多语言支持的方式写在另一篇博客了。这里先来说一说Django的发送邮件功能。

其实python本身自带了发送邮件的功能,Django在其基础上进行了封装,使其更加简单易用。仅仅几行代码就可以实现发送邮件的功能。
但是在实际开发的时候,遇到了两个大坑,折腾了3天才真正搞定,在这里做一个简单的记录和梳理,希望能帮其他小伙伴规避这些问题。

使用Django做发送邮件的功能前,首先要有一个支持smtp协议的邮箱并检查设置。**在这里要控诉一下网易邮箱,163和126邮箱,都会强行把你要发送的邮件判定为垃圾邮件,从而阻止发送,所以这里不建议使用。最好使用企业邮箱,付费的真的比较靠谱。**我这里以腾讯企业邮箱作为示范:
1.登陆腾讯企业邮箱,进入设置--客户端设置
2.确认SMTP服务是否开启,如下图:
3.若没有开启,记得开启。然后看设置方法,下边会用到。

这里写图片描述

然后,要在settings.py文件中配置邮箱相关参数:

# send e-mail
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'  #email后端
EMAIL_USE_TLS = False   #是否使用TLS安全传输协议
EMAIL_USE_SSL = True    #是否使用SSL加密,qq企业邮箱要求使用
EMAIL_HOST = 'smtp.exmail.qq.com'   #发送邮件的邮箱 的 SMTP服务器,这里用了qq企业邮箱
EMAIL_PORT = 465     #发件箱的SMTP服务器端口
EMAIL_HOST_USER = 'charleschen@xmdaren.com'    #发送邮件的邮箱地址
EMAIL_HOST_PASSWORD = '*********'         #发送邮件的邮箱密码
最后,在views.py中制作一个简单的demo邮件并发送:
from django.core.mail import send_mail  
# send_mail的参数分别是  邮件标题,邮件内容,发件箱(settings.py中设置过的那个),收件箱列表(可以发送给多个人),失败静默(若发送失败,报错提示我们)
send_mail('Subject here', 'Here is the message.', 'charleschen@xmdaren.com',
    ['to@example.com'], fail_silently=False)
如果一切正常,那么邮件发送已经成功了。但是我很蛋疼的遇到了问题,报错显示是语法错误....

大坑注意

我到达上一步的时候,报错显示语法错误,可是一共就几行代码,检查了几遍也没错,怎么回事呢?后来改用python自带的smtp模块发送,一步步调试之后,发现问题在登陆邮箱的时候就失败了。然后在大神的带领下,使用Wireshark软件抓包,发现登陆时,SMTP协议会收取本地计算机名称,在这个名称中,不能包含诸如横杠"-",空格" "等字符,而我的本地计算机名称包含了"-",并且公司的局域网路由器在主机名后边加了带空格的后缀“HDCP HOST”所以导致SMTP协议校验失败。
问题清除之后就好办了,首先修改主机名,然后在设置ip地址的高级设置-DNS中,手动添加一个合法的DNS后缀即可。我这里改为dhcp3

这里写图片描述

修改之后,发送成功~

接下来的事情就简单了,在这个基础功能上,优化多邮件发送,还有HTML格式邮件的支持,这些内容都没什么坑,我就不赘述了,大家直接看[自强学堂的教程即可](http://www.ziqiangxuetang.com/django/django-send-email.html)


有时候很简单的功能,也会牵扯到很复杂的问题,或者报错信息很难定位问题,这时候要大胆推测,小心求证,列举各种可能性,一一检查,最后总能搞定的。希望这篇blog能帮你避开大坑。
阅读更多

没有更多推荐了,返回首页