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