Comment envoyer des mails avec Mailgun – utilisation de l'API

 

Dans le chapitre précédent, nous avons découvert Mailgun et son interface de suivi.

Je rappelle que les comptes crĂ©Ă©s depuis 2017 doivent dĂ©sormais saisir un numĂ©ro de carte bancaire pour avoir le droit d'envoyer des mails et il y a dĂ©sormais une limite quotidienne de 400 mails/jour. Ce qui rend Mailgun tout de suite beaucoup moins intĂ©ressant…

Voyons comment utiliser Mailgun pour expédier des mails.

Envoyer des mails avec l'API

Avec Composer

Si vous souhaitez utiliser l'API en php, le recours à Composer est obligatoire, du moins en théorie. Donc vous devrez l'installer sur votre serveur. C'est une vraie galère.

Si vous êtes en mutualisé, assurez-vous que votre hébergeur propose un accès SSH pour pouvoir envoyer des instructions en ligne de commande car c'est nécessaire pour pouvoir installer Composer. C'est par exemple le cas pour les hébergements mutualisés OVH, sauf pour leur offre de base.

Voici l'exemple fourni sur la doc officielle de Mailgun :

require '../vendor/autoload.php';
use Mailgun\Mailgun;

session_start();
ini_set( 'default_charset', 'ISO-8859-1' );

$mails_via_mailgun=true;
$success_mailgun='Queued. Thank you.';


function send_mailgun_composer($destinataire, $from_nom, $from_email, $subject, $html, $attachment=array()){
 
// Instantiate the client.
 $mgClient = new Mailgun('key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
 $domain = "monsite.com";
 
// Make the call to the client.
 $result = $mgClient->sendMessage($domain, array(
 'from' => $from_nom.' <'.$from_email.'>',
 'to' => $destinataire,
 'subject' => $subject,
 'text' => strip_tags($html),
 'html' => $html
 ), array(
 'attachment' => $attachment
 ));
 
 error_log("Mailgun ".$result);
 
}

Sans Composer

Bon, Composer obligatoire… en fait il est tout Ă  fait possible de contourner, grâce Ă  cURL (lĂ  encore pour Free c'est mort). A part pour l'envoi de pièce jointes, qui refuse de fonctionner par ce biais.

function send_mailgun($destinataire, $from_nom, $from_email, $subject, $html, $attachment=''){
 
 $config = array();
 
 $config['api_key'] = "key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
 $config['api_url'] = "https://api.mailgun.net/v3/mondomaine.com/messages"; 
 
 $message = array(); 
 $message['from'] = $from_nom." <".$from_email.">"; 
 $message['to'] = $destinataire; 
 $message['h:Reply-To'] = "<".$from_email.">"; 
 $message['subject'] = utf8_encode(stripslashes($subject));
 $message['html'] = utf8_encode(stripslashes($html));
 
 
//if($_SERVER['REMOTE_ADDR']=='127.0.0.1'){ var_dump($message); }

$ch = curl_init();
 
 curl_setopt($ch, CURLOPT_URL, $config['api_url']); 
 curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
 curl_setopt($ch, CURLOPT_USERPWD, "api:{$config['api_key']}");
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
 curl_setopt($ch, CURLOPT_POST, true); 
 curl_setopt($ch, CURLOPT_POSTFIELDS,$message);
 
 $result = curl_exec($ch);
 
 curl_close($ch);
 
 error_log("Mailgun ".$result);
 
//if($_SERVER['REMOTE_ADDR']=='127.0.0.1'){ var_dump($result); } 
 
 return $result;
 
}

Si vous oubliez le /messages Ă  la fin de $config[‘api_url'], rien ne s'enverra et la variable $result renverra un Ă©nigmatique « Mailgun Magnificent API »…

Utilisation du SMTP

Si vous aviez déjà l'habitude d'envoyer des mails (par exemple avec la librairie PHPmailer) en SMTP, cela vous permettra de continuer à travailler avec le même script d'envoi, en changeant seulement quelques paramètres.

Sauf que… si votre site est sur un mutualisĂ© chez OVH, les ports du SMTP sont bloquĂ©s pour toute adresse de serveur SMTP autre que celle d'OVH. Donc, cette solution est Ă  rĂ©server aux hĂ©bergements dĂ©diĂ©s ou aux VPS.

Voici un exemple utilisant PHPmailer :

 

$mail = new PHPmailer();
 
$mail->IsSMTP();
$mail->SMTPDebug = 2; // Client commands and server responses
$mail->Debugoutput = 'error_log'; // dans les logs
$mail->Host='smtp.mailgun.org'; 
$mail->Port = 465; // si 465 est bloque, utiliser 587
$mail->Username = 'postmaster@monsite.com';  // a récupérer dans le bloc Domain Information sur votre interface Mailgun
$mail->Password = 'xxxxxxxxxxxxxx';  // a récupérer dans le bloc Domain Information
$mail->SMTPAuth = true; 
$mail->SMTPSecure = 'ssl'; // si vous utilisez le port 587, changez pour tls
 
$mail->AddReplyTo($expediteur); 
$mail->SetFrom($expediteur, $nom_expediteur); 
$mail->AddAddress($destinataire); 
$mail->Subject=stripslashes($objet);
$mail->MsgHTML($message_debut."<div style='font-size: 12px'>".stripslashes($texte)."</div>".$message_fin);
$mail->AltBody= "Pour lire ce message, veuillez utiliser un client mail compatible HTML";
$mail->AddCustomHeader("List-Unsubscribe: <mailto:".$expediteur."?subject=Unsubscribe>, <http://www.mondomaine.com>");
 
if($mail->Send()) { 

// TODO faire quelque chose si l'envoi a reussi
 } 
 
 unset($mail);

 

Le plugin WordPress Mailgun

Il est très souvent mis à jour. Je ne l'ai pas encore utilisé. Vous pouvez le télécharger ici.

Karine SANCHE

Partager cet article