我有一段非常简单的代码,我在以前的Python版本( 2.5版和更早版本)中使用过,没有任何问题。现在,在3.0版本中,以下代码在登录行给出错误“参数1必须是字符串或缓冲区,而不是str”。
import smtplib
smtpserver = 'mail.somedomain.com'
AUTHREQUIRED = 1 # if you need to use SMTP AUTH set to 1
smtpuser = 'admin@somedomain.com' # for SMTP AUTH, set SMTP username here
smtppass = 'somepassword' # for SMTP AUTH, set SMTP password here
msg = "Some message to send"
RECIPIENTS = ['admin@somedomain.com']
SENDER = 'someone@someotherdomain.net'
session = smtplib.SMTP(smtpserver)
if AUTHREQUIRED:
session.login(smtpuser, smtppass)
smtpresult = session.sendmail(SENDER, RECIPIENTS, msg)谷歌显示,这个错误存在一些不清楚的问题,但我仍然不知道需要什么才能让它正常工作。建议包括将用户名定义为b" username ",但这似乎也不起作用。
发布于 2009-02-14 19:29:29
更新:从bug跟踪器中注意到还有一个建议的修复方法:
编辑smtplib.py并将现有encode_plain()定义替换为以下内容:
def encode_plain(user, password):
s = "\0%s\0%s" % (user, password)
return encode_base64(s.encode('ascii'), eol='')在我的安装上进行了测试,它工作正常。
发布于 2009-02-14 18:21:06
Traceback (most recent call last):
File "smtptest.py", line 18, in <module>
session.login(smtpuser, smtppass)
File "c:\Python30\lib\smtplib.py", line 580, in login
AUTH_PLAIN + " " + encode_plain(user, password))
File "c:\Python30\lib\smtplib.py", line 545, in encode_plain
return encode_base64("\0%s\0%s" % (user, password))
File "c:\Python30\lib\email\base64mime.py", line 96, in body_encode
enc = b2a_base64(s[i:i + max_unencoded]).decode("ascii")
TypeError: b2a_base64() argument 1 must be bytes or buffer, not str您的代码是正确的。这是smtplib或base64mime.py.中的错误你可以在这里追踪这个问题:http://bugs.python.org/issue5259
希望开发人员能很快发布一个补丁。
发布于 2009-02-27 08:58:03
作为Jay答案的一个变体,您可以在运行时对其进行“猴子补丁”,而不是编辑smtplib.py。
将以下代码放在代码中的某个位置:
def encode_plain(user, password):
s = "\0%s\0%s" % (user, password)
return encode_base64(s.encode('ascii'), eol='')
import smtplib
encode_plain.func_globals = vars(smtplib)
smtplib.encode_plain = encode_plain这看起来有点丑陋,但是如果你想在不修改其他系统的python库的情况下将你的代码部署到其他系统上,这是很有用的。
https://stackoverflow.com/questions/549391
复制相似问题