L'appartement

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

Tag - php

Fil des billets

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

mardi, novembre 3 2009

Génération de graphiques de bilan énergétique avec Imagemagick

Dans le cadre de la réalisation du site d'une agence immobilière, J'ai codé une petite classe en PHP qui permet de générer les graphiques des bilans de performance énergétique.

Il s'agit simplement de placer correctement l'indicateur de valeur au bon endroit sur le graphique. Via l'excellent programme ImageMagick, j'effectue donc le "montage" entre l'image source et l'indicateur. La subtilité réside dans le calcul permettant le placement correct sur la bonne "lettre" (A,B,C,D,E,F). L'échelle de valeur n'est en effet pas progressive.

Bilan Energetique Montage

Vous pouvez télécharger cette classe ou générer vos graphiques sur la page dédiée.

J'en ai profité pour me lancer dans l'apprentissage de git en lieu et place de subversion et je ne suis pas déçu ! J'ai du même coup commencé à héberger certains projets sur github.

mardi, octobre 13 2009

Une nouvelle version du script de mailing avec gestion des bounces

Disclaimer : Ce programme reste en version beta. Je l'utilise en production mais pas la peine de m'insulter si vous ne parvenez pas à l'utiliser !

Je suis heureux de proposer enfin une nouvelle version de mon script de mass mailing et d'analyse des bounces en PHP (CLI). Il y a pas mal d'améliorations et de corrections par rapport à la version précédente.

On peux déjà noter que pour plus de lisibilité, j'ai développé un mini-site avec pas mal d'informations utiles sur la chose.

Une des autres principales nouveautés réside dans l'analyse des mails invalides, via les « bounces ».

Rien n'est plus problématique qu'une liste d'abonnés à moitié fausse ! Il est de plus en plus fréquent que les fournisseurs blacklistent des adresses IP qui tentent d'expédier beaucoup trop de messages à destination d'adresses inexistantes.

Pour cette fonctionnalité, j'ai choisi d'analyser la boite qui reçoit les erreurs (celle précisée par l'entête return-path du mail).

Tant que tous les serveurs de mail ne se donneront pas la main pour chanter en cœur ne respecteront pas les RFCs à ce sujet, je ne pense pas qu'il y aura d'autre solution efficace !

Je me suis basé sur une classe trouvée sur Sourceforge [1] et mon collègue Zas a pas mal bricolé sur cette partie (corrections de bugs et optimisations) en plus des corrections sur le reste de sendNews ;)

Cette version de sendNews est depuis quelques temps en production et je suis assez satisfait du résultat. Il manque un certain nombre de règles d'analyse des bounces pour être réellement exhaustif. Quoiqu'il en soit, mes listes de diffusion ne contiennent pas un nombre beaucoup trop important d'adresses non valide.

Tous les feedbacks sur ce script sont les bienvenus !

Le site mini-site sendNews

Précédemment sur le même sujet

Notes

[1] Le développement de cette classe (bmh) a repris sous la houlette des créateurs de PHPMailer, je n'ai pas encore eu le temps d'apprécier le refactoring qui a été réalisé

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 ;)

lundi, mars 24 2008

A la découverte de Jelix, l'essayer c'est l'adopter

Logo JelixMalgré tous les avantages que j'ai pu trouver à mon framework mes bouts de codes personnels basés sur plusieurs librairies PEAR, je me suis tourné vers quelques choses de plus "moderne" et plus homogène pour mes nouveaux développements. Après pas mal de recherches et d'essais, mon choix c'est porté sur Jelix.

Ca tombe bien. Un nouveau projet dont les contraintes correspondent parfaitement à l'utilisation de ce framework me permet donc actuellement de me frotter à la bête... Et je ne suis pas déçu !

Je ne vais pas rentrer dans le détail des fonctionnalités mais il y a tous ce qu'on peux rechercher dans un framework PHP5 orienté objet et de classe américaine. Jelix ne pas fait le café comme Symfony (que j'ai essayé également et qui possède de nombreux avantages) et c'est justement pas ce que je lui demande car je souhaite garder la compréhension globale de ce que j'utilise. C'est léger, rapide et extensible. Bref, que du bon pour l'instant ;)

Voici ce que j'en retiens principalement (liste non exhaustive). J'ai précisé, pour mémoire, les équivalents de ce que j'utilisais comme librairies PEAR :

  • ORM puissant. J'utilisais PEAR::MDB2 très efficace aussi. Surtout la gestion transactions
  • système de templates. Beaucoup mieux que PEAR::HTML_Template_Flexy pour lequel la syntaxe dans le template reste assez réduite (exemple : impossible d'utiliser des opérateurs de comparaisons)
  • localisation. PEAR::Translation2 ne m'a jamais réellement séduit.
  • génération de formulaire. Quand on a prit l'habitude d'utiliser PEAR::HTML_Quickform, on recherche forcément quelque chose de similaire.
  • système de cache. Je n'ai pas encore eu la possibilité de comparer avec les performances de PEAR::Cache_Lite mais ça semble équivalent.
  • Quelques modules bien utiles comme la génération de CRUD, le module d'authentification, les acls...

La présentation détaillée et une application de tests sont disponibles sur le site officiel. Il ne vous reste plus qu'à essayer ;)

Si vous aviez l'intention de vous rendre aux Rencontres Mondiales du Logiciel Libre 2008 à Mont-de-Marsan, assistez à la conférence sur Jelix de Laurent Jouanneau et vous en apprendrez encore plus !

vendredi, novembre 9 2007

Petite mise à jour du script de mass mailing

Mass

C'est une mise à jour mineure. Les fonctionnalités sont les même que celles de la première version

J'ai eu quelques soucis avec la classe Zend_Mail. Lors d'un envoi, suite à une mise à jour de Zend_Mail, je me suis retrouvé avec des groupes de destinataires en copie au lieu d'un envoi unitaire (pas très sérieux !).

J'ai donc utilisé le "bon vieux" PHPMailer. J'en ai aussi profité pour remplacer PEAR::DB par PDO. Ce qui rend le script plus léger et plus simple à installer ;) . Je l'ai également doté d'un fichier de configuration séparé.

Changelog :

  • Utilisation de PHPMailer à la place de Zend_Mail
  • Utilisation de PDO à la place de PEAR::DB
  • Changement esthétique.
  • Un fichier de configuration séparé.

Documentation

Vous devez télécharger PHPMailer, disposer de PHP5 et l'extension PDO.

Pour le reste, la documentation de la première mouture est toujours valable. Vous pouvez également utiliser toutes les options disponibles dans PHPMailer pour adapter ce script à votre convenance (je vous laisse chercher dans le script).

Important : Ce programme est fourni sans aucune garantie même si je l'utilise toutes les semaines pour une newsletter de 30 000 abonnés.

A faire :

  • une option pour préciser le chemin du fichier de configuration
  • en extra, toujours le gros boulot qui consiste à analyser les retours de mail (Delivery Error).

Téléchargement

télécharger le script

jeudi, juillet 5 2007

Plugin importer des auteurs

Logo importer des auteursUn nouvelle version de mon plugin SPIP qui permet de créer des auteurs en masse à partir d'un fichier csv.

Outre l'ajout de plusieurs fonctionnalités, j'ai fais en sorte que le code soit modifiable assez facilement pour une personne ayant quelques connaissances en PHP. On m'a en effet plusieurs fois demandé comment modifier le plugin pour choisir les identifiants et mot de passe, avoir un mot de passe identique à l'identifiant...

Plus d'informations sur l'article Importer des auteurs v-0.5

dimanche, juillet 1 2007

Passage du blog sous Dotclear 2

dotclear_pw.png Etant un utilisateur de la première heure de Dotclear, je me devais de passer sur Dotclear 2 Beta6. Utilisation du plugin Flat Export, changement des chemins d'images avec une ou deux requête SQL bien placée*, mise en place des redirections des anciennes URL vers les nouvelles... Reste plus que le thème à changer pour remettre le mien.

  • mes requêtes SQL pour le changement de /blog/images en /blog/public/images dans les champs post_content et post_content_xhtml de la table dc_post :
UPDATE dc_post SET post_content = replace(post_content,'blog/images','blog/public/images');
UPDATE dc_post SET post_content_xhtml = replace(post_content_xhtml,'blog/images','blog/public/images');