La classe mail python qui tue

Le ven. 10 décembre 2010 par Kasey

J'ai fait plusieurs fois des recherches sur comment envoyer des emails en python. J'ai d'abord cherché des exemples pas vraiment fonctionnels niveau UTF-8 avant de finalement coder mon propre système mais j'ai ressemant trouvé une fonction geniale que je tenais absolument à vous partager.

Mon propre code

Trés minimal et basé sur la documentation python :

# -*- coding: utf-8 -*-

import smtplib
from email.mime.text import MIMEText

def sendEmail(email_from,email_to,subject,text):
    msg = MIMEText(text)
    msg['Subject'] = subject
    msg['From']    = email_from
    msg['To']      = email_to
    s = smtplib.SMTP()
    s.connect()
    s.sendmail(email_from,[email_to],msg.as_string())
    s.quit()

sendEmail('from@toto.com', 'to@toto.com','email subject','Rich body : %s ' % ("&é'(§è!çà)"))

Code lognote-info

Une fonction trouvé sur le net et élagué pour supprimer le support HTML, mais qui est complete dans la source. L'avantage du code ci-dessous réside dans une déclaration correcte des encodages et mimes. En effet l'email est envoyé en base64, comme çà, plus de problèmes \ö/

# -*- coding: utf-8 -*-

import smtplib, MimeWriter, mimetools, StringIO

def sendHtmlMail(email_from,email_to,subject,text):
    encoding = "base64"
    charset = "utf8"

    #déclaration des buffers
    out = StringIO.StringIO() 
    txtin = StringIO.StringIO(text)

    #déclaration et initialisation du writer
    writer = MimeWriter.MimeWriter(out)
    writer.addheader("Subject", subject)
    writer.addheader("MIME-Version", "1.0")
    writer.startmultipartbody("alternative")
    writer.flushheaders()

    #ajout de la partie text
    textPart = writer.nextpart()
    textPart.addheader("Content-Transfer-Encoding", encoding)
    pout = textPart.startbody("text/plain", [("charset", charset)])
    mimetools.encode(txtin, pout, encoding)
    txtin.close()

    #on clot le mail
    writer.lastpart()
    mail = out.getvalue()
    out.close()
    smtp = smtplib.SMTP()
    smtp.connect()
    smtp.sendmail(email_from, [email_to], mail)
    smtp.close()

sendHtmlMail("lfernandez@bearstech.com","lfernandez@bearstech.com","sujet email","""%s""" % ("&é'(§è!çà)'"))

Source : www.blognote-info.com

PS : maintenant je reçois une notification mail de chaque commentaires :) J'espère avoir le temps de proposer une case à cocher pour permettre aux utilisateurs de demander a être notifier de tout nouveau commentaire sur des billets sélectionnés.