3

我有一段非常简单的代码,我在以前的 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",但这似乎也不起作用。

4

4 回答 4

4

更新:刚刚从错误跟踪器中注意到还有一个建议的修复:

编辑 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-14T19:29:28.637 回答
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

希望开发者能尽快发布补丁。

于 2009-02-14T18:21:05.697 回答
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 库,这有点难看但很有用。

于 2009-02-27T08:58:02.983 回答
0

此问题已在 Python3.1 中解决。在http://www.python.org/download/releases/3.1/获取更新

于 2009-06-30T07:52:24.337 回答