Comment envoyer un mail par la programmation

Prérequis

  • Il faut avant toute chose avoir suivi et réalisé les étapes traitées dans ces guides :

  • Paramétrage SMTP Afin que les mails transitent bien, il faut paramétrer la plateforme afin de la connecter au service de mail. Pour cela, rendons-nous dans les paramètres du centre d'administration et filtrons pour obtenir les paramètres SMTP : Paramétrage SMTP

Comment procéder ?

Recommandation

Si vous n'êtes pas familier avec les Modèles de mail et leur fonctionnement, il est fortement recommandé de lire la documentation associée diponible ici

Créer un modèle de mail non lié à une Smart Structure - Anakeen CLI

npx @anakeen/anakeen-cli createSetting --type MailTemplate --name MAIL_MonPremierModele

Voici le fichier que la commande génère src/vendor/<vendorName>/<moduleName>/250-MailTemplateMailMonPremierModele.xml

<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0" xmlns:mail="https://platform.anakeen.com/4/schemas/mailtemplate/1.0">
   <mail:mailtemplate xmlns:mail="https://platform.anakeen.com/4/schemas/mailtemplate/1.0" name="MAIL_MONPREMIERMODELE" label="MAIL_MonPremierModele"  structure="BASE">
       <mail:from>
           <!--
           <mail:config-parameter ns="NAMESPACE" label="Expéditeur">ACCOUNT_SENDER</mail:config-parameter>
           -->
       </mail:from>
       <mail:recipients>
           <!--
           <mail:recipient dest="to">
               <mail:element-account-field label="Destinataire">person_recipient</mail:element-account-field>
           </mail:recipient>
           -->
       </mail:recipients>
       <mail:subject>[Restauratec] Mail sample</mail:subject>
       <mail:body content-type="html"><![CDATA[<p>Bonjour,<br /><br />Ce mail est un exemple]]></mail:body>
   </mail:mailtemplate>
</smart:config>

Attention

Le modèle de mail a été généré sans renseigner de SmartStructure, il a donc été placé à la racine du module.
Cet emplacement n'est par défaut pas prit en compte dans le fichier info.xml.
Il faut donc rajouter l'instruction permettant d'importer le fichier du modèle de mail :

    <process command="./ank.php --script=importConfiguration --file=./vendor/Cogip/Restauratec/250-MailTemplateMailMonPremierModele.xml"/>

puis build & deploy l'application :

npx @anakeen/anakeen-cli deploy -c http://localhost:8080/control -s . -u admin -p anakeen --reinstall
  • Il est possible de compléter la balise <mail:mailtemplate> afin d'y indiquer la SmartStructure associée ainsi que le modèle de workflow mais nous verrons ça dans un autre guide dédié à l'envoi automatique de mail lors de transitions.

Profitons-en pour donner à ce modèle de mail un label plus parlant :

    <mail:mailtemplate name="MAIL_MONPREMIERMODELE" label="Premier modèle de mail fonctionnel">

Le namespace (xmlns:mail="https://platform.anakeen.com/4/schemas/mailtemplate/1.0") n'est pas nécessaire car déjà présent sur la balise parente <smart:config>

  • Paramétrer le modèle de mail :
<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0" xmlns:mail="https://platform.anakeen.com/4/schemas/mailtemplate/1.0">
    <mail:mailtemplate name="MAIL_MONPREMIERMODELE" label="Premier modèle de mail fonctionnel" structure="BASE">
        <!-- Renseigner un émetteur -->
        <mail:from>
            <mail:address>howto.from@anakeen.com</mail:address>
        </mail:from>
        <!-- Renseigner un destinataire -->
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:address><![CDATA["How to send an email!" <howto.recipient@anakeen.com>]]></mail:address>
            </mail:recipient>
        </mail:recipients>
        <!-- Renseigner le sujet du mail -->
        <mail:subject>[Restaurant] Voici le sujet de votre premier modèle de mail</mail:subject>
        <!-- Renseigner le contenu du mail -->
        <mail:body content-type="html"><![CDATA[<p>Salut ! <br /><br />Ce mail a été généré via votre premier modèle de mail ! <br /><br /> Bravo !]]></mail:body>
    </mail:mailtemplate>
</smart:config>

Recommandation

Nous utilisons ici pour l'émetteur et le destinataire, des adresses mail statiques, mais je vous invite à consulter la documentation associée afin de prendre connaissance des autres possibilités existantes.

Créer un modèle de mail lié à une Smart Structure - Anakeen CLI

  • Créer le modèle de mail en renseignant cette fois-ci l'argument associatedSmartStructure :
npx @anakeen/anakeen-cli createSetting --type MailTemplate --name MAIL_PlatSupprime --associatedSmartStructure PLAT

Voici le fichier généré (Cette fois-ci dans le dossier de la Smart Structure concernée) src/vendor/<vendorName>/<moduleName>/SmartStructures/PlatSettings/250-MailTemplateMailPlatSupprime.xml

  • Paramétrer le modèle de mail.

Informations

Un système de balises est présent pour le sujet du mail <mail:subject> ainsi que pour le corps du mail <mail:body> sous la forme :

[V_<SMARTFIELD_LOGICAL_NAME>].

Cela permet de récupérer la valeur de Smart Field ciblé :::

<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0" xmlns:mail="https://platform.anakeen.com/4/schemas/mailtemplate/1.0">
    <mail:mailtemplate name="MAIL_PLATSUPPRIME" label="MAIL_PlatSupprime" structure="PLAT">
        <!-- Renseigner un émetteur -->
        <mail:from>
            <mail:address>howto.from@anakeen.com</mail:address>
        </mail:from>
        <!-- Renseigner un destinataire -->
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:address>howto.recipient@anakeen.com</mail:address>
            </mail:recipient>
        </mail:recipients>
        <!-- Renseigner le sujet du mail -->
        <mail:subject>Suppression du plat [V_CONSOMMABLE_TITLE]</mail:subject>
        <!-- Renseigner le contenu du mail -->
        <mail:body content-type="html"><![CDATA[<p>Bonjour, <br /><br />Le plat "[V_CONSOMMABLE_TITLE]" a bien été supprimé]]></mail:body>
    </mail:mailtemplate>
</smart:config>

Recommandation

Nous utilisons ici pour l'émetteur et le destinataire, des adresses mail statiques, mais je vous invite à consulter la documentation associée afin de prendre connaissance des autres possibilités existantes.

Envoyer un mail par la programmation en se basant sur le modèle créé

Maintenant que notre modèle de mail est créé, il faut pouvoir l'envoyer et cela par la programmation. Pour cela, faisons en sorte par exemple que lorsque un plat est supprimé, notre mail s'envoie. Nous utiliserons le hook preDelete. À ce sujet, je vous conseil de consulter le chapitre Comment modifier le comportement d'un Smart Element. C'est ici le comportement des plats qui est concerné donc le fichier src/vendor/<vendorName>/<moduleName>/Plat/PlatBehavior.php

<?php
namespace Cogip\Restauratec\SmartStructures\Plat;

use Anakeen\Core\SEManager;
use Anakeen\SmartHooks;
use SmartStructure\Mailtemplate;
use SmartStructure\Fields\Plat as PlatFields;

class PlatBehavior extends \SmartStructure\Consommable
{
  public function registerHooks()
  {
    parent::registerHooks();
    $this->getHooks()->addListener(SmartHooks::POSTDELETE, function () {
      $smartElementId = SEManager::getIdFromName("MAIL_PLATSUPPRIME");
      $mailTemplate = SEManager::getDocument($smartElementId);
      /** @var MailTemplate $mailTemplate */
      $mailMessage = $mailTemplate->getMailMessage($this);
      $mailMessage->send();
    });
  }
}

Et ensuite ?

Comment créer le cycle de vie d'un SmartElement