Saltar al contenido

Envíe un correo electrónico a Gmail con una imagen en línea usando Python

Israel, parte de este equipo de trabajo, nos ha hecho el favor de escribir este escrito ya que domina a la perfección dicho tema.

Solución:

Parece que seguir la plantilla de correo electrónico de Gmail funciona:

* multipart/alternative
  - text/plain
  - multipart/related
    + text/html
      
+ image/png Content-ID:

Basado en el ejemplo de email documentos del módulo:

#!/usr/bin/env python3
import html
import mimetypes
from email.headerregistry import Address
from email.message import EmailMessage
from email.utils import make_msgid
from pathlib import Path

title = 'Picture report…'
path = Path('TESTING.png')
me = Address("Pepé Le Pew", *gmail_user.rsplit('@', 1))

msg = EmailMessage()
msg['Subject'] = 'Report…'
msg['From'] = me
msg['To'] = [me]
msg.set_content('[image: title]'.format(title=title))  # text/plain
cid = make_msgid()[1:-1]  # strip <>    
msg.add_alternative(  # text/html
    'alternativo'
    .format(cid=cid, alt=html.escape(title, quote=True)),
    subtype='html')
maintype, subtype = mimetypes.guess_type(str(path))[0].split('/', 1)
msg.get_payload()[1].add_related(  # image/png
    path.read_bytes(), maintype, subtype, cid="".format(cid=cid))

# save to disk a local copy of the message
Path('outgoing.msg').write_bytes(bytes(msg))

Mandar msg a través de gmail:

import smtplib
import ssl

with smtplib.SMTP('smtp.gmail.com', timeout=10) as s:
    s.starttls(context=ssl.create_default_context())
    s.login(gmail_user, gmail_password)
    s.send_message(msg)

Versión compatible con Python 2/3

* multipart/related
  - multipart/alternative
    + text/plain
    + text/html
      
...
- image/jpeg Content-ID:

Basado en Enviar un correo electrónico HTML con imagen incrustada y alternativa de texto sin formato:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cgi
import uuid
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text      import MIMEText
from email.mime.image     import MIMEImage
from email.header         import Header    

img = dict(title=u'Picture report…', path=u'TESTING.png', cid=str(uuid.uuid4()))

msg = MIMEMultipart('related')
msg['Subject'] = Header(u'Report…', 'utf-8')
msg['From'] = gmail_user
msg['To'] = ", ".join([to])
msg_alternative = MIMEMultipart('alternative')
msg.attach(msg_alternative)
msg_text = MIMEText(u'[image: title]'.format(**img), 'plain', 'utf-8')
msg_alternative.attach(msg_text)

msg_html = MIMEText(u'
' 'alternativo
' .format(alt=cgi.escape(img['title'], quote=True), **img), 'html', 'utf-8') msg_alternative.attach(msg_html) with open(img['path'], 'rb') as file: msg_image = MIMEImage(file.read(), name=os.path.basename(img['path'])) msg.attach(msg_image) msg_image.add_header('Content-ID', '<>'.format(img['cid']))

Mandar msg a través de gmail:

import ssl

s = SMTP_SSL('smtp.gmail.com', timeout=10,
             ssl_kwargs=dict(cert_reqs=ssl.CERT_REQUIRED,
                             ssl_version=ssl.PROTOCOL_TLSv1,
                             # http://curl.haxx.se/ca/cacert.pem
                             ca_certs='cacert.pem')) 
s.set_debuglevel(0)
try:
    s.login(gmail_user, gmail_pwd)
    s.sendmail(msg['From'], [to], msg.as_string())
finally:
    s.quit()

SMTP_SSL es opcional, podrías usar starttls método de su pregunta en su lugar:

import smtplib
import socket
import ssl
import sys

class SMTP_SSL(smtplib.SMTP_SSL):
    """Add support for additional ssl options."""
    def __init__(self, host, port=0, **kwargs):
        self.ssl_kwargs = kwargs.pop('ssl_kwargs', )
        self.ssl_kwargs['keyfile'] = kwargs.pop('keyfile', None)
        self.ssl_kwargs['certfile'] = kwargs.pop('certfile', None)
        smtplib.SMTP_SSL.__init__(self, host, port, **kwargs)

    def _get_socket(self, host, port, timeout):
        if self.debuglevel > 0:
            print>>sys.stderr, 'connect:', (host, port)
        new_socket = socket.create_connection((host, port), timeout)
        new_socket = ssl.wrap_socket(new_socket, **self.ssl_kwargs)
        self.file = getattr(smtplib, 'SSLFakeFile', lambda x: None)(new_socket)
        return new_socket

Creo que necesitas agregar las siguientes líneas:

from email.mime.image import MIMEImage

body = MIMEText('

Test Image

', _subtype='html') msg.attach(body) img = MIMEImage(image.read(), 'jpeg') img.add_header('Content-Id', '') msg.attach(img)

testimage debe ser reemplazado con un identificador único

Si te ha sido provechoso nuestro artículo, te agradeceríamos que lo compartas con el resto juniors de esta manera nos ayudas a extender nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *