Django (读作 [/ˈdʒæŋɡoʊ/], D不发音 )有一个 DRY 原则(Don't Repeat Yourself, 不要重复造轮子),很多模块都可以直接改动使用,最近使用其中的重置密码发送邮件模块遇到了一些坑,在这里记录一下。
测试环境
推荐在 django shell
下进行测试,不要开启服务器即可测试.
启动命令
python manage.py shell
或者直接在 Pycharm
中点击 Python Console
测试配置
在项目的 settings.py
中添加如下配置
# Config Email
EMAIL_HOST = 'smtp.qq.com'
EMAIL_HOST_USER = 'fesonx@foxmail.com'
EMAIL_HOST_PASSWORD = '*******'
EMAIL_PORT = 587
EMAIL_USE_TTL = True
DEFAULT_FROM_EMAIL = "fesonx@qq.com"
上面的配置截止发稿前均为可用状态.
配置过程
但是授人以鱼不如授人以渔, 下面是这些配置的具体信息.
在 QQ 邮箱的设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 中开启SMTP
, 进入选项旁边的如何收发页面, 可以看到下面的配置图:
配置
在图中即可找到相对应的信息发送邮件服务器地址:EMAIL_HOST = 'smtp.qq.com
端口:EMAIL_PORT = 587
加密连接类型:EMAIL_USE_TTL = True
测试命令
命令分别对应主题(Subject)\ 内容(Message)\ 发件人(From) \ 收件人(To)\ 发送失败是否不显示信息
需要注意的是收件人是一个列表
from django.core.mail import send_mail
send_mail("Hello", "Hello World:)", "fesonx@qq.com", ['fesonx@foxmail.com'], fail_silently=False)
踩到的坑
如果出现下面的错误:
...
File "/usr/lib/python3.6/smtplib.py", line 642, in auth
raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (530, b'Must issue a STARTTLS command first.')
原因:
加密连接方式选择错误, 请查阅你所选择的邮箱服务器是 SSL 还是 TLS
...
File "/usr/lib/python3.6/socket.py", line 745, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known
原因:
域名错误,请检查你的域名有没有打错.
File "/usr/lib/python3.6/smtplib.py", line 642, in auth
raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (530, b'Must issue a STARTTLS command first.')
原因
端口炸了, 465,587,25端口都试试看.
SMTPAuthenticationError at /account/password-reset/
(535, b'Error: \xc7\xeb\xca\xb9\xd3\xc3\xca\xda\xc8\xa8\xc2\xeb\xb5\xc7\xc2\xbc\xa1\xa3\xcf\xea\xc7\xe9\xc7\xeb\xbf\xb4:
http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256')
原因:
认证失败, ('\xc7\xeb\xca\xb9\xd3\xc3'
这串是中文)这个错误比较隐蔽, 如果没有配置过QQ邮箱的第三方邮件软件登录的同学很容易犯, 在第三方邮件收发软件中, 并非使用邮箱密码登录, 而是使用授权码
这样第三方邮箱泄露里密码, 你的QQ密码至少还在.
授权码
成果
当你看到返回1
的时候就发送成功了
PyDev console: starting.
Python 3.6.5 (default, May 11 2018, 13:30:17)
[GCC 7.3.0] on linux
Django 2.1.5
from django.core.mail import send_mail
send_mail("Hello", "Hello World:)", "fesonx@qq.com", ['fesonx@foxmail.com'], fail_silently=False)
1
查看一下收件箱吧!
结果