Django邮件SMTPlib auth方法问题

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 进行测试)。希望它可以帮助一些人。