Python smtplib send_message () не работает, возвращая AttributeError: объект «str» не имеет атрибута «get_all»

Я работаю над проектом, в котором мне нужно использовать модули smtplib и электронной почты в Python 3.4 для отправки электронной почты.

Я могу создать само электронное письмо и подключиться к серверу, но затем он возвращает это исключение:

reply: b'235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: b'2.7.0 Accepted'
send: 'QUIT\r\n'
reply: b'221 2.0.0 closing connection s66sm8304113yhp.2 - gsmtp\r\n'
reply: retcode (221); Msg: b'2.0.0 closing connection s66sm8304113yhp.2 - gsmtp'
Traceback (most recent call last):
  File "base.py", line 108, in <module>
    send(fromaddr, toaddrs, msg)
  File "base.py", line 61, in send
    server.send_message(fromaddr, toaddrs, msg)
  File "/usr/lib/python3.4/smtplib.py", line 829, in send_message
    resent = msg.get_all('Resent-Date')
AttributeError: 'str' object has no attribute 'get_all'

Код (проблемная строка связана напрямую) доступен здесь. Как ни странно, код фактически отправляет QUIT до фактической отправки любого тела электронной почты - не уверен, что это как-то повлияет на это.

Кто-нибудь знает, что вызывает эту ошибку?

EDIT Оказывается, часть моей проблемы заключалась в том, что я использовал неправильный формат. send_message() требует переменных в порядке Message, From, To, в то время как мой код отправлял их в порядке From, To, Message.

Однако теперь я получаю эту ошибку:

reply: b'235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: b'2.7.0 Accepted'
send: 'QUIT\r\n'
reply: b'221 2.0.0 closing connection s66sm8443316yhp.2 - gsmtp\r\n'
reply: retcode (221); Msg: b'2.0.0 closing connection s66sm8443316yhp.2 - gsmtp'
Traceback (most recent call last):
  File "MIME-base.py", line 108, in <module>
    send(fromaddr, toaddrs, msg)
  File "MIME-base.py", line 61, in send
    server.send_message(msg, fromaddr, toaddrs)
  File "/usr/lib/python3.4/smtplib.py", line 839, in send_message
    g.flatten(msg_copy, linesep='\r\n')
  File "/usr/lib/python3.4/email/generator.py", line 109, in flatten
    self._write(msg)
  File "/usr/lib/python3.4/email/generator.py", line 189, in _write
    self._write_headers(msg)
  File "/usr/lib/python3.4/email/generator.py", line 416, in _write_headers
    self._fp.write(self.policy.fold_binary(h, v))
  File "/usr/lib/python3.4/email/_policybase.py", line 325, in fold_binary
    folded = self._fold(name, value, sanitize=self.cte_type=='7bit')
  File "/usr/lib/python3.4/email/_policybase.py", line 352, in _fold
    parts.append(h.encode(linesep=self.linesep,
AttributeError: 'list' object has no attribute 'encode'

person RPiAwesomeness    schedule 27.04.2015    source источник


Ответы (1)


Подпись для SMTP.send_message не является то же, что и SMTP.sendmail. Так что попробуйте:

    server.send_message(msg, fromaddr, toaddrs)

ИЗМЕНИТЬ:

Вам также нужно добавить заголовки To: отдельно, а не списком:

    for item in input("To: ").split():
        msg['To'] = item
person ekhumoro    schedule 27.04.2015
comment
Спасибо за указание на это, я пропустил разницу. Я больше не получаю эту ошибку, но теперь я получаю эту ошибку: AttributeError: 'list' object has no attribute 'encode'. Я обновлю свой вопрос с полной трассировкой. - person RPiAwesomeness; 27.04.2015
comment
Неважно, просто разобрался с новой ошибкой самостоятельно. Это было вызвано строкой msg['To'] = input().split(), поскольку она принимает ввод и составляет список. Спасибо, принимаю ваш ответ. - person RPiAwesomeness; 27.04.2015
comment
@RPiAwesomeness. Да: вам нужно добавить каждый элемент отдельно (я уже обновил свой ответ). - person ekhumoro; 27.04.2015
comment
Это спасло меня. Я действительно хотел бы, чтобы это было вызвано явно где-то. Спасибо @ekhumoro! - person TopherGopher; 02.09.2018