Convertir imagen PIL a MIMEImage

Me gustaría crear una imagen con PIL y poder enviarla por correo electrónico sin tener que guardarla en el disco.

Esto es lo que funciona, pero implica guardar en disco:

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) 

Ahora me gustaría poder hacer algo como:

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

, que no funciona. He encontrado una discusión en español que parece que responde a la misma pregunta, sin solución, excepto un puntero en StringIO.

im.tostring devuelve datos de imagen sin procesar pero necesita pasar datos de archivo de imagen completos a MIMEImage , así que use el módulo StringIO para guardar la imagen en la memoria y usar esos datos:

 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)