使用python SMTP发送邮件时遇到问题

时间:2014-07-23 16:15:19

标签: python email smtp smtplib

所以我很难找到这个错误:

smtplib.SMTPAuthenticationError: (235, 'welcome')

我无法找到明确的答案235是什么。

所以我按照以下方式做了一些事情:

s = smtplib.SMTP()
s.connect("smtp.myserver.com", 25)

回复(220,'欢迎使用9x SMTP服务器')

然后我这样做:

s.ehlo()

然后回来

(250, 'p3\nAUTH LOGIN\nHELP')

我这样做是因为服务器不支持starttls

smtplib.SMTPException: STARTTLS extension not supported by server.

然后我尝试登录:

>>> s.login("test@myserver.com", "password")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python27\lib\smtplib.py", line 608, in login
    raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (235, 'welcome')

我不知道235意味着什么,但我得到一个欢迎字符串。我真的很困惑,我百分百肯定我的证书是正确的。

2 个答案:

答案 0 :(得分:1)

您的服务器对AUTH LOGIN命令的响应是非典型的,可能是非标准的。

典型的模式是:

C: AUTH LOGIN xxxx
S: 334 yyyy
C: zzzz
S: 235 welcome

其中C表示客户端,S表示服务器,xxxx是base64编码的用户名,yyyy是可忽略的base64编码字符串,{ {1}}是base64编码的密码。

您的服务器正在执行此操作:

zzzz

无论出于何种原因,您的服务器似乎对密码不感兴趣。

我不知道您的服务器可能需要更改哪些配置。如果您有兴趣修改smtplib.py,请查找以下代码:

C: AUTH LOGIN xxxx
S: 235 welcome

尝试这样的事情:

    elif authmethod == AUTH_LOGIN:
        (code, resp) = self.docmd("AUTH",
            "%s %s" % (AUTH_LOGIN, encode_base64(user, eol="")))
        if code != 334:
            raise SMTPAuthenticationError(code, resp)
        (code, resp) = self.docmd(encode_base64(password, eol=""))

另一方面,修改程序可能更有意义。试试这个:

    # UNTESTED
    elif authmethod == AUTH_LOGIN:
        (code, resp) = self.docmd("AUTH",
            "%s %s" % (AUTH_LOGIN, encode_base64(user, eol="")))
        if code == 334:
            (code, resp) = self.docmd(encode_base64(password, eol=""))
        elif code != 235:
            raise SMTPAuthenticationError(code, resp)

参考:

答案 1 :(得分:0)

可能您必须执行SMTP所需的其他设置。根据{{​​3}},由于您使用的是ehlo,因此您可以通过更改s.esmtp_features词典来执行此类设置。

示例:

s.esmtp_features["auth"] = "LOGIN DIGEST-MD5" # changing the authentication method