L'appartement

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

mardi, février 1 2011

Mailings et mails transactionnels via Amazon SES (Simple Email Service)

Suite à mon billet sur le streaming avec Amazon Cloudfront[1], je vous propose d'aborder et de tester un autre service d’Amazon WebServices : Amazon Simple Email Service (SES)

De quoi s’agit-il ?

Amazon SES est un service d’envoi de mails directement via les serveurs d’Amazon WebService (AWS). Il ne s’agit pas de “créer des boîtes mails” mais de l’utiliser pour envoyer des messages transactionnels (par exemple : un mail de confirmation de commande ou d’inscription) ou des mailings.

Combien ça coûte ?

Comme les autres services d’Amazon Webservices, c’est un paiement à l’utilisation (pay for use). Les tarifs commencent à partir de 0,10 $ le millier de mails et 0,10 $ par Giga de données. Le premier Giga étant gratuit. Consultez la grille de tarification pour les détails.

Les utilisateurs d’instance Amazon EC2 (serveur d’application Amazon) bénéficient de 2000 mails gratuits par jour depuis leurs instances.

En quoi est-ce intéressant ?

Ce nouveau service est intéressant sur plusieurs aspects. En voici quelques uns.

Ne pas s’occuper de la gestion d’un serveur de mail

Vous disposez d’un serveur web simple et vous ne souhaitez pas vous encombrer avec la gestion d'un serveur de mail pour l’envoi de vos messages transactionnels ou vos mailings. Amazon permet d’une part d’envoyer vos messages directement en HTTP depuis vos scripts, et d’autre part fournit un wrapper pour Postfix (d'autres viendront sans doute) qui vous permet de diriger tous les messages sortant de votre serveur vers Amazon SES.

Améliorer la délivrabilité des messages

En plus de la relative complexité qu’il peut y avoir à maintenir un serveur de mail, une problématique récurrente se pose : que vos messages ne finissent pas dans le courrier indésirable des utilisateurs !

Pour ça, on peut compter sur la bonne réputation (supposée) des adresses IP d’Amazon et une configuration, qu'on espère correcte, de leurs serveurs. Comme d'habitude pour les services AWS, la société américaine ne fait que mettre à profit son expérience acquise dans son activité d'e-commerçant.

Tout va se jouer sur la capacité d’Amazon à maintenir une solide réputation sur les adresses IP utilisées par son service. En d’autres termes qu’aucun SPAM ne transitent par leurs serveurs !

Pour cette raison, Amazon à décider de mettre en place un système qui peut-être assez contraignant : le quota d’envoi par utilisateur augmentera (ou diminuera) progressivement uniquement si il n’y a pas de plainte relative aux messages envoyés par celui-ci et que ses listes sont propres (en fonction notamment d’un taux de rebonds[2] acceptable).

Enfin, il est indiqué que tous les mails envoyés via la plateforme sont scannés par l’antispam maison. Quel sera son niveau de tolérance ? Mystère pour l’instant sur ce point...

Vous êtes sur un hébergement mutualisé

Si vous êtes sur un hébergement mutualisé, Amazon SES peut-être également intéressant pour vous à 2 niveaux :

- Si vous souhaitez réaliser des campagnes de mailing depuis votre hébergement mutualisé mais que les contraintes volumétriques imposées par votre hébergeur ne vous le permettent pas

- Pour les points plus haut concernant la délivrabilité et la réputation parfois défaillante de certaines adresses IP d’hébergeurs mutualisés low cost.

Comment utiliser Amazon SES depuis vos scripts PHP

L’idée vous plaît ou vous souhaitez simplement essayer, rentrons dans le vif du sujet ;)

Pour vos tests, Amazon propose une sandbox (bac à sable) limitée à 200 mails par jour et depuis laquelle vous ne pouvez envoyer que vers et depuis des adresses vérifiées (voir plus bas)

Première étape, si vous n'avez pas de compte AWS, ouvrez-en un. Notez que même pour utiliser la sandbox, une carte bancaire et un numéro de téléphone valide sont nécessaires. Pour ce dernier, il y a en effet une vérification de votre identité via un callback téléphonique.

Deuxième étape, téléchargez le SDK PHP d’Amazon. A l’heure ou j’écris ces lignes, vous devez récupérer la version sur github. La version téléchargeable directement sur le site AWS ne contient pas la classe d’accès à SES.

Troisième étape, récupérez vos clés pour l'API AWS sur votre compte. Renommez le fichier config-dist.inc.php du SDK et précisez les paramètres d'authentification dedans.

Quatrième étape, ajoutez des adresses “vérifiées”. Dans la sandbox, vous pouvez envoyer des messages uniquement depuis et à destination d’adresses vérifiées. SES va envoyer à ses adresses un message contenant un lien servant à valider l’adresse.

Pour vérifier une adresse :

// appel du SDK
require_once './AWS/sdk.class.php';

// instanciation de la classe SES
$ses = new AmazonSES();

// vérifier une adresse (ou un array d'adresse)
print_r($ses->verify_email_address('yves@example.tld'));

Vous pouvez maintenant essayez le service avec cette adresse email vérifiée. Dans un premier temps, lancez une requête pour obtenir votre quota d’envoi :

print_r($ses->get_send_quota());

Si vous obtenez une réponse "200 OK" et le quota, vous pouvez tester l’envoi d’un message :

// adresse(s) de destination (vérifiées pour utiliser la sandbox)
$destination = array(
    'ToAddresses' => 'yves@example.tld', // array possible
);
$message = array(
    'Subject.Data' => 'Sujet',
    'Body.Text.Data' => 'Test'
);
$ses->send_email('yves@example.tld', $destination, $message);

Ce service étant encore en version beta, il est évident que les fonctionnalités s’étofferont au fur et à mesure des semaines.

Notes

[1] on m'a d'ailleurs fait justement remarquer dans les commentaires qu'Amazon n'était pas l'entreprise la plus respectable qui soit depuis l'affaire wikilieaks

[2] mails retournés avec une erreur

mercredi, avril 8 2009

Quelques conseils pour ne pas voir vos mails finir dans les dossiers Spam

1559606_340_1116081430036-s.jpgSuite à plusieurs questions reçues par mail, voici quelques conseils tirés de mon expérience personnelle pour optimiser vos chances de ne pas voir vos messages finir leur course dans le tant redouté dossier « courrier indésirable » des différents « grands » fournisseurs de services (Yahoo, Gmail, Hotmail et consorts).

  • Avoir un Zonecheck parfait sur son domaine. Ce qui implique notamment - ce point semble important pour Gmail - une adresse postmaster valide et un contact de domaine valide;
  • Signer ses messages sortant avec DKIM et vérifier régulièrement son bon fonctionnement. Cette signature devient réellement essentielle !
  • Configurer correctement SPF (Sender Policy Framework) sur son domaine. Et ne pas oublier les machines qui relaient et autres MX secondaires;
  • Dans la mesure de vos possibilités, demandez à vos correspondant de vous ajouter dans leurs carnets d'adresses et/ou leurs listes blanches. Ceci peux-être particulièrement utile dans le cas d'une lettre d'information. Vous pouvez envisager de glisser dans un de vos mailings une phrase du style « Pour être sur de recevoir nos messages, ajoutez lettre@domain.tld à votre carnet d'adresses »;
  • Pour les newsletters en HTML, n'incluez pas les images dans le message mais linkez sur votre serveur. N'oubliez pas la version alternative pour les webmails qui ne supportent pas HTML;
  • Pour Yahoo et Hotmail, il peux-être intéressant de remplir leurs différents formulaires [1] pour signaler que vos messages sont marqués comme Spam chez eux. La réponse et le résultat ne sont pas garanties. Ils vous préciseront d'ailleurs que ce n'est pas une Whitelist. D'après moi, ça aide quand même;
  • Pour ceux qui ont les moyens et qui aiment se faire racketter, Hotmail utilise également une sorte de whitelist officielle - et bien entendue payante - appelée SenderScore;

Dernière précision, et pas des moindre - ceci est également précisé sur le site de Yahoo - les fournisseurs utilisent également des filtres de réputation. En clair, tant que l'adresse IP de votre serveur n'est pas « connue », le risque de passer à la trappe est plus important.

Pour ce dernier point :

  • oubliez les adresses IP résidentielles
  • louez un serveur sur un réseau « connu »
  • prenez le temps de remplir les formulaires que j'évoquais plus haut

Si vous avez d'autres bonnes pratiques, je suis preneur ;)

Notes

[1] Cherchez sur le site « postmaster » de Yahoo ou sur son équivalent chez Microsoft

vendredi, avril 11 2008

Script minimaliste : nettoyer une boite aux lettres avec une expression rationnelle

Dans la catégorie des scripts minimalistes (mais néanmoins utiles), je vous propose un petit script qui permet d'effacer, en ligne de commande avec PHP CLI, certains messages d'un compte mail en fonction d'une expression régulière précisée en paramètre et qui matche le sujet du mail.

Par exemple, effacer les centaines de messages de spam qui se trouvent dans une de vos nombreuses boites tant inutiles que nécessaires ;) Autre exemple, j'exécute ce script via un cron pour nettoyer tous ce qui traine dans des boites genre postmaster, abuse (encore que cette dernière n'est pas trop pourrie par le SPAM), et autres bal « no-reply » qu'il reste quand même, pour certaines, nécessaires de consulter tous les ans régulièrement.

C'est un script clairement dédié à de la maintenance. Je vous déconseille de laisser trainer ce code n'importe ou accessible via le web.

Utilisation :

cleanmail -u=nom_utilisateur -p=mot_de_passe -s=imap.mondomain.tld:143 -e="/SPAM/i"

Pour être sur que tous le monde a compris :

  • -u= nom d'utilisateur du compte mail
  • -p= mot de passe du compte mail
  • -s= serveur (pop ou imap). Toutes les options disponibles sur la fonction imap_open de PHP sont disponible
  • -e= expression régulière qui sera « passée » à preg_match

Le script :

#!/usr/bin/php
<?php
// on supprime la limite d'éxecution d'un script php
set_time_limit(0);

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * cleanmail supprimer des mails d'une boite imap avec une pattern définie
 *
 * PHP versions 5
 *
 * LICENSE: Ce programme est un logiciel libre distribue sous licence GNU/GPL
 *
 * @author     Yves Tannier <yvesSANSPAM grafactory.net>
 * @copyright  2008 Yves Tannier
 * @license    http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version    0.1.0
 * @link       http://www.grafactory.net
 */


// aide contextuelle
$help_string = "Parametres :
                -u : utilisateur
                -p : mot de passe
                -s : serveur et port (localhost:143, localhost:110, localhost:143/novalidate-cert...)
                -e : expression régulière
                -h, --help : afficher cette aide...\n\n"
;

// recuperer les parametres passe en CLI
foreach($_SERVER['argv'] as $param) {
    // utilisateur
    if(strpos($param,"u=")) {
        $login_imap = str_replace("-u=","",$param);
        continue;
    }
    // mot de passe
    if(strpos($param,"p=")) {
        $passwd_imap = str_replace("-p=","",$param);
        continue;
    }
    // serveur et port
    if(strpos($param,"s=")) {
        $server_imap = str_replace("-s=","",$param);
        continue;
    }
    // expression reguliere
    if(strpos($param,"e=")) {
        $pattern = str_replace('-e=','',$param);
        continue;
    }
    switch($param) {
      case '-h' :
      case '--help' :
        echo $help_string;
        exit();
      case $_SERVER['SCRIPT_NAME'] :
        unset ($_SERVER['argv'][0]);
        break;
      default :
        echo "\nParamètre inconnu : ".$param."\n\n";
        exit();
    }
}

// pas d'argument
if (empty($_SERVER['argv'])) {
    echo "\nVeuillez preciser au moins un paramètre !\n\n";
    echo $help_string;
    exit();
}

// connexion
$mbox = imap_open("{".$server_imap."}INBOX", $login_imap, $passwd_imap)
            or die("Impossible de se connecter : ".imap_last_error());

echo "Connexion...\n";

// recup des headers
$headers = imap_headers($mbox);

// parcourir les messages
if(!empty($headers)) {
    echo "Recherche avec l'expression : ".$pattern."\n";
        $msgnum = 0;
        foreach ($headers as $val) {
            $msgnum = $msgnum + 1;
            $header = imap_headerinfo($mbox, $msgnum);
            $subject = $header->subject;
            if (preg_match($pattern, $subject)) {
                $mailmarked = imap_delete($mbox, $msgnum);
                echo "Message ".$msgnum." supprimé\n";
            }
        }
} else {
    echo "Aucun message dans la boite\n";
}

echo "Fin de la transaction\n";

// quitter et vider en meme temps
imap_close($mbox,CL_EXPUNGE);
?>

Bientôt le même mais en perl ;)

dimanche, novembre 4 2007

Installer DomainKeys sur Postfix (Debian Etch, Amavisd-new...)

Mise à jour le 12 mars 2008 : le même billet adapté pour DKIM est disponible : Installer la signature DKIM sur Postfix avec DKIMproxy.

Dans ma lutte incessante pour que mes messages n'aient pas comme destination finale les dossiers "courrier indésirable" des "grands" fournisseurs tels que Yahoo!, Hotmail/MSN, Gmail ect... Je vous propose aujourd'hui l'installation de la signature Domainkeys sur vos mails.

DomainKeys est un protocole de communication créé par Yahoo! (et défini par une RFC 4870). Wikipedia vous donnera un plus d'informations sur le sujet : DomainKeys sur Wikipedia

Même s'il fonctionne totalement et est déployé sur de nombreux serveurs, sachez qu'il est maintenant remplacé par une RFC plus "globale" : DKIM (Domain Keys Identified Mail). J'aborderais les différences et l'implémentation de DKIM dans un autre post.

D'autres liens :

DomainKeys bien reconnu chez Yahoo! (forcément ;)) DomainKeys

Voici la configuration du serveur de messagerie sur lequel se base ce tutoriel :

Nous allons mettre en place la configuration suivante :

postfix -> dkfilter -> postfix -> amavis -> postfix

Dkfilter est un proxy de signature et de vérification des signatures pour DomainKeys.

Ceci peut paraitre un peu lourd en regardant le schéma, mais postfix gère ce type de configuration très bien via les content filter

Comme je suis gentil et que l'informaticien est souvent fainéant, j'ai écris ce howto avec plein de copier/coller ;)

Lire la suite...