script mail library enviar con adjunto python email mime attachment multipart

library - send email python 3



Envío de correos electrónicos multipart en html que contienen imágenes incrustadas (2)

Aquí hay un ejemplo que encontré.

Receta 473810: envíe un correo electrónico HTML con imagen incrustada y texto sin formato 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 son compatibles con HTML o sus usuarios prefieren recibir mensajes de texto sin formato. Los remitentes de mensajes HTML deben incluir un mensaje de texto sin formato 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 = ''[email protected]'' strTo = ''[email protected]'' # 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(''<b>Some <i>HTML</i> text</b> and an image.<br><img src="cid:image1"><br>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'', ''<image1>'') 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()

He estado jugando con el módulo de correo electrónico en Python, pero quiero saber cómo incrustar imágenes que están incluidas en el html.

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

<img src="../path/image.png"></img>

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


Para Python versiones 3.4 y superiores.

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

Así es cómo puedes hacerlo en las versiones más nuevas 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 <[email protected]>'' msg[''To''] = ''PQRS <[email protected]>'' # 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("""/ <html> <body> <p>This is an HTML body.<br> It also has an image. </p> <img src="cid:{image_cid}"> </body> </html> """.format(image_cid=image_cid[1:-1]), subtype=''html'') # image_cid looks like <[email protected]> # 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