Python3: отправить сообщение электронной почты, содержащее двоичные данные? - PullRequest
5 голосов
/ 06 июля 2011

Сбой после :

>>> a = email.message.Message()
>>> a.set_payload(b'some data')
>>> a.as_string()
TypeError: string payload expected: <class 'bytes'>

Также не удается явно использовать генератор и вызывать flatten. Тело сообщения преобразуется в ASCII, экранируется, а затем, в конце концов, преобразуется в байты для передачи, так почему я не могу установить полезную нагрузку байтов?

Как мне получить предпочтительно не MIME-сообщение с полезной нагрузкой в ​​байтах, которое smtplib.SMTP.send_message примет?

1 Ответ

1 голос
/ 27 июля 2011

Помните: в Python 3 строки все Unicode. Вы фактически даете Python объект байтов, а затем сообщаете ему, что хотите получить строку в юникоде, но не указываете, какую кодировку использовать для преобразования объекта байтов в строку.

Вам нужно предоставить кодировку в качестве второго параметра для вызова set_payload(), например:

test = email.message.Message()
test.set_payload(b'some example_data', 'latin1') # use latin-1 for no-op translation
test.as_string()

'MIME-Version: 1.0\nContent-Type: text/plain; charset="latin1"\nContent-Transfer-Encoding: base64\n\nc29tZSBleGFtcGxlIGRhdGE=\n'

Это дает сообщение типа MIME - надеюсь, это сработает для вас.

...