Dim*_*Dim 0 authentication django smtp login
我正在尝试使用 Django 和我客户端的 smtp 服务器发送电子邮件。该服务器仅支持 AUTH LOGIN 命令。
默认情况下(据我所知使用wireshark)django发送这个位:
250-AUTH=LOGIN CRAM-MD5 PLAIN
Run Code Online (Sandbox Code Playgroud)
作为电子邮件的一部分。
我已将其跟踪到 /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?
小智 5
我找到了一种方法来告诉 smtplib 使用一种特定的身份验证机制(归功于Python 的 SMTP AUTH 扩展问题)。以下代码行允许您向 smtplib 建议身份验证机制,而忽略服务器提供的其他机制(例如 CRAM-MD5 DIGEST-MD5):
server.esmtp_features['auth'] = 'LOGIN PLAIN'
Run Code Online (Sandbox Code Playgroud)
在许多教程中发现的另一个常见错误是,在使用时.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'
Run Code Online (Sandbox Code Playgroud)
此代码仅使用 Python 2.7.9 进行了测试(而不是专门使用 Django 进行测试)。希望它可以帮助一些人。