lindev.fr

Aller au contenu | Aller au menu | Aller à la recherche

25 mai 2015

Gérer les Bounces avec Amazon

Ce billet va présenter deux outils Amazon autour d'un exemple concret, la gestion des Bounces en utilisant Amazon en relais pour vos mails.

Bounces

Lorsque vous envoyez une "newsletter" à de nombreuses adresses mails, il y a ce que l'on appel les "BOUNCES" , qui traduit donne "rebonds". Il s'agit en fait du retour des mails qui partent vers une adresse qui ne fonctionne pas. Il y a plusieurs raisons qui peuvent engendrer un tel rebond, certaines raisons sont temporaires, d'autres définitives. Par exemple :

  • Le destinataire n’existe pas ( définitif )
  • Boite pleine ( temporaire )
  • Erreur Serveur ( temporaire )
  • Plainte ( définitif )
  • Pas de réponse ( temporaire )
  • Pas de résolution DNS ( définitif )

Pourquoi traiter ces rebonds ?

Tout est une histoire de réputation, en effet ne pas traiter ces rebonds et les laisser s'augmenter à chaque newsletter, peut tout doucement vous faire passer pour un "spammeur", d'autant que nous utilisons le relais mails Amazon ( service SES ) qui va réduire votre capacité à envoyer des mails si le nombre de bounces augmente sans action de votre part.

Deuxième raison, financière, pourquoi continuer à envoyer et payer des mails à des adresses qui n’existent pas ! ( ok le cout du mail est ridicule avec Amazon, mais c'est une question de principe )

Comment les gérer ?

Souvent, vous définissez une adresse de retour via ue entête spécifique, dédiée au retour "système" ( Entête : return-path ), ainsi les bounces atterrissement dans cette boite mail dédiée et c'est à vous de les traiter. ( les outils des mailing intègrent souvent une fonction de récupération des bounces par une lecture de boite mail en pop ).

Cependant, Amazon permet d'aller un peu plus loin grâce à son service de notification SNS.
Le principe est simple, lorsque Amazon reçoit un "Bounce" il va transmettre un message de notification dans le topic associé . A ce "topic" nous allons lui associer une "inscription" ( qui est en fait une action à lancer lorsque qu'un "message" arrive sur ce topic ). Dans notre cas, ce sera une simple requête HTTP avec dans son corps les informations du Bounce en format JSON.

Création du Topic

Depuis l'interface Amazon SNS, vous créez un nouveau "topic"

Capture_d_e_cran_2015-05-24_a__11.04.03.png

On va le nommer Bounces

Capture_d_e_cran_2015-05-24_a__11.04.33.png

Puis nous allons créer une "subscription"

Capture_d_e_cran_2015-05-24_a__11.04.57.png

On va donc choisir le protocole HTTP et dans le champ "endpoint", nous mettons l'url qui pointe sur notre script décrit plus bas ( exemple : http://lindev.fr/sns.php )

Capture_d_e_cran_2015-05-24_a__11.05.20.png

Pour le moment, voici notre script sns.php :

<?php
ob_start();
var_dump( $_POST );
$content = ob_get_clean();
$fp = fopen('sns_validation.txt', a+);
fwrite($fp,$content);
fclose($fp);

Le but étant d'enregistrer dans un fichier texte, ce que nous envoi Amazon . NÉCESSAIRE AU DÉBUT POUR LA VALIDATION DE LE SOUSCRIPTION

Vous pouvez maintenant valider votre formulaire d'ajout de "subscription", vous allez alors voir apparaitre dans le fichier sns_validation.txt une url pour valider définitivement l'enregistrement.
Il vous suffit alors d'ouvrir cette url pour terminer l'enregistrement.

SES et SNS, le lien

Maintenant nous allons faire en sorte que tout les bounces liés à un domaine géré par le service SES d'amazon, utilisent le système de notification SNS et surtout le "topic" fraichement créé.

Pour cela, nous allons dans la section SES d'amazon, ( le domaine doit auparavant être validé pour pouvoir relayer des mails, pour cela il suffit d'ajouter des champs TXT dans la zone DNS. La documentation d'amazon est très bien faite à ce sujet ).

Nous allons donc dans la section Notifications, et l'on édite la configuration

Capture_d_e_cran_2015-05-24_a__11.06.36.png

Et là nous allons choisir les options adéquats

Capture_d_e_cran_2015-05-24_a__11.06.52.png

On sélectionne donc notre souscription dans les menus "Bounces" et "Complaints" uniquement, car ce sont ces deux cas que nous souhaitons traiter automatiquement.

Et voilà, après validation, dés qu'un "bounce" montre le bout de son nez, un message est transmit au service SNS et une requête HTTP avec toutes les informations nécessaires dans un format JSON est lancée en POST.

Tests

Pour tester le service, Amazon nous met à disposition des adresses spécifiques, qui simulent chaque cas.

  • bounce@simulator.amazonses.com
  • complaint@simulator.amazonses.com

Ne vous reste donc plus qu'à envoyer un mail à ces deux adresses, et regarder le contenu des données POST qui vont s'ajouter dans votre fichier sns_validation.txt

Cas simple

Imaginons, que nous souhaitons, simplement lister les mails des Bounces et Complaints dans un fichier TXT avec trois champs

  1. Date de réception du Bounce
  2. Adresse mail
  3. Type de Bounce ( temporaire ou définitif ou complaint ).

Nous allons donc extraire ces données du JSON, notre script sns.php devient :

<?php

// Fetch the raw POST body containing the message
$postBody = file_get_contents('php://input');

// JSON decode the body to an array of message data
$msg = json_decode($postBody, true);

if ($msg) {

    //Ouverture du fichier de log
    $fp = fopen('sns_bounces.txt', 'a+');

    $data = json_decode($msg['Message'],true);
    $typeMsg = $data['notificationType'];//A utiliser pour séparer plaintes et Bounces

    switch( $typeMsg ){
        case 'Bounce':
            $bounceType = $data['bounce']['bounceType'];
            foreach( $data['mail']['destination'] AS &$mail ){
                //Ecriture dans la liste txt
                fwrite($fp, date('Y-m-d H:i:s').";".$mail.";". $bounceType . "\n");
            }
        break;
        case 'Complaint':
            foreach( $data['mail']['destination'] AS &$mail ){
                //Ecriture dans la liste txt
                fwrite($fp, date('Y-m-d H:i:s').";".$mail.";complaint" . "\n");
            }
        break;
    }
    fclose($fp);

}

Vous allez alors vous retrouver avec une liste exploitable comme un CSV .

L'idée, c'est d'améliorer ce script de démo pour une désinscription automatique dans votre outil de mailing ( très simple avec phplist )

Restez informé

inscrivez vous à la newsletter pour recevoir les nouveaux billets par mail. ( formulaire en haut à droite )

06 sept. 2010

Relayer vos mails

Installer un relais pour vos mails

passage-relais.jpg

Un petit billet pour vous montrer comment installer un relais pour vos mails avec authentification..
J'utilise ce genre de chose sur les serveurs dédiés , par exemple un dédié chez 1&1 , votre application web doit envoyer des mails pour une raison X ou Y , vous avez beau faire ce que vous voulez , ( belles entêtes , structures propres et aux normes , config dns pour déclarer votre serveur comme expéditeur , signature dkim ect ... ) certaines boites ne laisserons pas passer ...
Et ... quel boulot .

En utilisant les serveurs SMTP de votre prestataire , cela vous rendra la tâche déjà bien plus simple et rapide .
Seule la structure du mail devra évidemment être parfaite .. du coté serveur ... rien à gérer .. ouf !

Allons y ..

Ressources : postfix sasl

Installation

Nous allons installer le minimum requis pour notre relais , à savoir postfix et ses paquets liés pour sasl

apt-get postfix libsasl2 sasl2-bin libsasl2-modules libdb3-util

Vous voilà avec un serveur smtp .. chouette , vous pouvez expédier des mails directement ( serveur SMTP : 127.0.0.1 ) .. c'est bien , mais encore insuffisant pour ce que nous souhaitons faire.

Configuration :

La configuration se passe principalement dans le fichier main.cf .
Commençons donc par l'éditer :

vim /etc/postfix/main.cf

Nous allons modifier / ajouter les lignes suivantes :

relayhost = auth.smtp.1and1.fr

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd
smtp_sasl_security_options = noanonymous

Bon voilà vous l'avez deviné , pour l'exemple , j'utilise les serveurs SMTP de 1and1 , défini donc au niveau de la ligne relayhost.

relayhost

La machine par défaut où livrer le courrier extérieur .
Si aucun relayhost n'est renseigné, le courrier est routé directement vers sa destination finale (champs MX).

smtp_sasl_auth_enable

Active l'authentification SASL dans le client SMTP de Postfix. Par défaut, le client SMTP de Postfix n'utilise pas d'authentification.

smtp_sasl_password_maps

Tables optionnelles de consultation du client SMTP contenant une entrée username:password par nom de machine ou domaine distant.

smtp_sasl_security_options

Options de sécurité SASL



Il est temps maintenant de s'occuper du couple login/pwd , chez 1and1 , il vous faut simplement creer un compte mail , le login sera donc votre adresse , et le mot de passe celui defini à la création du compte.
Pour définir ces paramètres , vous avez certainement remarqué que postfix fait appel à une table de hash hash:/etc/postfix/sasl/sasl_passwd , commençons donc par créer ce fichier.

vim /etc/postfix/sasl/sasl_passwd

A l'intérieur de ce fichier , il vous faut écrire la ligne comme ceci :

nom_du_serveur    login:motdepasse

Ensuite créons cette table de hashage , via postmap

postmap /etc/postfix/sasl/sasl_passwd

Nous voilà à la fin de notre configuration de notre serveur mail en relais pour nos applications , il reste la dernière étape , relancer postfix et vérifier les logs .

/etc/init.d/postfix restart

Pour les logs :

tail -f /var/log/mail.log

Tests

Pour les tests, un simple appel à la fonction php mail() , va envoyer le mail à postfix qui lui va demander au serveur de votre prestataire de le relayer , et ce de façon officiel ( si le mail est correct il sera reçu partout , même dans les boites hotmail et yahoo :) )

Sep  6 22:09:11 s15407375 postfix/pickup[29187]: 10E2F401A53: uid=33 from=<www-data>
Sep  6 22:09:11 s15407375 postfix/cleanup[29308]: 10E2F401A53: message-id=<20100906200911.10E2F401A53@s15407375.onlinehome-server.info>
Sep  6 22:09:11 s15407375 postfix/qmgr[23225]: 10E2F401A53: from=<www-data@s15407375.onlinehome-server.info>, size=410, nrcpt=1 (queue active)
Sep  6 22:09:12 s15407375 postfix/smtp[29310]: 10E2F401A53: to=<monadresse@mondomaine.fr>, relay=auth.smtp.1and1.fr[212.227.15.184]:25, delay=1.1, 
delays=0.09/0.01/0.06/0.97, dsn=2.0.0, status=sent (250 Message 0LlpLM-1OJeIZ1ir2-00ZaNS accepted by mrbap1.kundenserver.de)
Sep  6 22:09:12 s15407375 postfix/qmgr[23225]: 10E2F401A53: removed

Good Job .

J'espère que ce billet vous a intéressé , à bientôt ,
Christophe.