Enviar una imagen por correo en Python

Una vez que podemos hacer una fotografía con nuestra webcam (Una cámara en la Raspberry Pi) lo siguiente que nos gustaría hacer es verla desde donde estemos.

Hay por ahí muchos textos explicando como hacer un servidor web en el que mirar la imagen capturada por la cámara, pero a mi ese método no me gustaba demasiado: habilitar un servidor web, abrir algunos puertos en el router casero y emplear algún sistema para dar cuenta de las posibles variaciones en la ip me parece poco robusto. Pero también incluye la posibilidad de que alguien pueda terminar conectándose a ese servidor web y acceder a nuestra red de alguna manera (posibilidad remota, seguramente, pero no despreciable).

También estuve evaluando la posibilidad de enviar las imágenes a través del cliente de mensajería pero no se si no es posible, o no he encontrado documentación para hacerlo, así que también lo descarté.

La elección final recayó en el viejo y confiable sistema de correo electrónico: el bot recibe las peticiones como sea (xmpp, IRC, …) y envía las imágenes captadas por correo electrónico.

Hay mucha documentación sobre cómo enviar un mensaje de correo con un adjunto pero yo ya tenía un programita para hacerlo, así que es el que usé. Se puede ver mail.py.

Esencialmente construye un mensaje a partir de sus componentes (Origen, destino, asunto, adjuntos, …).

Necesita unos cuantos parámetros, que hay que configurar para que funcione correctamente. La forma elegida para la configuración es mediante un módulo auxiliar:

import mailConfig


cuyo único contenido son variables cuyos valores han de ser adaptados. Desde nuestro programa simplemente las leemos (aunque podríamos usarlas directamente, claro).

destaddr = mailConfig.ADDRESS
fromaddr = mailConfig.FROMADD
toaddrs = mailConfig.TOADDRS
subject = mailConfig.SUBJECT
smtpsrv = mailConfig.SMTPSRV
loginId = mailConfig.LOGINID
loginPw = mailConfig.LOGINPW

imgFile = '/tmp/imagen.png'


Por defecto fijamos un nombre para la imagen que enviaremos, aunque desde la línea de invocación podríamos elegir otro.

Tenemos una dirección de envío de correos por defecto (destaddr) pero también podemos pasar una desde la línea de instrucciones (poco robusto, no se verifica nada).

A partir de allí, construímos el mensaje.

Detección y configuración del tipo de objeto que envíamos:

format, enc = mimetypes.guess_type(imgFile)
main, sub = format.split('/')
adjunto = MIMEBase(main, sub)


De esta forma, el programa nos serviría para enviar ficheros de distintos tipos y no sólo imágenes.

Generación del adjunto, codificación y se añade al mensaje que estamos construyendo:

adjunto.set_payload(open(imgFile,"rb").read())
Encoders.encode_base64(adjunto)
adjunto.add_header('Content-Disposition', 'attachment; filename="%s"' % imgFile)
mensaje.attach(adjunto)


Y, finalmente, añadimos el resto de parámetros del mensaje:

mensaje['Subject'] = subject
mensaje['From'] = fromaddr
mensaje['To'] = destaddr
mensaje['Cc'] = toaddrs


El mensaje va vacío, no tiene texto (Ejercicio para el lector: ¿le añadimos un texto? Se me ocurre algo así como: ‘Fotografía tomada el día xx-xx-xxxx a las hh:mm’).

Para terminar, hacemosel envío (negociando directamente con el servidor de
correo en envío):

server = smtplib.SMTP()

server.connect(smtpsrv)
server.ehlo()
server.starttls()
server.login(loginId, loginPw)
server.sendmail(fromaddr, [destaddr]+[toaddrs], mensaje.as_string(0))
server.quit()


Y, ya tenemos un programita en Python que enviará por correo el fichero que le pasemos como parámetro a la dirección que le indiquemos. O a la dirección por defecto, el fichero por defecto.
Además envía siempre una copia a toaddrs para que tengamos constancia de todos los mensajes.

Sobre la configuación, tanto destadrr como fromaddr y toaddrs deberían ser
direcciones de correo válidas.

El servidor smtpsrv puede ser cualquiera que podamos utilizar y el programa
supone que es autentificado (de ahí la necesidad de configurar un usuario y
una contraseña). Por ejemplo, para hacer el envío cifrado a través de los
servidores de Google, podríamos usar:

smtpsrv='smtp.gmail.com:587'


Y como usuario y contraseña uno que utilicemos nosotros habitualmente.

Un pensamiento en “Enviar una imagen por correo en Python

  1. Pingback: Detección de paso con el sensor de distancia | Mbpfernand0's Blog

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s