Python SMTPLib 无法再进行身份验证,但 Django 仍然可以在同一台机器上发送电子邮件

Python SMTPLib can no longer authenticate but django can still send emails on the same machine

我们 运行 一个夜间脚本,用于向我们公司的一群人发送电子邮件。几天前,连接一直保持打开状态,最终超时,从那以后我们就无法在同一台机器上使用相同的代码连接到exchange SMTP服务器。 Django 配置为在同一台服务器上使用完全相同的设置 运行s,并继续发送任何错误电子邮件。此外,运行在不同的服务器上使用相同的代码,我们仍然能够连接和发送电子邮件。我对原因和可能的解决方案感到非常困惑。

Tl;博士:

电子邮件连接器:

class Email_Connect(object):
    def __init__(self):
        self.user = "mydomain\myuser"
        self.pwd = "mypassword"  
        self.send_from = 'myuser@mycompany.com'
        self.local_hostname = socket.getfqdn()

    def smtp_conn(self,server='myrelay.mycompany.net'):
        self.c = smtplib.SMTP(server, local_hostname=self.local_hostname)
        self.c.set_debuglevel(1)
        self.c.ehlo()
        self.c.starttls()
        self.c.ehlo()
        self.c.login(self.user, self.pwd)

代码是这样调用的:

emailer = common.Email_Connect()
emailer.smtp_conn()
emailer.send_email(send_to,msg_subject,msg_body,None,attachment)
emailer.close()

Django 邮件设置(在同一台机器上工作正常):

DEFAULT_FROM_EMAIL = 'myuser@mycompany.com'
SERVER_EMAIL = 'myuser@mycompany.com'
EMAIL_USE_TLS = True
EMAIL_HOST = "myrelay.mycompany.net"
EMAIL_HOST_USER = "myuser"
EMAIL_HOST_PASSWORD = "mypassword"

这里是 运行 代码的完整调试输出:

(production) c:\site\production\web\core>python program_replication.py
(21, 'send spool email reports')
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
send: 'ehlo mycomputer.mycompany.net\r\n'
reply: '250-smtp.mycompany.net Hello [10.1.*.*]\r\n'
reply: '250-SIZE 31457280\r\n'
reply: '250-PIPELINING\r\n'
reply: '250-DSN\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250-STARTTLS\r\n'
reply: '250-AUTH\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-BINARYMIME\r\n'
reply: '250-CHUNKING\r\n'
reply: '250-XEXCH50\r\n'
reply: '250 XSHADOW\r\n'
reply: retcode (250); Msg: smtp.mycompany.net Hello [10.1.*.*]
SIZE 31457280
PIPELINING
DSN
ENHANCEDSTATUSCODES
STARTTLS
AUTH
8BITMIME
BINARYMIME
CHUNKING
XEXCH50
XSHADOW
send: 'STARTTLS\r\n'
reply: '220 2.0.0 SMTP server ready\r\n'
reply: retcode (220); Msg: 2.0.0 SMTP server ready
send: 'ehlo mycomputer.mycompany.net\r\n'
reply: '250-smtp.mycompany.net Hello [10.1.*.*]\r\n'
reply: '250-SIZE 31457280\r\n'
reply: '250-PIPELINING\r\n'
reply: '250-DSN\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250-AUTH\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-BINARYMIME\r\n'
reply: '250-CHUNKING\r\n'
reply: '250-XEXCH50\r\n'
reply: '250 XSHADOW\r\n'
reply: retcode (250); Msg: smtp.mycompany.net Hello [10.1.*.*]
SIZE 31457280
PIPELINING
DSN
ENHANCEDSTATUSCODES
AUTH
8BITMIME
BINARYMIME
CHUNKING
XEXCH50
XSHADOW
ERROR:  No suitable authentication method found. replication module send spool email reports failed to run

所以问题是由 Exchange 期望 windows 身份验证而不是 LOGIN 命令引起的。我碰巧注释掉了 login() 行,现在可以成功发送电子邮件了。

我仍然不知道为什么这段代码曾经 运行 成功并突然停止工作,但解决方案是保持一切原样并停止传递登录命令。