【问题标题】:Django mail SMTPlib auth method problemDjango邮件SMTPlib auth方法问题
【发布时间】:2011-08-28 00:44:21
【问题描述】:

我正在尝试使用 Django 和我客户的 smtp 服务器发送电子邮件。 该服务器仅支持 AUTH LOGIN 命令。

默认情况下(据我所知,使用wireshark)django发送这个位:

250-AUTH=LOGIN CRAM-MD5 PLAIN

作为电子邮件的一部分。

我已将其跟踪到 /usr/lib/python/smtplib.py:569,它在其中选择身份验证方法(有一个 AUTH_LOGIN 选项,这是我想要的)。

据我所知,我无法在 settings.py (http://docs.djangoproject.com/en/dev/topics/email/) 中使用 vars 设置身份验证方法

有谁知道我如何告诉 Django 使用 auth_login 而不是 auth_cram_md5?

【问题讨论】:

  • 我在 Django 找到了这张票,分辨率为 WONTFIX (!!!): code.djangoproject.com/ticket/9488。任何已知的解决方法?
  • 任何不直接使用 smtplib 的解决方法,如果涉及到,我会这样做。
  • 我目前正在努力解决同样的问题。你找到解决办法了吗?在我的研究中,我在这里找到了这个页面,但没有解决我的问题:harelmalka.com/?p=94

标签: django login smtp authentication


【解决方案1】:

我找到了一种方法来告诉 smtplib 使用一种特定的身份验证机制(感谢 SMTP AUTH extension trouble with Python)。以下代码行允许您向 smtplib 建议身份验证机制,忽略服务器提供的其他机制(例如 CRAM-MD5 DIGEST-MD5):

server.esmtp_features['auth'] = 'LOGIN PLAIN'

在许多教程中发现的另一个常见错误是,在使用.starttls() 时,需要发送两次server.ehlo(),一次在.starttls() 之前和一次之后。

这是对我有用的代码:

import smtplib

user = '<username>'
pwd = '<password>'

FROM = 'sender@mail.com'
TO = ['receiver@mail.com']
SUBJECT = 'Testing sending using gmail'
TEXT = 'Testing sending mail using gmail servers'

# Prepare actual message
message = """\From: %s\nTo: %s\nSubject: %s\n\n%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)

try:
    server = smtplib.SMTP("<SMTP-Server-URI>", 25)
    server.set_debuglevel(1) # optional, good for debugging
    server.ehlo()
    server.starttls()
    server.ehlo()
    server.esmtp_features['auth'] = 'LOGIN PLAIN'
    server.login(user, pwd)
    server.sendmail(FROM, TO, message)
    server.close()
    print 'successfully sent the mail'
except:
    print 'failed to send mail'

此代码仅使用 Python 2.7.9 进行了测试(而不是专门使用 Django)。希望它可以帮助一些人。

【讨论】:

    猜你喜欢
    • 2021-08-19
    • 1970-01-01
    • 2018-04-25
    • 2018-07-31
    • 2017-05-05
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2020-09-19
    相关资源
    最近更新 更多