所以我很难找到这个错误是什么:
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("[email protected]", "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是什么意思,但是我得到了欢迎字符串。我真的很困惑,我100%确定我的凭据正确无误。
最佳答案
您的服务器对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("[email protected]", "password")
code, resp = s.docmd('AUTH LOGIN', encode_base64('[email protected]'))
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)
参考:
http://msdn.microsoft.com/en-us/library/cc433484(v=exchg.80).aspx
https://docs.python.org/2/library/smtplib.html#smtplib.SMTP.docmd