Python 3.0 smtplib - PullRequest
       18

Python 3.0 smtplib

3 голосов
/ 14 февраля 2009

У меня есть очень простой кусок кода, который я без проблем использовал в предыдущих версиях 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)

Google показывает, что есть некоторые проблемы с этой неясной ошибкой, но я все еще не могу понять, что мне нужно, чтобы заставить ее работать. Предложения включали в себя определение имени пользователя как b "username", но это тоже не сработало.

Ответы [ 4 ]

4 голосов
/ 14 февраля 2009

ОБНОВЛЕНИЕ : только что заметил, что при взгляде на баг-трекер также предлагается исправление:

Отредактируйте smtplib.py и замените существующее определение encode_plain() следующим:

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

Проверено здесь на моей установке, и она работает правильно.

3 голосов
/ 14 февраля 2009
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

Надеюсь, разработчики скоро опубликуют патч.

2 голосов
/ 27 февраля 2009

В качестве варианта ответа Джея, вместо того, чтобы редактировать 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.

0 голосов
/ 30 июня 2009

Эта проблема была решена в Python3.1. Получить обновление на http://www.python.org/download/releases/3.1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...