Tym-Project

From: SUPINFO
To: Tous
Subject: IT

Envoyer Un E-mail via Gmail en Ligne De Commande

Gmail, on le sait tous, est un outil très répandu. Souvent même dans le monde de l’entreprise avec Google Apps. Pourquoi alors ne pas l’utiliser pour envoyer des alertes, logs ou autres sauvegardes depuis un serveur Linux ? Allons-y…

Pour envoyer un e-mail depuis un script il-y-a en général un passage obligé : un serveur SMTP en local. Hum, trop peu pour moi, surtout pour envoyer un log tous les mois ! Heureusement Esmtp est là. C’est un outil formidable et simplissime qui n’a qu’un seul rôle : servir de relais STMP. Autrement dit, il est incapable d’envoyer un e-mail directement, mais seulement de le transmettre à un autre serveur SMTP.

La base : ESMTP

Commencez par installer le package (ici sur Debian/Ubuntu) :

apt-get install esmtp

Créez, si il n’existe pas, le fichier ~./esmtprc et changez ses droits :

touch ~/.esmtprc
chmod 0700 ~/.esmtprc

Passons au contenu du fichier, je le rappelle, propre à Gmail :

#file ~/.esmtprc
identity example@gmail.com
    hostname smtp.gmail.com:587
    username "example@gmail.com"
    password "p@ssw0rd"
    starttls required

Gmail utilisant tls (ssl), il va vous falloir obtenir le certificat qu’il utilise. On va donc récupérer les principaux certificats utilisés sur le web, avec [man]curl[/man] :

1
2
3
4
5
apt-get install curl
mkdir ~/.authenticate
chmod 700 ~/.authenticate
curl http://curl.haxx.se/ca/cacert.pem >~/.authenticate/ca.pem
chmod 600 ~/.authenticate/ca.pem

Attention à bien mettre les bons droits sur les répertoires, sans quoi cela ne fonctionnera pas (plus de détails dans la suite).

Et pour envoyer un bête mail ?

Un simple script fera l’affaire :

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

# Entête du message
echo "To: copain@example.com Subject: Test de mail From:example@gmail.com " > /tmp/mail

# Corps du message
echo "Salut copain, je t'envoie un e-mail !" >> /tmp/mail

# Envoie du message
esmtp -tv < /tmp/mail

[man]esmtp[/man] prends ici deux options : -t pour lire l’entête, -v pour le mode verbeux. Si tout se passe bien vous obtiendrez une sortie dans ce style… et un e-mail à l’autre bout bien entendu :

Connected to MTA
StartTLS OK (128 bits)
From example@gmail.com: 250 OK k7sm4581630wej.2
To copain@example.com: 250 OK k7sm4581630wej.2
Message data: .
Message sent: 250 OK 1280951004 k7sm4581630wej.2
Disconnected to MTA

Sinon, rappelez vous des droits sur les certificats :

Connected to MTA
StartTLS extension not supported by MTA
Disconnected to MTA
0 (null)
example@gmail.com: 0 (null)

Et avec une pièce jointe ?

Dans ce cas je n’ai pas, pour le moment, trouvé d’autre solution que d’installer [man]sendmail[/man] avant tout. Il va servir d’interface, en tant que daemon, avec Esmtp.

apt-get install sendmail

Une Perl

vous pouvez utiliser un script Perl par exemple :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl -w
use strict;
use warnings;
use MIME::Lite;

my $Message = new MIME::Lite
    From =>'example@gmail.com',
    To =>'copain@example.com',
    Subject =>"Mon mail avec un fichier",
    Type =>'multipart/mixed';
$Message -> attach(
    Type => 'TEXT',
    Data => "Voici le fichier",
    );
$Message -> attach(
    Type => 'text/plain',
    Path => "log.txt",
    Filename => "log.txt",
    );

$Message -> send;

Attention ici aux type Mime (cf. Global MIME Types) pour le fichier joint…

Python !

Ou du python (j’aime :)). On crée un module générique (source : Send email with attachment(s) in Python) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import smtplib
import os
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

def send_mail(send_from, send_to, subject, text, files=[],server="localhost"):
    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)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.close()

Et son appel :

1
2
3
4
5
import my_send_mail
my_send_mail.send_mail("example@gmail.com",
    ['copain@example.com'],
    "Mon mail avec un fichier",
    "Voici le fichier",['log.txt'])

Bon envois ;-)

Comments