> For the complete documentation index, see [llms.txt](https://docs.thewalletcrew.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.thewalletcrew.io/connectors/fr/email-provider/adobe-marketing-cloud/adobe-campaign-transactional-messaging.md).

# Adobe Campaign Transactional Messaging

Envoyez les e-mails transactionnels de The Wallet Crew via Adobe Campaign Transactional Messaging à l’aide du fournisseur d’e-mails scripté.

Utilisez cette option lorsque l’organisation exécute **Adobe Campaign** et utilise déjà **Messagerie transactionnelle** pour les envois de production.

Avant d’aller plus loin, assurez-vous que le modèle de fournisseur de scripts utilisé par The Wallet Crew est clair. Commencez par [Adobe Marketing Cloud](/connectors/fr/email-provider/adobe-marketing-cloud.md) et le prérequis [extensibilité EmailSender](/connectors/fr/custom-connector/emailsender-extensibility.md).

### Quand l’utiliser

C’est un bon choix lorsque la gouvernance, le reporting et les événements transactionnels préexistants d’Adobe Campaign sont déjà en place.

### Configuration requise dans Adobe

Créer et publier un **événement de message transactionnel**.

Décidez ensuite si Adobe Campaign utilisera le HTML rendu par The Wallet Crew ou construira l’e-mail final à l’aide des modèles et des variables Adobe Campaign.

Une méthode d’authentification sécurisée côté serveur, prise en charge par le déploiement Adobe Campaign, est également requise. Elle repose souvent sur Adobe I/O ou IMS.

### Notes d’implémentation (appel d’événement)

Le script génère généralement l’e-mail (lorsque The Wallet Crew contrôle le HTML), puis appelle le point de terminaison de l’événement transactionnel avec le destinataire et le contexte.

Stockez ces valeurs en tant que secrets avant de tester :

* `adobe-clientId`
* `adobe-clientSecret`
* `adobe-campaign-transactionalUrl` (URL complète de l’événement de message transactionnel)
* `adobe-orgId` (facultatif, selon la configuration de Campaign)
* `adobe-scope` (facultatif, selon la configuration Adobe)

{% code title="Exemple Adobe Campaign (implémentation SendEmail)" %}

```javascript
import { getSecret } from "neo/secrets";

const CUSTOM_DOMAIN = "wallet.brand.com";
const TENANTID = "brand";

// Adobe IMS (identifiants client OAuth2)
const IMS_TOKEN_URL = "https://ims-na1.adobelogin.com/ims/token/v3";

async function getOptionalSecret(name, fallback) {
  try {
    return (await getSecret(name)) || fallback;
  } catch (e) {
    return fallback;
  }
}

/**
 * @typedef {Object} EmailData
 * @property {string} Subject
 * @property {string} Body
 */

async function sendEmail(recipient, emailTemplate, data, cultures, buildEmail) {
  const email = recipient;
  const countryCode = data["country"] || "fr";
  const language = `${cultures[0]?.toLowerCase()?.substring(0, 2) || "fr"}_${countryCode.toLowerCase()}`;
  const customerId = data["id.customerId"];

  if (!customerId) {
    throw new Error('Champ "id.customerId" manquant dans les données de l’e-mail.');
  }

  const url = `https://${CUSTOM_DOMAIN}/${TENANTID}/Carte?id.customerId=${encodeURIComponent(customerId)}`;

  // Conserver le rendu de Wallet Crew disponible.
  // Si Adobe Campaign possède le modèle, vous pouvez supprimer ceci et n'envoyer que les variables.
  const rendered = await buildEmail(emailTemplate);

  const transactionalUrl = await getSecret("adobe-campaign-transactionalUrl");

  const clientId = await getSecret("adobe-clientId");
  const clientSecret = await getSecret("adobe-clientSecret");
  const scope = await getOptionalSecret("adobe-scope", "openid,AdobeID");

  // Facultatif. Certaines configurations nécessitent des en-têtes d'ID d'organisation, d'autres non.
  const orgId = await getOptionalSecret("adobe-orgId", null);

  const headers = {
    "x-api-key": clientId,
    "Content-Type": "application/json",
  };
  if (orgId) headers["x-gw-ims-org-id"] = orgId;

  const result = await fetch(transactionalUrl, {
    Method: "POST",
    Authentication: {
      mode: "OAuth2.0",
      grantType: "clientCredentials",
      sendCredentialsAsFormParams: true,
      accessTokenUrl: IMS_TOKEN_URL,
      clientId,
      clientSecret,
      scope,
    },
    Headers: headers,
    Body: JSON.stringify({
      // La charge utile doit correspondre à la définition de votre événement Transactional Message Event.
      email,
      ctx: {
        url,
        language,

        // Facultatif si vous voulez que Campaign utilise le rendu de Wallet Crew :
        subject: rendered.Subject,
        body: rendered.Body,

        // Métadonnées utiles :
        template: emailTemplate,
        customerId,
      },
    }),
    ThrowOnError: false,
  });

  if (result.StatusCode < 200 || result.StatusCode >= 300) {
    throw new Error(`Adobe Campaign call failed (${result.StatusCode}): ${result.ResponseText}`);
  }
}

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

{% endcode %}

### Ce qu'il faut valider

Déclenchez un véritable e-mail transactionnel, puis validez ces points :

* L'événement Transactional Message Event est publié et peut être appelé.
* Le schéma de la charge utile correspond à la définition de l'événement.
* Adobe Campaign accepte la requête et traite le message.

### FAQ

<details>

<summary><strong>Un Transactional Message Event est-il requis ?</strong></summary>

Oui. Le script doit appeler un point de terminaison d'un Transactional Messaging Event publié. Cet événement définit le schéma de charge utile attendu et les variables disponibles dans le modèle Adobe Campaign.

</details>

<details>

<summary><strong>Adobe Campaign peut-il générer l'e-mail à la place de The Wallet Crew ?</strong></summary>

Oui. Dans cette configuration, le script envoie uniquement les variables (par exemple, l'URL de téléchargement de la Carte et les métadonnées client). Adobe Campaign possède le HTML, l'objet et les traductions.

</details>

<details>

<summary><strong>Quelle méthode d’authentification doit être utilisée ?</strong></summary>

Cela dépend du déploiement d’Adobe Campaign et de la manière dont l’organisation Adobe gère l’accès serveur à serveur. Cette page présente une approche basée sur IMS parce qu’elle est courante, mais la méthode d’authentification finale doit être alignée avec l’équipe d’administration Adobe et la documentation officielle Adobe pour cet environnement.

</details>

<details>

<summary><strong>Quelle est la raison la plus courante du rejet d’une requête ?</strong></summary>

Incohérence de schéma. La définition de l’événement est stricte. Lorsque les champs de la charge utile ne correspondent pas à la structure attendue de l’événement, Campaign rejette ou ignore les champs, et les modèles affichent des valeurs vides.

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://docs.thewalletcrew.io/connectors/fr/email-provider/adobe-marketing-cloud/adobe-campaign-transactional-messaging.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
