# Extensibilité d'EmailSender

### De quoi il s’agit

Utilisez ce point d’extensibilité lorsque vous voulez que The Wallet Crew envoie des e-mails via un fournisseur que vous contrôlez. Il s’agit d’une intégration au niveau du script. Elle vous permet de conserver les modèles Wallet Crew et la logique de rendu, tout en délégant l’envoi final à vos propres appels d’API.

Cette conception sépare le rendu de la livraison. Cela rend votre couche e-mail plus facile à tester et plus facile à remplacer. Elle maintient aussi la gestion des cultures explicite, car l’appelant décide quelles cultures existent et comment les modèles sont résolus.

### Fonctionnement `SendEmail` fonctionne

La plateforme appelle `runtime.scriptable.emailEngine.SendEmail` lorsqu’elle doit envoyer un e-mail et que le fournisseur d’e-mails est défini sur `script`. La fonction reçoit l’adresse du destinataire, le nom du modèle, une charge utile de données et la liste des cultures prises en charge.

Le dernier paramètre, `buildEmail`, est une fonction de rappel fournie par la plateforme. Votre fournisseur l’appelle pour obtenir le contenu rendu final. Cette fonction de rappel renvoie un objet avec un `Objet` et un `Body`. Une fois cette charge utile obtenue, votre script est chargé de l’envoyer.

### Implémentation de référence (signature)

```js
/**
 * @typedef {Object} EmailData
 * @property {string} Subject - Ligne d’objet rendue.
 * @property {string} Body - Contenu du corps rendu.
 */

/**
 * Envoyer un e-mail en utilisant le nom de modèle et les données fournis.
 * L’appelant fournit les cultures prises en charge et un rappel
 * pour générer le contenu de l’e-mail rendu.
 *
 * @param {string} recipient - Adresse e-mail cible.
 * @param {string} emailTemplate - Nom du modèle à rendre.
 * @param {Object.<string, any>} data - Données du modèle transmises au script.
 * @param {string[]} cultures - Noms de cultures disponibles fournis par le fournisseur de cultures.
 * @param {(templateName: string) => Promise<EmailData>} buildEmail
 * Fonction de rappel qui renvoie le contenu final de l’e-mail rendu.
 *
 * @returns {Promise<void>}
 */
async function sendEmail(recipient, emailTemplate, data, cultures, buildEmail){
   // appeler n’importe quelle API pour envoyer l’e-mail
}

export default function(context) {
  context.register('runtime.scriptable.emailEngine', {
    SendEmail: sendEmail 
  })
}
```

### Activer le fournisseur d’e-mails par script

Passer au fournisseur d’e-mails par script est un changement de configuration. Cela indique à The Wallet Crew d’appeler votre `SendEmail` implémentation pour les e-mails sortants.

{% stepper %}
{% step %}

#### Modifier `/server/emails.yml`

Ouvrez l'éditeur de configuration avancée, puis créez ou modifiez `/server/emails.yml`. Définissez le type de fournisseur sur `script`. Conservez `les ressources` pointant vers votre répertoire de modèles d'e-mail.
{% endstep %}
{% endstepper %}

```yaml
provider :
  type: script
resources :
  - /locales/emails/

```

### Remarques sur les modèles et les cultures

Les modèles d’e-mail sont chargés à partir des chemins listés sous `les ressources`. Gardez cela aligné avec l’emplacement de vos modèles HTML, car la fonction de rappel de rendu utilise ces modèles.

La gestion des cultures fait partie du contrat. La plateforme transmet un `cultures` tableau, mais votre fournisseur décide comment l’utiliser. En pratique, la plupart des configurations choisissent soit une seule culture par destinataire, soit reviennent à une culture par défaut lorsqu’aucun modèle spécifique n’existe.

### Dépannage

Si les e-mails cessent d’être envoyés après l’activation du fournisseur par script, commencez par vérifier que `/server/emails.yml` est du YAML valide et enregistré dans le bon tenant. Puis confirmez que votre script est bien enregistré sous `runtime.scriptable.emailEngine` et exporte `SendEmail`.

Si vous voyez des erreurs côté fournisseur, journalisez le nom du modèle et les choix de culture, mais évitez d’enregistrer les corps rendus complets. Le contenu des e-mails peut contenir des données personnelles.

### FAQ

<details>

<summary><strong>S’agit-il d’un point de terminaison HTTP public ?</strong></summary>

Non. Cette page documente une interface d’exécution de script implémentée par votre script de tenant. Si vous souhaitez appeler une API HTTP externe, vous le faites depuis l’intérieur de `SendEmail`.

</details>

<details>

<summary><strong>Où se trouvent les modèles d’e-mail ?</strong></summary>

Ils se trouvent dans les répertoires listés dans `les ressources`. Par défaut, cela pointe vers `/locales/emails/`.

</details>

<details>

<summary><strong>Peut-on mélanger un fournisseur par script avec SendGrid ou Mailchimp ?</strong></summary>

Pas en même temps pour un tenant donné. Le fournisseur actif est sélectionné dans `/server/emails.yml`.

</details>

<details>

<summary><strong>Que devons-nous renvoyer depuis <code>SendEmail</code>?</strong></summary>

Retournez normalement lorsque l’e-mail est accepté par votre fournisseur. Levez une erreur lorsque l’envoi échoue, afin que la plateforme puisse la faire remonter.

</details>

<details>

<summary><strong>Quel est le moyen le plus rapide de valider la configuration ?</strong></summary>

Activez le `script` fournisseur, déclenchez un seul e-mail transactionnel, puis vérifiez les journaux de votre fournisseur pour l’événement d’envoi.

</details>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.thewalletcrew.io/connectors/fr/custom-connector/emailsender-extensibility.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
