python et les mails

envoie d’un email txt

On souhaite envoyer via l’adresse f.aoustin@kff.fr un message vers fraoustin@gmail.com contenant

Bonjour!
text a envoyer
import smtplib
# un message email de type text
from email.MIMEText import MIMEText

def send(mfrom,mto):
    email = MIMEText('Bonjour !\ntext a envoyer')              # objet Message contenant du text/plain
    email['From']=mfrom                        # headers du mail : from/to/subject
    email['To']=mto
    email['Subject']='Bonjour !'
    server = smtplib.SMTP('smtp.fr.oleane.com')         # objet serveur
    #server.login('user', 'password')
    server.sendmail(mfrom,                     # on lui envoi notre mail
                mto,
                email.as_string())
    server.quit()                              # on ferme la connection

if __name__ == '__main__':
    send('f.aoustin@kff.fr','fraoustin@gmail.com')

envoie d’un email txt+html

#! /usr/bin/python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
me = "f.aoustin@kff.fr"
you = "f.aoustin@kff.fr"
msg = MIMEMultipart('alternative')
msg['Subject'] = "Link"
msg['From'] = me
msg['To'] = you
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.python.org"
html = """\
<html>
<head></head>
<body>
    <p>Hi!<br>
    How are you?<br>
    Here is the <a href="http://www.python.org">link</a> you wanted.
    </p>
</body>
</html>
"""
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
msg.attach(part1)
msg.attach(part2)
s = smtplib.SMTP('smtp.fr.oleane.com')
s.sendmail(me, you, msg.as_string())
s.close()

envoi mail par ligne de commande

#!/usr/bin/env python

import os
import sys
import logging
import syslog
import smtplib
from email.MIMEText import MIMEText

server_smtp = 'smtp.fr.oleane.com'
sender = 'f.aoustin@kff.fr'

def send(mfrom,mto, title, msg):
    email = MIMEText(msg)
    email['From']=mfrom
    email['To']=mto
    email['Subject']=title
    server = smtplib.SMTP(server_smtp)
    server.sendmail(mfrom,
            mto,
            email.as_string())
    server.quit()

if __name__ == "__main__":
    import sys
    from getpass import getpass
    try:
        to = sys.argv[1]
        subject = sys.argv[2]
        msg = ''
        for i in sys.argv[3:]:
            msg = msg + i + '\n'
    except IndexError:
        syslog.syslog('[%s][ERROR]Usage: %s <to address> <subject> <txt>' % (sys.argv[0],sys.argv[0]))
        for i in sys.argv[:]:
            syslog.syslog('[%s][ERROR]: %s ' % (sys.argv[0],i))
        print "Usage: %s <to address> <subject> <txt>" % sys.argv[0]
        raise SystemExit

    try:
        send(sender ,to, subject, msg)
    except Exception, e:
        syslog.syslog('[%s][ERROR] Login failed. (Wrong username/password?)' % sys.argv[0])
        syslog.syslog('[%s][ERROR][TO]: %s ' % (sys.argv[0],to))
        syslog.syslog('[%s][ERROR][SUBJECT]: %s ' % (sys.argv[0],subject))
        syslog.syslog('[%s][ERROR][MSG]: %s ' % (sys.argv[0],msg))
        syslog.syslog('[%s][ERROR][ERROR]: %s ' % (sys.argv[0],e))

Pour utiliser gmail il faut activier le ssl et utiliser le port 587, le server smtp.gmail.com et son compte fraoustin@gmail.com + password

def send_mail(txt):
    write_log(INFO, "send mail %s %s" % (CONF_MAIL, CONF_SUBJECT))
    server = smtplib.SMTP('smtp.gmail.com',587)
    server.ehlo()
    server.starttls()
    server.ehlo()
    server.login(login,password)

un plus compliqué avec envoie de pièces jointes

from optparse import OptionParser
import sys
import os, os.path
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import syslog

def send_mail(send_from, send_to, subject, text, files=[], server="localhost",password=""):
    """
    Send msg and attach
    """
    assert type(send_to)==list
    assert type(files)==list

    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = COMMASPACE.join(send_to)
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject

    msg.attach( MIMEText(text) )

    for f in files:
        part = MIMEBase('application', "octet-stream")
        part.set_payload( open(f,"rb").read() )
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))
        msg.attach(part)

    smtp = smtplib.SMTP(server)
    if password != "":
        smtp.login(send_from, password)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.close()

def getPathFile(p):
    """
    Test of p is file with pwd and PYTHONPATH
    """
    if os.path.isfile(p):
        return p
    if os.path.isfile(os.path.join(os.getcwd(),p)):
        return os.path.join(os.getcwd(),p)
    for i in sys.path:
        if os.path.isfile(os.path.join(i,p)):
            return os.path.join(i,p)
    raise AttributeError, '%s is not directory' % p

def getPathDir(p):
    """
    Test of p is file with pwd and PYTHONPATH
    """
    if os.path.isdir(p):
        return p
    if os.path.isdir(os.path.join(os.getcwd(),p)):
        return os.path.join(os.getcwd(),p)
    for i in sys.path:
        if os.path.isfile(os.path.join(i,p)):
            return os.path.join(i,p)
    raise AttributeError, '%s is not directory' % p

if __name__ == '__main__':
    parser = OptionParser(version="%prog 0.1")
    parser.description= "send mail with or without file"
    parser.epilog = "by Frederic Aoustin"
    parser.add_option("-f", "--from",
        dest="fro",
        help ="smtp from",
        type="string")
    parser.add_option("-t", "--to",
        dest="to",
        help ="to(s) separated by ;",
        type="string")
    parser.add_option("-s", "--server",
        dest="server",
        help ="server smtp",
        type="string")
    parser.add_option("-p", "--password",
        dest="password",
        help ="password of from",
        default="",
        type="string")
    parser.add_option("-a", "--subject",
        dest="subject",
        help ="subject of mail",
        type="string")
    parser.add_option("-b", "--txt",
        dest="txt",
        help ="text of mail, line separated by ;",
        type="string")
    parser.add_option("-x", "--files",
        dest="files",
        help ="file(s) separated by ;",
        type="string")
    (options, args) = parser.parse_args()
    try:
        fro = options.fro
        to= []
        for i in options.to.split(";"):
            to.append(i)
        serv = options.server
        password = options.password
        subject = options.subject
        txt = options.txt
        txt = txt.replace(";","\n")
        fil = []
        for i in options.files.split(";"):
            fil.append(getPathFile(i))
        send_mail(fro, to, subject, txt, fil, serv,password)
    except Exception, e:
        print parser.error(e)
        syslog.syslog('[%s][ERROR] Login failed. (Wrong username/password?)' % sys.argv[0])
        syslog.syslog('[%s][ERROR][ERROR]: %s ' % (sys.argv[0],e))

Utilisation

C:\Users\aoustin\Desktop>python mailer.py -f f.aoustin@kff.fr -t f.aoustin@kff.fr;fraoustin@gmail.com
    -s smtp.fr.oleane.com -p stingray -a TEST -b "coucou;deux lignes"
    -x C:\eula.1028.txt;C:\eula.1033.txt

envoi d’un email en UTF-8

html = template('mail',{'sensors' : SENSORS,
                                                'local' : LOCALSYSTEM,
                                        })
msg = MIMEMultipart('alternative')
msg['Subject'] = "Dashboard %s" % self.hostname
msg['From'] = APP_MAIL_FROM
msg['To'] = APP_MAIL_TO
part = MIMEText(html.encode('utf-8'),_subtype='html', _charset='utf-8')
msg.attach(part)
server = smtplib.SMTP(APP_MAIL_SMTP)
server.sendmail(APP_MAIL_FROM, APP_MAIL_TO, msg.as_string())
server.close()

envoi d’un mail contenant des images

# Send an HTML email with an embedded image and a plain text message for
# email clients that don't want to display the HTML.

from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage

# Define these once; use them twice!
strFrom = 'f.aoustin@myprop-group.com'
strTo = 'f.aoustin@myprop-group.com'

# Create the root message and fill in the from, to, and subject headers
msgRoot = MIMEMultipart('related')
msgRoot['Subject'] = 'test message'
msgRoot['From'] = strFrom
msgRoot['To'] = strTo
msgRoot.preamble = 'This is a multi-part message in MIME format.'

# Encapsulate the plain and HTML versions of the message body in an
# 'alternative' part, so message agents can decide which they want to display.
msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)

msgText = MIMEText('This is the alternative plain text message.')
msgAlternative.attach(msgText)

# We reference the image in the IMG SRC attribute by the ID we give it below
msgText = MIMEText('<b>Some <i>HTML</i> text</b> and an image.<br><img src="cid:image1"><br>Nifty!', 'html')
msgAlternative.attach(msgText)

# This example assumes the image is in the current directory
fp = open('test.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()

# Define the image's ID as referenced above
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)

# Send the email (this example assumes SMTP authentication is required)
import smtplib
smtp = smtplib.SMTP()
smtp.connect('srvxxxx1')
smtp.sendmail(strFrom, strTo, msgRoot.as_string())
smtp.quit()