Site personnel d'Arnaud Brunet

Envoyer un email simple avec cURL

Publié le 9 Dec 2025 ·  #curl, #smtp, #email

curl est principalement connu pour les requêtes HTTP, mais c’est un outil très polyvalent qui prend en charge de nombreux protocoles, y compris le SMTP (Simple Mail Transfer Protocol). Apprendre à l’utiliser pour envoyer des emails permet de se passer de clients mail comme sendmail ou mutt dans des environnements contraints (comme des conteneurs Docker ou des serveurs sans configuration locale).

Les prérequis SMTP

Pour envoyer un mail, vous avez besoin de connaître trois informations essentielles :

Le défi : Structurer le message

Le protocole SMTP nécessite que le message soit envoyé en deux parties distinctes :

En Bash, nous allons utiliser les commandes echo pour générer ces lignes, puis les “piper” (|) directement à curl.

La commande magique

La clé pour que curl lise le contenu du message depuis le pipe est l’option –upload-file - (où - signifie lire depuis l’entrée standard).

Voici la structure complète de la commande que vous pouvez lancer dans un terminal :

# Configuration rapide
SMTP_SERVER="smtp://mon-serveur.mon-domaine.fr"
EXPEDITEUR="support@mon-domaine.fr"
DESTINATAIRE="utilisateur@mon-domaine.fr"
SUJET="Test d'envoi via CURL"
CORPS_MESSAGE="Ceci est le corps de mon email. Il gère les retours à la ligne si j'utilise \n dans un script."

# La commande complète en une seule ligne
{ 
    echo "From: $EXPEDITEUR"; 
    echo "To: $DESTINATAIRE"; 
    echo "Subject: $SUJET"; 
    echo "Content-Type: text/plain; charset=UTF-8";
    echo ""; 
    echo -e "$CORPS_MESSAGE"
} | curl --url "$SMTP_SERVER" \
         --mail-from "$EXPEDITEUR" \
         --mail-rcpt "$DESTINATAIRE" \
         --upload-file - \
         --verbose

Explication des options curl :

Astuce pour le “Silence”

Une fois que vous êtes sûr que l’envoi fonctionne, vous voudrez que votre script soit silencieux. Le serveur SMTP renvoie souvent un code de succès (ex. : 250 OK), ce qui pollue la sortie standard.

Pour rendre l’envoi silencieux et masquer les messages de succès, modifiez la fin de la commande :

... | curl --url "$SMTP_SERVER" ... --upload-file - > /dev/null 2>&1

Intégration dans les scripts Bash

Dans un script, il est préférable d’encapsuler la logique dans une fonction pour faciliter la gestion des erreurs.

La fonction send_emailci-dessous repose sur l’utilisation de variables globales que vous devez définir au début de votre script.

Variables d’environnement:

Fonction de journalisation:

La fonction log sert uniquement à enregistrer l’envoi dans un fichier. Elle est définie par :

log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "/var/log/email_script.log"
}

Fonction d’envoi des emails:

#
# Envoi d'un email
# $1: destinataire
# $2: sujet
# $3: contenu
#
send_email() {
    local to="$1"
    local subject="$2"
    local content="$3"

    # Logique optionnel pour ne pas envoyer les emails aux destinataires réels pendant les phases de tests
    if [[ "$ENV" == "TEST" ]]
    then
        subject="[TEST] $subject"
        to="$EMAIL_TEST"
    fi

    log "Envoi email '$subject' à '$to'"

    if ! {
        echo "From: $SMTP_FROM"
        echo "To: $to"
        echo "Subject: $subject"
        echo "Content-Type: text/plain; charset=UTF-8"
        echo ""
        echo -e "$content"
    } | curl --silent --mail-from "$SMTP_FROM" --mail-rcpt "$to" --url "$SMTP_MTA" --upload-file - > /dev/null 2>&1
    then
        log "Echec lors de l'envoi de l'email '$subject' à '$to'"
        return 1
    fi
}

Conclusion

L’utilisation de curl pour l’envoi d’emails en SMTP est une technique puissante qui démontre la polyvalence de cet outil.

En maîtrisant la structure MIME des en-têtes et en utilisant l’option --upload-file -, on obtient une solution d’envoi d’emails légère, sans dépendance externe (hormis curl et le serveur SMTP), et parfaitement intégrable dans n’importe quel script Bash.

Cette méthode est particulièrement précieuse pour :