美文网首页Django学习笔记
用 Django 发送邮件踩过的深坑

用 Django 发送邮件踩过的深坑

作者: FesonX | 来源:发表于2019-01-16 22:34 被阅读21次

    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
    

    查看一下收件箱吧!


    结果

    相关文章

      网友评论

        本文标题:用 Django 发送邮件踩过的深坑

        本文链接:https://www.haomeiwen.com/subject/sluvdqtx.html