Преобразование изображения PIL в MIMEImage - PullRequest
4 голосов
/ 18 декабря 2011

Я хотел бы создать изображение с помощью PIL и иметь возможность отправить его по электронной почте без необходимости сохранять его на диск.

Это то, что работает, но включает сохранение на диск:

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

msg = MIMEMultipart()

im = Image.new("RGB", (200, 200))

with open("tempimg.jpg", "w") as f:
    im.save(f, "JPEG")

with open("tempimg.jpg", 'rb') as f:
    img = MIMEImage(f.read())

msg.attach(img)

Теперь я хотел бы иметь возможность сделать что-то вроде:

import StringIO

tempimg = StringIO.StringIO()
tempimg.write(im.tostring())
img = MIMEImage(tempimage.getvalue(), "JPG")
msg.attach(img)

, что не работает.Я нашел обсуждение на испанском языке , которое выглядит так, как будто оно решает тот же вопрос, без решения, кроме указателя на StringIO.

1 Ответ

7 голосов
/ 18 декабря 2011

im.tostring возвращает необработанные данные изображения, но вам необходимо передать данные всего файла изображения в MIMEImage, поэтому используйте модуль StringIO для сохранения изображения в памяти и использования этих данных:

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

msg = MIMEMultipart()

im = Image.new("RGB", (200, 200))
memf = cStringIO.StringIO()
im.save(memf, "JPEG")
img = MIMEImage(memf.getvalue())

msg.attach(img)
...