Прикрепление изображения (или объекта) из памяти к электронному письму в 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()