Python中SMTP AUTH扩展问题

2 投票
1 回答
12110 浏览
提问于 2025-04-16 18:18

我正在尝试写一个简单的Python脚本,通过我公司的SMTP服务器发送电子邮件。我使用了以下这段代码。

#! /usr/local/bin/python

import sys,re,os,datetime
from smtplib import SMTP

#Email function
def sendEmail(message):
        sender="SENDERID@COMPANY.com"
        receivers=['REVEIVER1@COMPANY.com','RECEIVER2@COMPANY.com']
        subject="Daily Report - " + datetime.datetime.now().strftime("%d %b %y")
        header="""\
                From: %s
                To: %s
                Subject: %s

                %s""" % (sender, ", ".join(receivers), subject, message)
        smtp = SMTP()
        smtp.set_debuglevel(1)
        smtp.connect('X.X.X.X')
        smtp.ehlo()
        smtp.starttls()
        smtp.ehlo()
        try:
                smtp.login('SENDERID@COMPANY.com', '********')
                smtp.sendmail(sender,receivers,header)
                smtp.quit()
        except Exception, e:
                print e

#MAIN
sendEmail("HAHHAHAHAHAH!!!")

运行这个程序后,得到了这个结果。

connect: ('X.X.X.X', 25)
connect: ('X.X.X.X', 25)
reply: '220 COMPANY.com [ESMTP Server] service ready;ESMTP Server; 05/25/11 15:59:27\r\n'
reply: retcode (220); Msg: COMPANY.com [ESMTP Server] service ready;ESMTP Server; 05/25/11 15:59:27
connect: COMPANY.com [ESMTP Server] service ready;ESMTP Server; 05/25/11 15:59:27
send: 'ehlo SERVER1.COMPANY.com\r\n'
reply: '250-COMPANY.com\r\n'
reply: '250-SIZE 15728640\r\n'
reply: '250-8BITMIME\r\n'
reply: '250 STARTTLS\r\n'
reply: retcode (250); Msg: COMPANY.com
SIZE 15728640
8BITMIME
STARTTLS
send: 'STARTTLS\r\n'
reply: '220 Ready to start TLS\r\n'
reply: retcode (220); Msg: Ready to start TLS
send: 'ehlo SERVER2.COMPANY.com\r\n'
reply: '250-COMPANY.com\r\n'
reply: '250-SIZE 15728640\r\n'
reply: '250 8BITMIME\r\n'
reply: retcode (250); Msg: COMPANY.com
SIZE 15728640
8BITMIME
send: 'quit\r\n'
reply: '221 [ESMTP Server] service closing transmission channel\r\n'
reply: retcode (221); Msg: [ESMTP Server] service closing transmission channel
ERROR: Could not send email! Check the reason below.
SMTP AUTH extension not supported by server.

我该如何开始调试这个“服务器不支持SMTP AUTH扩展”的错误呢?

附注:我知道SMTP的详细信息和凭据是正确的,因为我有一个使用相同信息的Java类可以正常工作。

1 个回答

8

你遇到的这个错误意思是你连接的SMTP服务器不支持身份验证。如果你查看调试输出,你会发现对你发送的EHLO命令的回应中,没有包含支持AUTH的必要声明。如果这个服务器确实支持身份验证,那么在STARTTLS之后的EHLO回应中,应该会有类似这样的内容:

250 AUTH GSSAPI DIGEST-MD5 PLAIN

(至少在STARTTLS之后的EHLO回应中会有。)因为没有这个回应,smtplib就认为这个服务器不能处理AUTH命令,所以会拒绝发送。如果你确定你的SMTP服务器支持AUTH命令,尽管它没有明确说明,你可以偷偷地让smtplib相信它支持AUTH,方法是明确地将其添加到功能列表中。你需要知道支持哪种身份验证方式,然后你可以这样做:

smtp.starttls()
smtp.ehlo()
# Pretend the SMTP server supports some forms of authentication.
smtp.esmtp_features['auth'] = 'LOGIN DIGEST-MD5 PLAIN'

... 不过当然,让SMTP服务器按照规范来工作会是个更好的主意 :)

撰写回答