Envoyer un mail par SMTP en python

Nous allons voir dans ce chapitre comment envoyer un mail en SMTP avec la library smtplib.

gmail

Prenons l'exemple d'une adresse gmail, dans notre cas l'adresse sera XXX@gmail.com

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

msg = MIMEMultipart()
msg['From'] = 'XXX@gmail.com'
msg['To'] = 'YYY@gmail.com'
msg['Subject'] = 'Le sujet de mon mail' 
message = 'Bonjour !'
msg.attach(MIMEText(message))
mailserver = smtplib.SMTP('smtp.gmail.com', 587)
mailserver.ehlo()
mailserver.starttls()
mailserver.ehlo()
mailserver.login('XXX@gmail.com', 'PASSWORD')
mailserver.sendmail('XXX@gmail.com', 'XXX@gmail.com', msg.as_string())
mailserver.quit()

Ce code est indépendant de la configuration de votre serveur. Pas besoin d'installer quoi que ce soit pour que le mail puisse être envoyé.

Envoyer un mail lorsqu'une page web est défaillante

Les admins système utilisent souvent des alertes SMS ou des alertes mail pour être averti en cas de soucis sur leur serveur. Prenons un cas pratique où nous sommes dans la situation d'un serveur qui surveille un autre. Le premier check toutes les minutes si le deuxième serveur répond pour une requête HTTP et surtout si son temps de réponse est acceptable:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import urllib2
import time

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

from fabric.api import *

def send_error(t2, name):

    env.host_string = 'XXX.com'
    env.user = 'user'
    env.password = 'PASSWORD'

    # On récupère les connections actives du serveur distant
    adresses_ip = run("netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n")
    
    msg = MIMEMultipart()
    msg['From'] = 'YYY@gmail.com'
    msg['To'] = 'XXX@gmail.com'
    msg['Subject'] = 'Temps de réponse: {0} {1}s'.format(name, t2) 
    message = 'Temps de réponse: {0} - {1}'.format(t2, adresses_ip)
    msg.attach(MIMEText(message))
    mailserver = smtplib.SMTP('smtp.gmail.com', 587)
    mailserver.ehlo()
    mailserver.starttls()
    mailserver.ehlo()
    mailserver.login('XXX@gmail.com', 'PASSWORD')
    mailserver.sendmail('XXX@gmail.com', 'XXX@gmail.com', msg.as_string())
    mailserver.quit()

t1 = time.time()

try:
    response = urllib2.urlopen('http://XXX.com')
    html = response.read()
except:
    t2 = time.time() - t1
    send_error(t2, "EXCEPTION")

t2 = time.time() - t1

if t2 > 5:
    send_error(t2, "TIMEOUT")

Pour exécuter ce script toutes les minutes, pensez à éditer votre crontab.