Прикрепление изображения (или объекта) из памяти к электронному письму в python

У меня есть изображение в памяти, которое я создал (используя numpy и PIL), и я хотел бы программно прикрепить его к созданному электронному письму. Я знаю, что могу сохранить его в файловой системе, а затем перезагрузить / присоединить, но это кажется неэффективным: есть ли способ просто передать его во вложение mime без сохранения?

Версия сохранения / перезагрузки:

from PIL import Image
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

...some img creation steps...

msg = MIMEMultipart()
img_fname = '/tmp/temp_image.jpg'
img.save( img_fname)
with open( img_fname, 'rb') as fp:
    img_file = MIMEImage( fp.read() )
    img_file.add_header('Content-Disposition', 'attachment', filename=img_fname )
    msg.attach( img_file)

...add other attachments and main body of email text...

1 ответ

Решение

MIMEImage говорит, что первый аргумент - это просто "строка, содержащая необработанные данные изображения", поэтому вам не нужно open() затем .read() это из файла.

Если вы делаете это в PIL, и нет способа сериализовать его напрямую (не может быть, я не могу вспомнить), вы можете использовать io.StringIO (или же BytesIO... какой бы ни работал с чем MIMEImage очень хочет) файлоподобный буфер, чтобы сохранить файл, затем прочитать его как строку. Смежный вопрос. Модернизированный адаптированный отрывок:

import io
from email.mime.image import MIMEImage

# ... make some image

outbuf = io.StringIO()
image.save(outbuf, format="PNG")
my_mime_image = MIMEImage(outbuf.getvalue())
outbuf.close()
Другие вопросы по тегам