Envío de correos electrónicos en multipartes html que contienen imágenes incrustadas

He estado jugando con el módulo de correo electrónico en python, pero quiero saber cómo incrustar imágenes que se incluyen en el html.

Así, por ejemplo, si el cuerpo es algo así como

 

Me gustaría incrustar image.png en el correo electrónico, y el atributo src debería reemplazarse con content-id . ¿Alguien sabe cómo hacer esto?

Aquí hay un ejemplo que encontré.

Receta 473810: envíe un correo electrónico HTML con una imagen incrustada y texto alternativo alternativo :

HTML es el método de elección para aquellos que desean enviar correos electrónicos con texto enriquecido, diseño y gráficos. A menudo es deseable incrustar los gráficos dentro del mensaje para que los destinatarios puedan mostrar el mensaje directamente, sin más descargas.

Algunos agentes de correo no admiten HTML o sus usuarios prefieren recibir mensajes de texto sin formato. Los remitentes de mensajes HTML deben incluir un mensaje de texto simple como alternativa para estos usuarios.

Esta receta envía un mensaje HTML corto con una sola imagen incrustada y un mensaje de texto plano alternativo.

 # Send an HTML email with an embedded image and a plain text message for # email clients that don't want to display the HTML. from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.MIMEImage import MIMEImage # Define these once; use them twice! strFrom = 'from@example.com' strTo = 'to@example.com' # Create the root message and fill in the from, to, and subject headers msgRoot = MIMEMultipart('related') msgRoot['Subject'] = 'test message' msgRoot['From'] = strFrom msgRoot['To'] = strTo msgRoot.preamble = 'This is a multi-part message in MIME format.' # Encapsulate the plain and HTML versions of the message body in an # 'alternative' part, so message agents can decide which they want to display. msgAlternative = MIMEMultipart('alternative') msgRoot.attach(msgAlternative) msgText = MIMEText('This is the alternative plain text message.') msgAlternative.attach(msgText) # We reference the image in the IMG SRC attribute by the ID we give it below msgText = MIMEText('Some HTML text and an image.

Nifty!', 'html') msgAlternative.attach(msgText) # This example assumes the image is in the current directory fp = open('test.jpg', 'rb') msgImage = MIMEImage(fp.read()) fp.close() # Define the image's ID as referenced above msgImage.add_header('Content-ID', '') msgRoot.attach(msgImage) # Send the email (this example assumes SMTP authentication is required) import smtplib smtp = smtplib.SMTP() smtp.connect('smtp.example.com') smtp.login('exampleuser', 'examplepass') smtp.sendmail(strFrom, strTo, msgRoot.as_string()) smtp.quit()

Para las versiones 3.4 y superiores de Python.

La respuesta aceptada es excelente, pero solo es adecuada para versiones antiguas de Python (2.xy 3.3). Creo que necesita una actualización.

Aquí le mostramos cómo puede hacerlo en las nuevas versiones de Python (3.4 y superiores):

 from email.message import EmailMessage from email.utils import make_msgid import mimetypes msg = EmailMessage() # generic email headers msg['Subject'] = 'Hello there' msg['From'] = 'ABCD ' msg['To'] = 'PQRS ' # set the plain text body msg.set_content('This is a plain text body.') # now create a Content-ID for the image image_cid = make_msgid(domain='xyz.com') # if `domain` argument isn't provided, it will # use your computer's name # set an alternative html body msg.add_alternative("""\   

This is an HTML body.
It also has an image.

""".format(image_cid=image_cid[1:-1]), subtype='html') # image_cid looks like # to use it as the img src, we don't need `<` or `>` # so we use [1:-1] to strip them off # now open the image and attach it to the email with open('path/to/image.jpg', 'rb') as img: # know the Content-Type of the image maintype, subtype = mimetypes.guess_type(img.name)[0].split('/') # attach it msg.get_payload()[1].add_related(img.read(), maintype=maintype, subtype=subtype, cid=image_cid) # the message is ready now # you can write it to a file # or send it using smtplib