{"id":406,"date":"2022-03-11T18:03:31","date_gmt":"2022-03-11T17:03:31","guid":{"rendered":"https:\/\/jagullo.fr\/blog\/?p=406"},"modified":"2023-12-08T16:22:25","modified_gmt":"2023-12-08T15:22:25","slug":"utiliser-phpmailer-avec-le-smtp-ovh","status":"publish","type":"post","link":"https:\/\/jagullo.fr\/blog\/utiliser-phpmailer-avec-le-smtp-ovh\/","title":{"rendered":"Utiliser PHPMailer avec le SMTP OVH"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Pourquoi passer par SMTP pour envoyer un message ?<\/h2>\n\n\n\n<p>Utiliser le protocole SMTP pour envoyer <strong>des emails transactionnels<\/strong> dans vos projets PHP a plusieurs avantages. Le premier est de passer par une connexion s\u00e9curis\u00e9e pour l&rsquo;envoi du message. En effet, la fonction mail native de PHP n&rsquo;utilise pas de connexion s\u00e9curis\u00e9e donc les messages peuvent \u00eatre intercept\u00e9s sur le r\u00e9seau. Ce n&rsquo;est pas bien grave quand on envoie des messages de tests lors du d\u00e9veloppement. Second avantage, si on est d\u00e9veloppeur web sur macOS il est difficile d&rsquo;envoyer un message en local ainsi via la librairie <a data-type=\"URL\" data-id=\"https:\/\/github.com\/PHPMailer\/PHPMailer\" href=\"https:\/\/github.com\/PHPMailer\/PHPMailer\" target=\"_blank\" rel=\"noreferrer noopener\">PHPMailer<\/a> et une adresse mail on peut concevoir des applications PHP plus facilement.<\/p>\n\n\n\n<p>La librairie PHPMailer est <strong>l&rsquo;une des plus utilis\u00e9es<\/strong> dans les applications PHP. Initialement cr\u00e9\u00e9e en 2001 par Brent Matzelle, cette biblioth\u00e8que s&rsquo;est beaucoup d\u00e9velopp\u00e9e par la communaut\u00e9. Elle est pr\u00e9sente dans de nombreux projets open source comme WordPress, Drupal et de nombreuses autres solutions. En tant que d\u00e9veloppeur web il est difficile de ne pas utiliser cette librairie au lieu de la fonction native de PHP. Une autre solution consiste \u00e0 utiliser des emails transactionnels en passant par une API comme Sendinblue ou MailerSend. Utiliser une API pour envoyer des messages permet aussi de s\u00e9parer la partie graphique de la partie d\u00e9veloppement.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"640\" src=\"https:\/\/jagullo.fr\/blog\/wp-content\/uploads\/2022\/03\/phpmailer-smtp.jpg\" alt=\"PHPMailer facilite l'envoi des emails transactionnels dans une application PHP\" class=\"wp-image-896\" style=\"width:720px;height:480px\" srcset=\"https:\/\/jagullo.fr\/blog\/wp-content\/uploads\/2022\/03\/phpmailer-smtp.jpg 960w, https:\/\/jagullo.fr\/blog\/wp-content\/uploads\/2022\/03\/phpmailer-smtp-300x200.jpg 300w, https:\/\/jagullo.fr\/blog\/wp-content\/uploads\/2022\/03\/phpmailer-smtp-768x512.jpg 768w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/><figcaption class=\"wp-element-caption\">PHPMailer facilite l&rsquo;envoi des emails transactionnels dans une application PHP<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Configurer PHPMailer pour utiliser SMTP<\/h2>\n\n\n\n<p>Pour cet exemple il faut <strong>une adresse mail chez OVH<\/strong> ou un autre fournisseur. Attention quelques FAI bloquent les envois par SMTP sur certains serveurs pour \u00e9viter les spams. Une fois PHPMailer int\u00e9gr\u00e9 au projet, nous reprendrons le code d&rsquo;exemple de la documentation afin d&rsquo;envoyer un message. Dans un premier temps on importe la librairie PHPMailer avec les classes requises pour l&rsquo;envoi. Il faut aussi importer la classe Exception qui permet de lever et de r\u00e9cup\u00e9rer le message d&rsquo;erreur lors de l&rsquo;utilisation de la librairies. <\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>&lt;?php\nuse PHPMailer\\PHPMailer\\Exception;\nuse PHPMailer\\PHPMailer\\PHPMailer;\nuse PHPMailer\\PHPMailer\\SMTP;\n\nrequire 'PHPMailer-6.6.0\/src\/Exception.php';\nrequire 'PHPMailer-6.6.0\/src\/PHPMailer.php';\nrequire 'PHPMailer-6.6.0\/src\/SMTP.php';\n\n$mail = new PHPMailer(true);<\/code><\/pre>\n\n\n\n<p>Ensuite on va cr\u00e9er un bout de code d&rsquo;envoi avec la configuration ad\u00e9quate pour utiliser <strong>SMTP<\/strong> dans une connexion chiffr\u00e9e. Il est n\u00e9cessaire d&rsquo;appeler la m\u00e9thode isSMTP afin d&rsquo;initialiser PHPMailer au bon protocole puis de le configurer. Si on ne le fait pas cela appellera la fonction native mail du serveur PHP. Pour rappel chez OVH le nom du serveur est <strong>ssl0.ovh.net<\/strong>, le port <strong>465<\/strong> et le chiffrement <strong>SSL\/TLS<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>\/\/ Config\n$mail-&gt;SMTPDebug = SMTP::DEBUG_SERVER;\n$mail-&gt;isSMTP();\n$mail-&gt;Host       = 'ssl0.ovh.net';\n$mail-&gt;SMTPAuth   = true;\n$mail-&gt;Username   = 'contact@jagullo.fr';\n$mail-&gt;Password   = '*******';\n$mail-&gt;SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;\n$mail-&gt;Port       = 465;\n\n\/\/ Header\n$mail-&gt;setFrom('contact@jagullo.fr');\n$mail-&gt;addAddress('test@test.fr');\n$mail-&gt;addReplyTo('contact@jagullo.fr');\n\n\/\/ Content\n$mail-&gt;isHTML(true);\n$mail-&gt;Subject = 'Here is an email test';\n$mail-&gt;Body    = 'This is the HTML message body &lt;b&gt;in bold!&lt;\/b&gt;';\n$mail-&gt;AltBody = 'This is the body in plain text for non-HTML mail clients';\n\ntry {\n    \/\/ Send\n    $mail-&gt;send();\n    echo 'Message has been sent';\n} catch (Exception $e) {\n    echo \"Message could not be sent. Mailer Error: {$mail-&gt;ErrorInfo}\";\n}<\/code><\/pre>\n\n\n\n<p>Dans la variable <strong>Username<\/strong> on indique son adresse email et dans la variable <strong>Password<\/strong> son mot de passe. Pour d\u00e9finir le bon chiffrement, il faut appeler la variable <strong>SMTPSecure<\/strong> qui n\u00e9cessite une constante de PHPMailer ENCRYPTION_SMTPS. Si on doit utiliser du <strong>STARTTLS<\/strong> on peut d\u00e9finir la constante ENCRYPTION_STARTTLS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">R\u00e9solution des probl\u00e8mes<\/h2>\n\n\n\n<p>Il se peut que la connexion au serveur SMTP via SSL ne fonctionne pas en local sur certains syst\u00e8mes comme Windows. On peut se r\u00e9f\u00e9rer \u00e0 la <a href=\"https:\/\/github.com\/PHPMailer\/PHPMailer\/wiki\/Troubleshooting\" target=\"_blank\" rel=\"noreferrer noopener\">documentation de PHPMailer<\/a> pour tenter de r\u00e9soudre quelques probl\u00e8mes. En d\u00e9veloppement il est possible de forcer <strong>une connexion non s\u00e9curis\u00e9e <\/strong>ce qui permet de r\u00e9aliser des tests avant la mise en production.<\/p>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>$mail->SMTPOptions = &#91;\n    'ssl' => &#91;\n        'verify_peer' => false,\n        'verify_peer_name' => false,\n        'allow_self_signed' => true,\n    ]\n];<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Plus de s\u00e9curit\u00e9 avec OAuth<\/h2>\n\n\n\n<p>On pourrait utiliser Gmail ou Microsoft comme serveur SMTP mais ces entreprises ont d\u00e9sactiv\u00e9 la prise en charge du protocole SMTP pour leur messagerie. Il est possible d&rsquo;utiliser le protocole <strong>OAuth<\/strong> (Open Authorization) qui est un protocole libre pour s\u00e9curiser les authentifications \u00e0 des services et des API en se basant sur un syst\u00e8me de token. Dans sa version 6.6, PHPMailer facilite l&rsquo;int\u00e9gration de OAuth pour envoyer des emails avec plus de s\u00e9curit\u00e9. Il existe de nombreuses ressources sur Internet qui traite de ce point et qui peut aussi faire l&rsquo;objet d&rsquo;un prochain tutoriel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Alternative \u00e0 PHPMailer<\/h2>\n\n\n\n<p>Il existe plusieurs alternatives \u00e0 cette biblioth\u00e8que dans diff\u00e9rents langages. En PHP il y a <strong>Symfony Mailer<\/strong> qui est la librairie par d\u00e9faut du framework Symfony mais qui peut \u00eatre utilis\u00e9e ind\u00e9pendamment. D&rsquo;ailleurs le framework Laravel utilise lui aussi Symfony Mailer pour l&rsquo;envoi de message. Sur le serveur NodeJS on retrouve <strong>Nodemailer<\/strong> qui est une librairie open source pour envoyer un mail en pur JavaScript. Il existe aussi <strong>Emailjs<\/strong> en JavaScript qui impl\u00e9mente seulement le protocole SMTP. De nombreuses solutions open source sont disponibles suivant le langage de programmation que l&rsquo;on utilise et le type de serveur.<\/p>\n\n\n\n<p>Une autre possibilit\u00e9 d&rsquo;envoyer un message, comme vu dans l&rsquo;introduction, est de passer par la plateforme <strong>Sendinblue<\/strong> ou <strong>MailerSend<\/strong>. Ces services proposent d&rsquo;envoyer un message en passant par une API. On r\u00e9aliser un template de mail sur la plateforme avec des variables d&rsquo;entr\u00e9e puis on appelle l&rsquo;API en PHP en renseignant les variables du template. Enfin on envoie l&#8217;email directement depuis le serveur ce qui permet de d\u00e9velopper tout cela en local sans aucun souci. Un service d&#8217;email transactionnel permet d&rsquo;avoir une meilleure d\u00e9livrabilit\u00e9 et plus de s\u00e9curit\u00e9 pour son application. Enfin il est possible d&rsquo;avoir des statistiques sur les messages d&rsquo;envoi comme le taux de d\u00e9livrabilit\u00e9, les liens cliqu\u00e9s, etc.<\/p>\n\n\n\n<link rel=\"stylesheet\" href=\"\/blog\/wp-content\/themes\/Extra-child\/assets\/css\/prism.css\">\n<script src=\"\/blog\/wp-content\/themes\/Extra-child\/assets\/js\/prism.js\"><\/script>\n<div class=\"list-tags\"><a href=\"https:\/\/jagullo.fr\/blog\/tag\/email\/\" class=\"link-tag\" title=\"Email\">Email<\/a><a href=\"https:\/\/jagullo.fr\/blog\/tag\/php\/\" class=\"link-tag\" title=\"PHP\">PHP<\/a><\/div>","protected":false},"excerpt":{"rendered":"<p>Pourquoi passer par SMTP pour envoyer un message ? Utiliser le protocole SMTP pour envoyer des emails transactionnels dans vos projets PHP a plusieurs avantages. Le premier est de passer par une connexion s\u00e9curis\u00e9e pour l&rsquo;envoi du message. En effet, la fonction mail native de PHP n&rsquo;utilise pas de connexion s\u00e9curis\u00e9e donc les messages peuvent [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":896,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[8],"tags":[35,27],"class_list":["post-406","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developpement","tag-email","tag-php","et-has-post-format-content","et_post_format-et-post-format-standard"],"_links":{"self":[{"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/posts\/406","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/comments?post=406"}],"version-history":[{"count":3,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/posts\/406\/revisions"}],"predecessor-version":[{"id":3923,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/posts\/406\/revisions\/3923"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/media\/896"}],"wp:attachment":[{"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/media?parent=406"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/categories?post=406"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/tags?post=406"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}