2009-02-14 62 views
3

我有一段非常简单的代码,在以前版本的Python中使用时没有问题(版本2.5及更早版本)。现在使用3.0,下面的代码给出登录行上的错误“参数1必须是字符串或缓冲区,而不是str”。Python 3.0 smtplib

import smtplib 

    smtpserver = 'mail.somedomain.com' 
    AUTHREQUIRED = 1      # if you need to use SMTP AUTH set to 1 
    smtpuser = '[email protected]' # for SMTP AUTH, set SMTP username here 
    smtppass = 'somepassword'   # for SMTP AUTH, set SMTP password here 
    msg = "Some message to send" 

    RECIPIENTS = ['[email protected]'] 
    SENDER = '[email protected]' 

    session = smtplib.SMTP(smtpserver) 

    if AUTHREQUIRED: 
     session.login(smtpuser, smtppass) 

    smtpresult = session.sendmail(SENDER, RECIPIENTS, msg) 

谷歌显示有一些问题,该错误不明确,但我仍然无法弄清楚我需要尝试使其工作。建议包括将用户名定义为b“用户名”,但似乎也不起作用。

+0

你应该包含回溯 – hop 2009-02-14 18:32:45

+1

我肯定会在Python bug跟踪器上寻找这个和/或创建一个新的bug报告,因为这看起来很像smtplib或者像电子邮件这样的底层模块.base65mime – Jay 2009-02-14 19:08:27

回答

4

UPDATE:从看bug跟踪系统只注意到有一个修复建议也:

编辑smtplib.py并替换现有encode_plain()定义与此:

def encode_plain(user, password): 
    s = "\0%s\0%s" % (user, password) 
    return encode_base64(s.encode('ascii'), eol='') 

在这里测试我的安装和它正常工作。

3
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 

您的代码是正确的。这是smtplibbase64mime.py中的一个错误。 您可以在这里跟踪问题: http://bugs.python.org/issue5259

希望开发者很快会发布补丁。

2

作为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库部署代码到其他系统这是一种丑陋,但很有用。