Добавление вложения в EmailMessage вызывает TypeError: set_text_content () получил неожиданный аргумент ключевого слова 'maintype' - PullRequest
1 голос
/ 22 июня 2019

Следуя примерам в примерах Python для электронной почты , кажется, что добавить вложение довольно просто.Однако следующее не работает:

import smtplib
from email.message import EmailMessage
import json

# Initialize message.
msg = EmailMessage()
msg['Subject'] = 'Testing, testing 1-2-3'
msg['To'] = 'fake@example.com'
msg['From'] = 'extrafake@example.com'
msg.set_content('Trying to attach a .json file')

# Create json attachment.
attachment = json.dumps({'This': 'is json'})

# Attempt to attach. This raises an exception.
msg.add_attachment(attachment, maintype='application', subtype='json', filename='test.json')

Вот исключение:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/usr/local/lib/python3.7/email/message.py", line 1147, in add_attachment
    self._add_multipart('mixed', *args, _disp='attachment', **kw)
  File "/usr/local/lib/python3.7/email/message.py", line 1135, in _add_multipart
    part.set_content(*args, **kw)
  File "/usr/local/lib/python3.7/email/message.py", line 1162, in set_content
    super().set_content(*args, **kw)
  File "/usr/local/lib/python3.7/email/message.py", line 1092, in set_content
    content_manager.set_content(self, *args, **kw)
  File "/usr/local/lib/python3.7/email/contentmanager.py", line 37, in set_content
    handler(msg, obj, *args, **kw)
TypeError: set_text_content() got an unexpected keyword argument 'maintype'

Обратите внимание, что это очень близко следует третьему примеру здесь , но не удается.Любая идея, как я могу прикрепить файл JSON?

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

1 Ответ

2 голосов
/ 22 июня 2019

EmailMessage.set_content делегирует ContentManager , либо один из них передается в качестве параметра, либо значение по умолчанию raw_data_manager .

raw_data_manager.set_content принимает аргумент maintype, если содержимое bytes, но не , если содержимое str.

Таким образом, решение состоит в том, чтобы передать bytes экземпляр EmailMessage.set_content:

# Create json attachment.
attachment = json.dumps({'This': 'is json'})

# Encode to bytes
bs = attachment.encode('utf-8')

# Attach
msg.add_attachment(bs, maintype='application', subtype='json', filename='test.json')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...