python - Python 的 SMTP AUTH 扩展问题

标签 python email authentication smtp smtplib

我正在尝试编写一个简单的 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 扩展”。错误?

P.S.:我知道 SMTP 详细信息和凭据是正确的,因为我有一个包含确切详细信息的工作 Java 类。

最佳答案

您收到的错误意味着您正在与之通话的 SMTP 服务器并未声称支持身份验证。如果您查看调试输出,您会发现对 EHLO 的响应均不包含 AUTH 的必要声明。如果它确实(正确地)支持身份验证,其中一个响应将类似于:

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 服务器按照规范运行是一个更好的主意 :)

关于python - Python 的 SMTP AUTH 扩展问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6123072/

相关文章:

python - 如何在最小值和最大值之间对 pandas 数据框进行分类/标记

java - 将动态数据存储到标签

asp.net - IIS7.0 : how to enable only "Anonymous Authentication" in IIS

python - 如何设置特定长度的特定 faker 随机字符串并使用下划线作为空格?

python - 从 zip 复制文件并同时读取该文件

python - 使用 Postgres 在 Python 中用单引号形成插入语句

c# - Exchange Web 服务收件箱文件夹正文搜索不起作用

iphone - 仅在 iPhone 上出现的电子邮件通讯中的奇怪差距

ruby-on-rails - 如何使用 rails 发送 'Mark as Important' 邮件

authentication - Grails 应用程序中的安全性 : Acegi or Shiro