enviar correo con python
Alatar
kh_alatar en telefonica.net
Mie Feb 28 17:24:19 CET 2007
Hola a ambos, Omar Alberto y Roylan.
Como veo que os interesa, os mando la rutina entera de nuevo con los
imports y un ejemplo de uso. Para hacerla me he basado en los consejos
de la lista, en algunos ejemplos encontrados en la red y en varias
horitas nocturnas de ensayos/error XD
He de advertiros que además yo la he retocado para gestionar diferentes
encodes, porque no todos los hosts de correo (hotmail, yahoo, gmail,
etc...) utilizan el mismo. Pero no os incluyo los retoques en esta
versión para que el código sea más claro y porque todavía tengo que
efectuar algunos ajustes. Por lo demás la rutina funciona a la
perfección, salvo que al hacer el copy paste haya cometido algún error.
Por favor, si haceis vosotros copy paste, repasad las indentaciones (que
no sea ese el problema) ;)
#----------------------
import os
import smtplib
import string
import email
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
from email.Utils import formatdate
from email import Encoders
#_________________
def mandar_mail(
pm_servidor_correo,
pm_login_usuario,
pm_login_password,
pm_emisor_nombre,
pm_emisor_correo,
pm_receptor_nombre,
pm_receptor_correo,
pm_asunto,
pm_archivo_texto,
pm_archivo_html,
pm_adjuntos = [],
pm_acuse_recibo = False,
pm_imagenes_embebidas = []):
"""
Rutina para mandar correo electrónico, permitiendo mandar el
mensaje alternativa/conjuntamente en modo texto y html, así como
con archivos adjuntos, imágenes embebidas y pudiendo solicitar
confirmación de lectura.
"""
assert type(pm_adjuntos) == list
assert type(pm_imagenes_embebidas) == list
#Inicializamos el mensaje a mandar y vamos añadiendo partes
msgRaiz = MIMEMultipart('related')
msgRaiz['From'] = pm_emisor_nombre + ' <' + pm_emisor_correo +'>'
msgRaiz['To'] = pm_receptor_correo
msgRaiz['Subject'] = pm_asunto
msgRaiz['Date'] = formatdate(localtime = True)
msgRaiz.preamble = '' #De momento, no lo uso
msgRaiz.epilogue = '' #De momento, no lo uso
if pm_acuse_recibo:
msgRaiz['Disposition-Notification-To'] = pm_emisor_correo
#Se encapsulan las versiones de texto plano y html del cuerpo
#del mensaje en una parte 'alternative' para que el cliente de
#correo decida qué parte mostrar
msgAlternativo = MIMEMultipart('alternative')
msgRaiz.attach(msgAlternativo)
#Abrimos mensaje de texto alternativo y lo añadimos
msgTexto = MIMEText(pm_archivo_texto, 'plain', pm_encoding_cuerpo)
msgAlternativo.attach(msgTexto)
#Abrimos mensaje html alternativo y lo añadimos
msgHtml = MIMEText(pm_archivo_html, 'html', pm_encoding_cuerpo)
msgAlternativo.attach(msgHtml)
#Añadimos las imágenes embebidas, si las hay
for imagen in pm_imagenes_embebidas:
#Cargar imagen
archivo_imagen = open(imagen, 'rb')
msgImage = MIMEImage(archivo_imagen.read())
archivo_imagen.close()
#Hemos de adjuntar la imagen en el content-id.
#En el archivo html se debe hacer referencia al content-id
#como fuente en el source de la imagen, por ejemplo:
#<img src="cid:/nombre/de_la_ruta_entera/imagen.jpg">
msgImage.add_header('Content-ID', '<' + imagen + '>')
msgRaiz.attach(msgImage)
#Añadimos los ficheros adjuntos a mandar , si los hay
for file in pm_adjuntos:
adjunto = MIMEBase('application', "octet-stream")
adjunto.set_payload(open(file, "rb").read())
Encoders.encode_base64(adjunto)
adjunto.add_header('Content-Disposition', 'attachment; filename
= "%s"' % os.path.basename(file))
msgRaiz.attach(adjunto)
#Conectamos con el servidor de correo y mandamos el mensaje
servidor = smtplib.SMTP(pm_servidor_correo)
#servidor.set_debuglevel(1)
servidor.ehlo()
servidor.login(pm_login_usuario, pm_login_password)
try:
servidor.sendmail(pm_emisor_correo, pm_receptor_correo,
msgRaiz.as_string())
servidor.quit()
resultado = True
except:
resultado = False
return(resultado)
#-----------------------------------
Para el ejemplo de llamada debeis tener el mensaje en formato texto
("mensaje_ejemplo.txt") y en formato html ("mensaje_ejemplo.html"). Y
supondremos también que quereis adjuntar un archivo en formato pdf
("archivo_ejemplo.pdf"). Añadiremos otros literales de ejemplo para los
demás parámetros:
pm_servidor_correo = 'smtp.telefonica.ent'
pm_login_usuario = 'tunombredeusuario$telefonica.net'
pm_login_password = 'tupassword'
pm_emisor_nombre = 'Tu Nombre en Bonito'
pm_emisor_correo = 'tucorreo en telefonica.net'
pm_receptor_nombre = 'El Nombre del Receptor en Bonito'
pm_receptor_correo = 'correodelreceptor en hotmail.com'
pm_asunto = 'El asunto del mensaje'
pm_archivo_texto = 'mensaje_ejemplo.txt'
pm_archivo_html = 'mensaje_ejemplo.html'
pm_adjuntos = ['archivo_ejemplo.pdf']
pm_acuse_recibo = False
pm_imagenes_embebidas = []
La llamada sería:
mandar_mail( pm_servidor_correo, pm_login_usuario, pm_login_password,
pm_emisor_nombre, pm_emisor_correo, pm_receptor_nombre,
pm_receptor_correo, pm_asunto, pm_archivo_texto,
pm_archivo_html, pm_adjuntos, pm_acuse_recibo, pm_imagenes_embebidas)
Espero os sea de ayuda ( ya me contareis),
Alatar ;)
Más información sobre la lista de distribución Python-es