Установка содержимого электронной почты из строки в email.message? - PullRequest
0 голосов
/ 05 марта 2020

Я хотел бы отправить электронное письмо, используя Python.

Есть sendmail ( Отправка почты по sendmail с python), но также https://docs.python.org/3/library/smtplib.html. Он рекомендует создать сообщение на основе https://docs.python.org/3/library/email.message.html и имеет несколько примеров https://docs.python.org/3/library/email.examples.html#email -примеры , которые считывают содержимое сообщения из файла:

# Open the plain text file whose name is in textfile for reading.
with open(textfile) as fp:
    # Create a text/plain message
    msg = EmailMessage()
    msg.set_content(fp.read())

I я пробовал

msg.set_content(b"test message sent locally")

, но в результате TypeError: set_bytes_content() missing 2 required positional arguments: 'maintype' and 'subtype'. Кажется https://docs.python.org/3/library/email.message.html#email .message.EmailMessage.set_content требуется менеджер контекста?

Как можно использовать строку для построения тела сообщения?

1 Ответ

3 голосов
/ 05 марта 2020

Сообщение об ошибке верное, но вводит в заблуждение. Менеджер контента по умолчанию (менеджер контекста - другое животное ...) предоставляет этот метод set_content (подчеркните мой):

email.contentmanager.set_content(msg, <'str'>, subtype="plain", charset='utf-8' cte=None, disposition=None, filename=None, cid=None, params=None, headers=None) 
email.contentmanager.set_content(msg, <'bytes'>, maintype, subtype, cte="base64", disposition=None, filename=None, cid=None, params=None, headers=None) 
email.contentmanager.set_content(msg, <'EmailMessage'>, cte=None, disposition=None, filename=None, cid=None, params=None, headers=None) 
email.contentmanager.set_content(msg, <'list'>, subtype='mixed', disposition=None, filename=None, cid=None, params=None, headers=None) 

Добавление заголовков и полезных данных в msg:

Добавьте заголовок Content-Type со значением maintype / subtype.

Для str установите для основного типа MIME значение text и установите для подтипа значение subtype, если оно указано, или обычное значение, если это не так.

Для байтов используйте указанные основной тип и подтип или вызовите ошибку TypeError, если они не указаны .

...

Короче говоря, если вы хотите отправить простое текстовое сообщение, передайте простую (unicode) строку в set_content:

msg.set_content("test message sent locally")    # pass a str string and not a byte string
...