使用Python SMTP发送邮件遇到问题
我遇到了一个错误,不知道这是什么:
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)
参考资料: