# Modèle de mail

Les modèles de mail permettent de paramétrer les mails qui seront envoyés par la plateforme. Un modèle de mail permet de définir :

  • l'expéditeur,
  • le(s) destinataire(s),
  • le sujet du mail,
  • le corps du mail,
  • les pièces jointes

Chacune de ces parties peut être dynamique en fonction des valeurs du Smart Element auquel le mail envoyé est rattaché.

# Paramétrage des modèles de mail

La configuration d'un modèle de mail est faite en suivant le schema XML https://platform.anakeen.com/4/schemas/mailtemplate/1.0

Exemple :

<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="MY_MAIL_E2E3"
                        workflow-model="MY_WFL_ARTICLE"
                        label="MY - Validation directeur - E2 - E3"
                        structure="MY_ARTICLE" >
        <mail:from>
            <mail:config-parameter ns="MY" label="mail_sender">MY_MAIL_SENDER</mail:config-parameter>

        </mail:from>
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:element-account-field label="Responsable du service choisi">my_rs_dpi</mail:element-account-field>
            </mail:recipient>
            <mail:recipient dest="to">
                <mail:element-account-field label="Chargé de partenariat international">my_charge_partenariat</mail:element-account-field>
            </mail:recipient>
        </mail:recipients>
        <mail:subject>Validation [V_MY_STATUT_VALIDE_DIRECTEUR]</mail:subject>
        <mail:savecopy>false</mail:savecopy>
        <mail:use-html-anchor>true</mail:use-html-anchor>
        <mail:body content-type="html"><![CDATA[<p style="margin: 0pt;">
	<span style="font-family: Verdana; font-weight: normal;"><font size="2">La fiche de </font></span><span style="font-family: Verdana; font-weight: normal;"><font size="2">l'action n°</font></span>&#x5B;V_MY_NUM_ACTION]<span style="font-family: Verdana; font-weight: normal;"><font size="2">, intitulée </font></span>&#x5B;V_MY_INTITULE_ACTION]<span style="font-family: Verdana; font-weight: normal;"><font size="2">, au bénéfice de </font></span>&#x5B;V_MY_ACTEUR_PRINCIPAL]<span style="font-family: Verdana; font-weight: normal;"><font size="2">.</font></span><span style="font-family: Verdana; font-weight: normal;"><font size="2"> est validée et pourra donc être présentée à la prochaine réunion.</font></span></p>]]></mail:body>

    </mail:mailtemplate>
</smart:config>

Le modèle de mail porte les informations suivantes :

Titre (Obligatoire) : mailtemplate/@label Titre sous lequel sera enregistré le modèle de mail.

Smart Structure : mailtemplate/@structure Smart Structure à laquelle est rattaché le modèle de mail. Cette Smart Structure permet de lister les Smart Fields qui seront utilisables pour la composition du mail.

Note

Dans l'éditeur du corps de message, les clefs des Smart Fields ne sont accessibles que lors d'une modification du Smart Element après avoir sélectionné la Smart Structure et non directement lors de l'ouverture du formulaire d'édition du modèle de mail.

Smart Structure workflow : mailtemplate/@workflow-model Smart Structure du cycle de vie auquel est rattaché ce modèle de mail. Cette Smart Structure permet de lister les Smart Fields qui seront utilisables pour la composition du mail.

L'émetteur : mailtemplate/from

Les destinataires mailtemplate/recipients/recipient

Le sujet : mailtemplate/subject . Le sujet est un texte libre. Il peut contenir des parties variables issues du Smart Element qui va être envoyé, sous la forme [BALISE]. Les balises sont générées par le Smart Element, et peuvent être complétées par le second paramètre de la méthode MailTemplate::sendMail().

Note

Le sujet d'un mail ne devant pas contenir de html, il est déconseillé d'utiliser les balises [V_TITLE] ou [V_ATTRID].

Le corps : mailtemplate/body. Le corps est un texte html avec mise en forme. Il peut contenir des parties variables issues du Smart Element qui va être envoyé, sous la forme [BALISE]. Les balises sont générées par le Smart Element, et peuvent être complétées par le second paramètre de la méthode MailTemplate::sendMail().

Les pièces jointes : mailtemplate/attachments/attachment. Les fichiers attachés font référence à des Smart Fields de type file (ou image) du Smart Element. Les fichiers seront alors en pièce jointe du courriel. Bien sûr, ces Smart Fields peuvent être des listes de fichiers (Smart Field file ou image dans un tableau). Il est possible d'utiliser la notation:pour aller chercher des valeurs sur les Smart Elements liés (par exemple :TST_MYID:THE_FILErécupère la valeur du Smart FieldsTHE_FILEdans le Smart Element référencé par le Smart Field relationTST_MYID). La notation:peut être utilisée plusieurs fois pour aller de relation en relation (par exemple :TST_RELATIONONEID:OTHER_RELATIONID:THE_FILE).

# Spécification de l'émetteur ou du destinataire

L'émetteur ou les destinataires peuvent être choisis parmi les moyens suivants:

# Adresse fixe

Le destinataire est alors statique. L'adresse indiquée doit être dans une forme acceptable pour le champ from d'une requête SMTP (ie. de la forme "nom expéditeur" <mail@host.net>.







 



 
 







<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="MY_MAIL"
                        label="Fixe"
                        structure="MY_ARTICLE" >
        <mail:from>
                <mail:address>me@example.net</mail:address>
        </mail:from>
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:address>you@example.net</mail:address>
                <mail:address><![CDATA["my friend" <friend@example.net>]]></mail:address>
            </mail:recipient>
        </mail:recipients>
        <mail:subject>Validation [V_MY_STATUT_VALIDE_DIRECTEUR]</mail:subject>
        <mail:body content-type="html"><![CDATA[<p>Hello</p>]]></mail:body>
    </mail:mailtemplate>
</smart:config>

# Adresse de l'utilisateur connecté À partir de la version 2021.01

  • L'émetteur ou le destinataire est alors dynamique. Son adresse est automatiquement récupérée de l'utilisateur connecté.






 




 








<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="MY_MAIL"
                        label="Fixe"
                        structure="MY_ARTICLE" >
        <mail:from>
                <mail:current-user-email/>
        </mail:from>
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:address>you@example.net</mail:address>
                <mail:current-user-email/>
                <mail:address><![CDATA["my friend" <friend@example.net>]]></mail:address>
            </mail:recipient>
        </mail:recipients>
        <mail:subject>Validation [V_MY_STATUT_VALIDE_DIRECTEUR]</mail:subject>
        <mail:body content-type="html"><![CDATA[<p>Hello</p>]]></mail:body>
    </mail:mailtemplate>
</smart:config>
  • Si aucun paramètre n'est ajouté alors l'adresse email de l'utilisateur connecté est automatiquement récupéré.





 










<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="MY_AUTO_MAIL"
                      label="label"
                      structure="MY_STRUCTURE_NAME" >
    <mail:from/>
    <mail:recipients>
      <mail:recipient dest="to">
        <mail:address>example@mail.net</mail:address>
      </mail:recipient>
    </mail:recipients>
    <mail:subject>Exemple de récupération de mail automatique</mail:subject>
    <mail:body content-type="html"><![CDATA[<p>Hello</p>]]></mail:body>
  </mail:mailtemplate>
</smart:config>

Note dans le cas de l'émetteur

Si l'utilisateur connecté n'a pas de courriel renseigné, l'adresse utilisée est celle du paramètre applicatif SMTP_FROM et si aucun courriel n'est renseigné dans le paramètre applicatif SMTP_FROM le mail n' est pas envoyé.

# Valeur du Smart Element lié

# Smart Field texte

Le destinataire est alors dynamique et est rattaché à un Smart Field textuel du Smart Element. Ce Smart Field doit contenir un courriel dans une forme acceptable pour le champ from d'une requête SMTP (ie. de la forme "nom expéditeur" <mail@host.net).

Il est possible d'utiliser la notation : pour aller chercher des valeurs sur les Smart Elements liés (par exemple : tst_myid:the_mail récupère la valeur du Smart Field the_mail dans le Smart Element référencé par le Smart Field relation TST_MYID.)
La notation : peut être utilisée plusieurs fois pour aller de relation en relation (par exemple : tst_relationoneid:other_relationid:the_mail).







 



 
 







<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="MY_MAIL"
                        label="Relation texte"
                        structure="MY_ARTICLE" >
        <mail:from>
                <mail:element-field-value>my_sender_email</mail:element-field-value>
        </mail:from>
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:element-field-value>my_writter_email</mail:element-field-value>
                <mail:element-field-value>my_society:soc_email</mail:element-field-value>
            </mail:recipient>
        </mail:recipients>
        <mail:subject>Validation [V_MY_STATUT_VALIDE_DIRECTEUR]</mail:subject>
        <mail:body content-type="html"><![CDATA[<p>Hello</p>]]></mail:body>
    </mail:mailtemplate>
</smart:config>

# Smart Field relation

Le destinataire est alors dynamique, et est rattaché à un Smart Field de type relation (account ou docid) du Smart Element.

Si le Smart Element cible implémente une méthode ::getMail(), alors elle sera utilisée pour renseigner l'émetteur. Sinon, il sera récupéré à partir du Smart Field us_mail du Smart Element cible.

Note

Pour l'émetteur, les adresses de groupes ne peuvent être utilisées (il est en effet interdit de spécifier un émetteur multiple au niveau de la norme SMTP).







 



 







<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="MY_MAIL"
                        label="Relation texte"
                        structure="MY_ARTICLE" >
        <mail:from>
                <mail:element-account-field>my_sender</mail:element-account-field>
        </mail:from>
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:element-account-field>my_writter</mail:element-account-field>
            </mail:recipient>
        </mail:recipients>
        <mail:subject>Validation [V_MY_STATUT_VALIDE_DIRECTEUR]</mail:subject>
        <mail:body content-type="html"><![CDATA[<p>Hello</p>]]></mail:body>
    </mail:mailtemplate>
</smart:config>

# Paramètre de Smart Structure texte

Le destinataire est alors dynamique et est rattaché à un paramètre de la Smart Structure du Smart Element. Ce paramètre doit contenir un courriel dans une forme acceptable pour le champ from d'une requête SMTP (ie. de la forme "nom expéditeur" <mail@host.net).

Note

La notation : n'est pas autorisée pour les paramètres.







 



 







<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="MY_MAIL"
                        label="Relation texte"
                        structure="MY_ARTICLE" >
        <mail:from>
                <mail:structure-parameter-value>my_sender_email</mail:structure-parameter-value>
        </mail:from>
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:structure-parameter-value>my_writter_email</mail:structure-parameter-value>
            </mail:recipient>
        </mail:recipients>
        <mail:subject>Validation [V_MY_STATUT_VALIDE_DIRECTEUR]</mail:subject>
        <mail:body content-type="html"><![CDATA[<p>Hello</p>]]></mail:body>
    </mail:mailtemplate>
</smart:config>

# Paramètre de Smart Structure relation

Le destinataire est alors dynamique et est rattaché à un paramètre de Smart Structure de type relation (account ou docid).

Si le Smart Element cible implémente une méthode ::getMail(), alors elle sera utilisée pour renseigner l'émetteur. Sinon, il sera récupéré à partir du Smart Field us_mail du Smart Element cible.

Note

Pour l'émetteur, les adresses de groupes ne peuvent être utilisées (il est en effet interdit de spécifier un émetteur multiple au niveau de la norme SMTP.







 



 







<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="MY_MAIL"
                        label="Relation texte"
                        structure="MY_ARTICLE" >
        <mail:from>
                <mail:structure-account-parameter>my_sender</mail:structure-account-parameter>
        </mail:from>
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:structure-account-parameter>my_writter</mail:structure-account-parameter>
            </mail:recipient>
        </mail:recipients>
        <mail:subject>Validation [V_MY_STATUT_VALIDE_DIRECTEUR]</mail:subject>
        <mail:body content-type="html"><![CDATA[<p>Hello</p>]]></mail:body>
    </mail:mailtemplate>
</smart:config>

# Valeur du workflow lié

# Smart Field cycle

Il se comporte comme un Smart Field texte mais est récupéré sur le workflow associé au Smart Element.








 







<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="MY_MAIL"
                        label="Relation texte"
                        structure="MY_ARTICLE" >
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:workflow-account-field>my_writter_email</mail:workflow-account-field>
            </mail:recipient>
        </mail:recipients>
        <mail:subject>Validation [V_MY_STATUT_VALIDE_DIRECTEUR]</mail:subject>
        <mail:body content-type="html"><![CDATA[<p>Hello</p>]]></mail:body>
    </mail:mailtemplate>
</smart:config>

# Relation cycle

Il se comporte comme un Smart Field relation mais est récupéré sur le workflow associé au Smart Element.








 







<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="MY_MAIL"
                        label="Relation texte"
                        structure="MY_ARTICLE" >
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:workflow-account-field>my_writter</mail:workflow-account-field>
            </mail:recipient>
        </mail:recipients>
        <mail:subject>Validation [V_MY_STATUT_VALIDE_DIRECTEUR]</mail:subject>
        <mail:body content-type="html"><![CDATA[<p>Hello</p>]]></mail:body>
    </mail:mailtemplate>
</smart:config>

# Paramètre cycle

Il se comporte comme un paramètre de Smart Structure texte, mais est récupéré sur la Smart Structure du workflow associé au Smart Element.








 







<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="MY_MAIL"
                        label="Relation texte"
                        structure="MY_ARTICLE" >
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:workflow-parameter-value>my_writter_email</mail:workflow-parameter-value>
            </mail:recipient>
        </mail:recipients>
        <mail:subject>Validation [V_MY_STATUT_VALIDE_DIRECTEUR]</mail:subject>
        <mail:body content-type="html"><![CDATA[<p>Hello</p>]]></mail:body>
    </mail:mailtemplate>
</smart:config>

# Smart Element destinataire

Le destinataire est obtenu dynamiquement, lors de l'envoi du mail, à partir d'un Smart Element qui implémente l'interface IMailRecipient.
Les Smart Elements sélectionnables dans ce champ sont tous les Smart Elements dont la classe implémente l'interface IMailRecipient.
Le destinataire est obtenu de manière dynamique lors de l'envoi du mail par l'appel à la méthode ::getMail() de ce Smart Element.








 







<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="MY_MAIL"
                        label="Relation texte"
                        structure="MY_ARTICLE" >
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:element-name>MY_FAVORITE_WRITER</mail:element-name>
            </mail:recipient>
        </mail:recipients>
        <mail:subject>Validation [V_MY_STATUT_VALIDE_DIRECTEUR]</mail:subject>
        <mail:body content-type="html"><![CDATA[<p>Hello</p>]]></mail:body>
    </mail:mailtemplate>
</smart:config>

# Sujet et corps du mail

Le sujet et le corps du mail sont des textes à partie variable. Les parties variables sont notées entre crochets simples. Par défaut, les clefs suivantes sont disponibles.

clefs descriptions
[CORE_URLINDEX] Url d'accès à votre serveur (défini par le paramètre applicatif de même nom)
[V_TITLE] Ancre HTML avec le titre, l'url du lien est calculée en fonction du paramètre applicatif CORE_MAILACTIONURL
[TITLE] Titre brute du Smart Element
[ID] Identifiant lié à la révision
[INITID] Identifiant numérique du Smart Element
[REVISION] Numéro de la révision
[CDATE] Date de la révision (format AAAA-MM-DD HH:MM)
[MDATE] Date de la dernière modification (format AAAA-MM-DD HH:MM)

Les champs du Smart Element sont aussi disponibles par défaut. Pour chacun des champs, les clefs suivantes sont construites :

Pour le champ fieldid, quatre clefs sont produites :

clefs descriptions
[FIELDID] Valeur brute du champ
[V_FIELDID] Valeur HTML du champ
[L_FIELDID] Le libellé du champ
[S_FIELDID] (booléen) true si la valeur n'est pas vide. À utiliser dans les balises [IF S_FIELDID] .. [ENDIF S_FIELDID]

Info

Ces clefs sont toujours produites en majuscules et doivent être référencées en majuscule.

Le sujet étant du texte simple (non HTML), il est déconseillé d'utiliser les clefs V_XXX. Au contraire pour le corps du message, il est conseillé d'utiliser la clef V_XXX.

Exemple : avec un Smart Element contenant le champ my_comment.

<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="MY_MAIL"
                        label="Relation texte"
                        structure="MY_ARTICLE" >
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:element-name>MY_FAVORITE_WRITER</mail:element-name>
            </mail:recipient>
        </mail:recipients>
        <mail:use-html-anchor>true</mail:use-html-anchor>
        <mail:subject>Validation de [TITLE]</mail:subject>
        <mail:body content-type="html"><![CDATA[
            Voici le lien [V_TITLE] vers l'information souhaitée.
            <p>[V_MY_COMMENT]</p>
]]></mail:body>
    </mail:mailtemplate>
</smart:config>

Sécurité

Si l'utilisateur courant n'a pas les droits d'accès à un champ, les clefs associées au champ seront vides.

# Hyperliens

# Calcul des liens

Les URLS dans les modèles de mail sont composées à partir de la valeur du paramètre CORE_MAILACTIONURL, lui-même composé à partir du paramètre CORE_MAILACTION.

# Désactivation des liens

Lorsque le mail est envoyé à des personnes qui n'ont pas de compte sur le système d'information, il est inutile de leur envoyer des liens vers des ressources auxquelles ils n'ont pas accès. Il est donc possible de désactiver tous les liens vers les Smart Elements, au moyen de la balise mailtemplate/use-html-anchor qui doit être mis à false.

# Enregistrement des messages envoyés

Les messages envoyés peuvent être enregistrés. Dans ce cas, le message est stocké dans la Smart Structure message envoyé (SENTMESSAGE), et son profil est identique à celui du Smart Element servant à l'envoi.

Pour stocker le message il faut indiquer true dans la balise mailtemplate/savecopy .

Attention

Cela peut générer un grand nombre de Smart Elements, ce qui peut conduire à terme à une dégradation des performances.

# Historique

Pour chaque message envoyé, un message est ajouté à l'historique du Smart Element servant à l'envoi. Ce message contient :

  • le titre du modèle de mail
  • le sujet du message
  • les destinataires.

Si une erreur survient lors de l'envoi du message, elle est ajoutée à l'historique du Smart Element servant à l'envoi, et est retournée à l'utilisateur.

# Limitations

Les messages ainsi générés ne sont pas des listes de diffusion : un seul mail est envoyé. Aussi, lors de l'envoi d'un message à plusieurs destinataires, tous recevront le même message, et il n'est pas possible de personnaliser le message par utilisateur.

Le sujet et le corps du mail ne peuvent pas faire appel à l'instruction BLOCK.

# Envoyer un Smart Element avec modèle de mail par programmation

Les modèles de mails sont utilisés dans les workflows. Ils peuvent aussi être utilisés par programmation. Les méthodes SmartStructure\MailTemplate::sendDocument() et SmartStructure\MailTemplate::getMailMessage() permettent de gérer l'envoi de messages avec des modèles de mails.

# Envoyer un Smart Element avec un formulaire

Le modèle de mail est utilisable aussi depuis un formulaire d'envoi.

# Ajouter des clés personnalisées

Il est possible d'ajouter des clés personnalisées,dans les modèles de mail, sous la forme [BALISE]. Ces balises sont ajoutées à l'aide de la méthode getMailTemplateAdditionalKeys() lorsque la classe PHP de la Smart Structure implémente l'interface Anakeen\SmartStructures\Mailtemplate\IMailTemplateAdditionalKeys.

# Paramètre de la fonction getMailTemplateAdditionalKeys

  • template (MailTemplate):

    modèle de mail pour lequel il faut ajouter les clés personnalisées.

# Retour

Cette fonction retourne un tableau indexé clé/valeur. Une valeur peut être :

  • une chaine de caractère ou un nombre. Dans ce cas, la valeur peut être référencée directement par la clef placée entre crochets. La valeur doit être du HTML. Il faut réaliser un échappement pour les valeurs brutes avec htmlspecialchars() par exemple.
  • un booléen. Dans ce cas, la valeur doit être référencée par les 2 balises [IF key]... [ENDIF key]. Le contenu placé entre ces deux balises est affiché si la valeur est vraie. Il existe aussi la balise [IFNOT key] .. [ENDIF key] qui affiche le contenu si la valeur est fausse.
  • Un tableau de tableau à valeur indexées. Valeur utilisable par les balises [BLOCK key] [index1], [index2] [ENDBLOCK key]. (Voir exemple ci-dessous)

# Exemple

# Modèle avec valeur simple et conditions

Soit la structure MY_STUCTURE avec les 2 champs numérique my_number1 et my_number2. Sa classe de comportement implémente l'interface IMailTemplateAdditionalKeys.

<?php
namespace MyStructure;

use Anakeen\SmartStructures\Mailtemplate\IMailTemplateAdditionalKeys;
use SmartStructure\Mailtemplate;

class MyStructureBehaviour extends \Anakeen\SmartElement implements IMailTemplateAdditionalKeys
{
  public function getMailTemplateAdditionalKeys(Mailtemplate $template)
  {
    return [
      "CustomSubject" => "Un sujet en or",
      "CustomWords" => "Voilà c'est supérieur à <b>10</b>",
      "N1GT10" => intval($this->getRawValue("my_number1")) > 10,
      "N2LT0" => intval($this->getRawValue("my_number2")) < 0,
      "sumOf12" => intval($this->getRawValue("my_number1")) + intval($this->getRawValue("my_number2"))
    ];
  }
}
<?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="MY_MESSAGE_EXTRA_KEY"
                       label="Lien activé extra key" structure="TEST_MAIL_TEMPLATE_DOCUMENT">
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:address>bigboss@example.net</mail:address>
            </mail:recipient>
        </mail:recipients>
        <mail:subject>[CustomSubject]</mail:subject>
        <mail:body content-type="html"><![CDATA[

    <span name="number1">  [V_MY_NUMBER1]</span>
    <span name="number2">+ [V_MY_NUMBER2]</span>
    <p name="number12">Total : [sumOf12]</p>

    [IF N1GT10] <p>[CustomWords]</p> [ENDIF N1GT10]

]]></mail:body>
    </mail:mailtemplate>

</smart:config>

# Cas d'un modèle avec une répétition. Utilisation des clefs BLOCK / ENDBLOCK.

<?php
namespace MyStructure;

use Anakeen\SmartStructures\Mailtemplate\IMailTemplateAdditionalKeys;
use SmartStructure\Mailtemplate;

class MyStructureBehaviour extends \Anakeen\SmartElement implements IMailTemplateAdditionalKeys
{
  public function getMailTemplateAdditionalKeys(Mailtemplate $template)
  {
    return [
      "TWOKEYS" => [["keyone" => "K1", "keytwo" => 45], ["keyone" => "K2", "keytwo" => "67"]]
    ];
  }
}
<?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="MY_MESSAGE_EXTRA_KEY_BLOCK1"
                       label="Lien activé extra key" structure="TEST_MAIL_TEMPLATE_DOCUMENT">
        <mail:recipients>
            <mail:recipient dest="to">
                <mail:address>bigboss@example.net</mail:address>
            </mail:recipient>
        </mail:recipients>
        <mail:subject>Un sujet</mail:subject>
        <mail:body content-type="html">
            <![CDATA[
               <ul>[BLOCK TWOKEYS]<li>[keyone] ([keytwo])</li>[ENDBLOCK TWOKEYS]</ul>
            ]]>
        </mail:body>
    </mail:mailtemplate>

</smart:config>

Cela va fournir un corps de message avec le contenu suivant :

<ul><li>K1 (45)</li><li>K2 (67)</li></ul>