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 )

22 août 2013

Django, retourner un format JSON depuis une vue

json.gif Billet express sur Django, plus précisément comment créer une réponse JSON depuis une vue.

Très simple et rapide, utiliser simplejson

Exemple de vue :

from django.http import HttpResponse
from django.utils import simplejson

def maVue(request):
    """
    Vue de test pour retourner un format JSON
    """

    #Dictionnaire qui sera transformé puis retourné
    response_data = {
        'success':True,
        'key':'value'
    }

    # ... Traitement de la vue ...

    #La réponse
    return HttpResponse(simplejson.dumps(response_data), content_type="application/json")

J'utilise ce format principalement pour les réponses de requêtes Ajax, le JSON étant le format de prédilection pour dialoguer avec du JavaScript.

Plus d'infos sur ce format ici .