Вопрос

У меня есть очень простой фрагмент кода, который я без проблем использовал в предыдущих версиях Python (версия 2.5 и более ранние).Теперь, начиная с версии 3.0, следующий код выдает ошибку в строке входа: «аргумент 1 должен быть строкой или буфером, а не строкой».

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 «имя пользователя», но это, похоже, тоже не работает.

Это было полезно?

Решение

ОБНОВЛЯТЬ:только что заметил, просматривая систему отслеживания ошибок, есть также предлагаемое исправление:

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

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

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

Другие советы

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

Ваш код правильный.Это ошибка в смтплиб или в base64mime.py.Вы можете отслеживать проблему здесь:http://bugs.python.org/issue5259

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top