我正在尝试使用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?
答案 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)。希望它可以帮助一些人。