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