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 :
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
disponible ici
Créer un modèle de mail non lié à une Smart Structure - Anakeen CLI
- Créer le modèle de mail avec la commande
createSetting
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();
});
}
}