Comment envoyer des mails avec l'API Elastic Email

 

De nos jours, il est devenu quasiment impossible de router une newsletter ou des mails sans avoir recours à une solution de routage type Mailjet ou Mailgun. L'offre des API d'envoi de mail s'est étoffée, et de nouveaux acteurs sont apparus sur le marché.

Mais la plupart (Mailjet, Sendgrid ou Sendinblue) sont plutôt chers et ne proposent rien en-dessous de 14€/mois. Sinon c'est l'offre gratuite, insuffisante dès que vous newsletter dépasse les 200-300 abonnés. Ils devraient vraiment proposer un palier intermédiaire car, à part une grosse entreprise, je ne vois vraiment pas qui peut supporter un budget pareil !

J'ai d'abord cru que, à l'instar de Mailgun, la Canadien Elastic Mail proposait une tarification proportionnelle à l'utilisation (0,10$/1000 emails). Or c'est une arnaque : il faut ajouter 0,50$ par jour (c'est écrit en tout petit, et d'une manière suffisamment peu claire pour que l'utilisateur un peu distrait se fasse avoir), qu'on utilise l'API ou pas ! Ce qui nous fait du 15$/mois, en fait c'est aussi cher que les autres

Il nous reste l'offre gratuite, assez serrée, puisqu'elle ne permet que 100 emails/jour. Via leur API, puisque j'utilise mes des solutions d'envoi que j'ai même-même développées.

Alors, si Elastic Email n'est pas moins cher que les autres, est-il au moins plus performant ?

Inscription

Après avoir cliqué sur le bouton Try for Free (en haut à droite de l'écran), choisir le produit Email API en cliquant sur son bouton Try for Free.

Choix du produit

C'est simple et sans chichis : on vous demande votre adresse email, de choisir un mot de passe, de saisir nom et prénom. Pas de numéro de carte bancaire ! (au moins au moment où j'écris cet article)

Formulaire d'inscription

Réception d'un email intitulé « Please confirm your Elastic Email account » envoyé par noreply@elasticemail.com afin de valider le compte. Souci : l'email arrive dans mon dossier spams. Ça commence bien ! Pour un service de routage d'emails, ça la fiche un peu mal, n'est-ce pas ?

Validation du compte en cliquant sur le lien dans le mail. Connexion au compte. Réception d'un 2e email en provenance support@elasticemail.com ayant pour sujet « Security alert for your Elastic Email account ». Et qui évite de peu le dossier spams… Ce message m'informe qu'une connexion a eu lieu à partir d'un nouvel appareil et que si c'est moi, je dois le confirmer. Oui oui, c'est moi…

J'arrive sur l'écran d'accueil, qui est en français, avec encore quelques éléments non traduits.

Ecran d'accueil

Génération de la clé API

Pour pouvoir utiliser l'API, il me faut générer la clé API. Cliquer sur Connect to HTTP API, puis sur le bouton Créer.

Petit moment de perplexité quand il faut choisir quelle case de permission cocher : évidemment, la première fois je me suis trompée ! En fait, il faut cocher au minimum « Send email via HTTP » sinon, à l'envoi d'un email de test, l'API renverra comme réponse {« success »:false, »error »: »Access Denied. »}

Création d'une nouvelle clé API

Elastic Email génère une clé, une très trèèèès longue série hexadéciumale constituée de chiffres et de lettres majuscules, qu'il va falloir soigneusement noter, et qu'on utilisera dans le champ apikey dans le paragraphe suivant…

Entre-temps, je reçois un email d'un dénommé Patrick from Elastic Email qui veut savoir si tout se passe bien et si j'ai besoin d'aide et de crédits email gratuits. Heu, je croyais qu'on y avait droit de toutes façons ? Je lui réponds, cette fois-ci c'est Tomek qui me répond. Et c'est lui qui me dit quelle case de permission il me fallait cocher.

Premiers tests

Pour php, la documentation renvoie vers un projet Git codé en php objet qui nécessite l'utilisation de Composer. Ça ne me tente pas vraiment, si on pouvait rester simple ce ne serait pas plus mal… Heureusement, après quelque recherches, je trouve ce bout de code sur cette page (qui contient aussi des exemples en java, C# et python)…


$url = 'https://api.elasticemail.com/v2/email/send';

try{
  $post = array('from' => 'contact@yourdomain.com',
    'fromName' => 'Votre société',
    'apikey' => 'X00000XX00000000X0X00000000X00000X0000000000000XXXX0000X000000XXX',
    'subject' => 'Sujet de votre email',
    'to' => 'recipient1@gmail.com',
    'bodyHtml' => '<h1>Html Body</h1>',
    'bodyText' => 'Text Body',
    'isTransactional' => false);

  $ch = curl_init();
  curl_setopt_array($ch, array(
    CURLOPT_URL => $url,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $post,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => false,
    CURLOPT_SSL_VERIFYPEER => false
  ));

  $result=curl_exec ($ch);
  curl_close ($ch);

  echo $result;
}
catch(Exception $ex){
  echo $ex->getMessage();
}

 

J'envoie à plusieurs boîtes parmi les fournisseurs les plus classiques : Gmail, Live (c'est à dire Outlook ex-Hotmail), Yahoo!, Wanadoo, Free et Protonmail. Les emails atteignent tous leurs cibles, à part une fois dans le cas de Gmail où il atterrit dans les spams (mais lors des autres tests, c'est bien arrivé dans la boîte de réception).

Quand un envoi fonctionne, l'API renvoie quelque chose comme ça : {« success »:true, »data »:{« transactionid »: »0000x00x-xxxx-0000-x00x-000×00000000″, »messageid »: »4xxXXXXXX4xXxXxXXx58X2″}}

Le lien unsubscribe

Dans l'email reçu, un lien UNSUBSCRIBE dont on se passerait bien… Car il renvoie vers le site Elastic Email. Est-ce que cela peut se personnaliser pour le remplacer par le lien de notre logiciel ? J'ai décoché l'option « List unsubscribe header » dans My account > Réglages > Unsubscribe settings, mais cela n'a rien changé.

En fait, ce lien s'appuie sur le placeholder {unsubscribe}, ce qui permet au moins d'afficher ce lien en français, avec l'aspect souhaité.

$html='Bonjour à tous. <br />Ceci est une newsletter routée par elasticemail...
<br />Balise de désabonnement :<br />
<a href="{unsubscribe}">Se désabonner</a>';

Mais je n'ai pas trouvé comme remplacer le lien par un lien personnalisé.

Logs

On les retrouve sous Activité.

Logs - Activité

Pour afficher la liste des emails envoyés, il faut cliquer sur le bouton Voir (en haut à droite) et choisir Email Log.

Email log

Emails groupés

Avec Mailgun, on peut demander l'envoi à tout une liste en un coup, au lieu de devoir faire une fastidieuse boucle for() sur tout le contenu de la liste, ce qui est lourd, lentisssime et fait risquer l'erreur 500.

Je fais un test en replaçant « to » par « lists » et en lui passant un array d'emails. Réponse : {« success »:false, »error »: »Unable to find contact list: xxxxxxxx.xxxx@xxx.fr. »} (c'était la 1e adresse email de mon array)

En fait… C'est le champ To qu'il faut utiliser ! En séparant vos adresses email par un point-virgule (dans mon exemple, $destinataires est un array d'adresses email).

'to' => implode(";",$destinataires),

On a droit à un nombre illimité d'adresses, et non, les autres destinataires n'apparaissent pas dans le message comme si vous aviez fait un maladroit reply-all.

Heureusement, car cela m'ennuyait vraiment d'avoir recours aux listes sur l'interface d'administration Elastic Mail. Pas top quand la liste des destinataires est gérée sur notre logiciel !

Au fait, si jamais vous oubliez ce champ To, l'envoi échoue avec ce message d'erreur : {« success »:false, »error »: »You must specify at least one recipient. »}

Envoi avec pièce jointe

Il s'appuie sur la classe php CurlFile() comme le montre l'exemple sur cette page. La limite est de 10 Mo (email compris). Et ça fonctionne ! Alors que je n'y suis jamais arrivée avec Mailgun…


$url = 'https://api.elasticemail.com/v2/email/send';
$filename = "helloWorld.txt";
$file_name_with_full_path = realpath('./'.$filename);
$filetype = "text/plain"; // adapter en fonction du type de fichier

try{
  $post = array('from' => 'contact@yourdomain.com',
    'fromName' => 'Votre société',
    'apikey' => 'X00000XX00000000X0X00000000X00000X0000000000000XXXX0000X000000XXX',
    'subject' => 'Sujet de votre email avec une PJ',
    'bodyHtml' => '&lt;h1&gt;Html Body&lt;/h1&gt;',
    'bodyText' => 'Text Body',
    'to' => 'recipient1@gmail.com;recipient2@gmail.com',
    'isTransactional' => false,
    'file_1' => new CurlFile($file_name_with_full_path, $filetype, $filename));

  $ch = curl_init();

  curl_setopt_array($ch, array(
    CURLOPT_URL => $url,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $post,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => false,
    CURLOPT_SSL_VERIFYPEER => false
  ));

  $result=curl_exec ($ch);
  curl_close ($ch);

  echo $result;
}
catch(Exception $ex){
  echo $ex->getMessage();
}

Publipostage

Envoyer une newsletter, c'est bien. La personnaliser c'est mieux… Dans le cas de Elastic Email, il faut utiliser un fichier CSV qui va contenir les données à insérer. Les placeholders sont entre accolades et correspondent aux libellés des entêtes de colonne, comme c'est expliqué dans cet article… La dénomination des entêtes est libre, à part pour la 1e colonne qui doit impérativement se nommer ToEmail. La limite est de 100000 emails/fichier.

Et surtout, le caractère séparateur est la virgule et non pas le point-virgule ! Si vous vous trompez de caractère séparateur, certes, vous aurez un retour de réussite, mais ensuite vous retrouverez votre publipostage avec le statut « rebondi » (bounced)

Rebond suite à tentative de publipostage

Les contacts étant récupérés à partir d'une base de données sur le logiciel que j'ai codé, je n'ai pas trouvé d'autre solution que de générer le CSV à partir du contenu de la base avant de l'envoyer à Elastic Email…

Là encore on utilisera CurlFile pour envoyer le fichier CSV. Dans ce cas, n'utilisez pas le champ To, car il sera ignoré…


$url = 'https://api.elasticemail.com/v2/email/send';
$filename = "contacts.csv";
$file_name_with_full_path = realpath('./'.$filename);

try{
  $post = array('from' => 'contact@yourdomain.com',
    'fromName' => 'Votre société',
    'apikey' => 'X00000XX00000000X0X00000000X00000X0000000000000XXXX0000X000000XXX',
    'subject' => 'Sujet de votre email',
    'bodyHtml' => '<h1>Hello, {firstname}</h1>',
    'bodyText' => 'Hello, {firstname}',
    'isTransactional' => false,
    'file_contacts' => new CurlFile($file_name_with_full_path, 'text/csv', $filename),
    'mergesourcefilename' => $filename);

  $ch = curl_init();

  curl_setopt_array($ch, array(
    CURLOPT_URL => $url,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $post,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => false,
    CURLOPT_SSL_VERIFYPEER => false
));

  $result=curl_exec ($ch);

  if ($result === FALSE)
  { echo curl_error($ch); }
  else
  { echo $result; }

  curl_close ($ch);
}
catch(Exception $ex){
  echo $ex->getMessage();
}

 

Un peu trop d'emails

Est-ce qu'ils ont besoin de prouver que leurs services fonctionnent bien ? A partir du moment où vous êtes inscrits chez eux, ils ne vous lâchent plus la grappe ! Après Patrick, c'est au tour de Joshua, l'un des co-fondateurs, qui me souhaite la bienvenue à presque 2h00 du mat'. Il affirme que la migration à partir d'un autre service est facile. Mmmh… 9h00 du matin, autre email « Let's start ! » qui m'invite à essayer leurs services, puis un vibrant « Happy to have you on board! » à 13h00 qui m'invite à jeter un œil à leur centre de support et m'informe qu'ils envoient une newsletter mensuelle. Oh les copains, on se calme un peu sur le spam là ?

Sinon y a pas à dire, le support est réactif, même le dimanche. Bravo les gars.

 

En conclusion, Elastic Email propose une API qui marche bien, pas trop difficile à prendre en main et qui propose toutes les fonctionnalités nécessaires. Hélas, derrière une formulation alambiquée sur cache une tarification tout aussi dissuasive que la concurrence… D'autant qu'on ne peut payer qu'en dollars, bonjour les frais de change. On restera donc chez Mailgun pour le moment !

Karine SANCHE

Partager cet article