使用Python SMTP发送邮件遇到问题

1 投票
2 回答
1005 浏览
提问于 2025-04-18 14:28

我遇到了一个错误,不知道这是什么:

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

也许你需要根据你的SMTP服务器做一些额外的设置。根据文档,因为你使用了ehlo,所以可以通过修改s.esmtp_features这个字典来进行这样的设置。

举个例子:

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

你的服务器对 AUTH LOGIN 命令的响应有点不寻常,可能不是标准的做法。

通常的流程是这样的:

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

这里 C 代表客户端,S 代表服务器,xxxx 是经过 base64 编码的用户名,yyyy 是一个可以忽略的 base64 编码字符串,zzzz 是经过 base64 编码的密码。

而你的服务器却是这样处理的:

C: AUTH LOGIN xxxx
S: 235 welcome

不管出于什么原因,你的服务器似乎对密码不太感兴趣。

我不知道你需要在服务器上做什么配置更改。如果你想修改 smtplib.py,可以找这个代码:

    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)

另一方面,修改你的程序可能更合理。试试这个:

#s.login("test@myserver.com", "password")
code, resp = s.docmd('AUTH LOGIN', encode_base64('test@myserver.com'))
if code==334:
    # Probably won't happen on "the 9x SMTP Server"
    code, resp = s.docmd(encode_base64('password'), '')
if code!=235:
    raise smtplib.SMTPAuthenticationError(code, resp)

参考资料:

撰写回答