Django邮件SMTPlib auth方法问题

时间:2011-05-18 12:29:26

标签: django login smtp authentication

我正在尝试使用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设置auth方法

有谁知道我怎么能告诉Django使用auth_login而不是auth_cram_md5?

1 个答案:

答案 0 :(得分:3)

我找到了一种告诉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)。希望它可以帮助一些人。