首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python 3.0 smtplib

Python 3.0 smtplib
EN

Stack Overflow用户
提问于 2009-02-14 17:20:58
回答 4查看 2.8K关注 0票数 3

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

代码语言:javascript
运行
复制
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 ",但这似乎也不起作用。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-02-14 19:29:29

更新:从bug跟踪器中注意到还有一个建议的修复方法:

编辑smtplib.py并将现有encode_plain()定义替换为以下内容:

代码语言:javascript
运行
复制
def encode_plain(user, password):
    s = "\0%s\0%s" % (user, password)
    return encode_base64(s.encode('ascii'), eol='')

在我的安装上进行了测试,它工作正常。

票数 4
EN

Stack Overflow用户

发布于 2009-02-14 18:21:06

代码语言:javascript
运行
复制
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

希望开发人员能很快发布一个补丁。

票数 3
EN

Stack Overflow用户

发布于 2009-02-27 08:58:03

作为Jay答案的一个变体,您可以在运行时对其进行“猴子补丁”,而不是编辑smtplib.py。

将以下代码放在代码中的某个位置:

代码语言:javascript
运行
复制
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库的情况下将你的代码部署到其他系统上,这是很有用的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/549391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档