# Adobe Campaign Transactional Messaging

Utilisez cette option lorsque votre organisation exécute **Adobe Campaign** et utilise déjà **la messagerie transactionnelle** pour les envois de production.

Avant d’aller plus loin, assurez-vous de comprendre comment fonctionne le fournisseur de script dans la Wallet Crew. 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 utiliser ceci

Cela convient bien lorsque vous disposez déjà de la gouvernance, des rapports et des événements transactionnels préexistants d'Adobe Campaign.

### Configuration requise dans Adobe

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

Ensuite, décidez si Adobe Campaign utilisera le HTML rendu par The Wallet Crew ou générera l'e-mail final à l'aide des modèles et des variables Adobe Campaign.

Vous devez également disposer d'une méthode d'authentification sécurisée côté serveur prise en charge par votre déploiement Adobe Campaign. Elle repose souvent sur Adobe I/O ou IMS.

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

Votre script rend généralement l'e-mail (si 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 comme 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 votre configuration Campaign)
* `adobe-scope` (facultatif, selon votre 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} Sujet
 * @property {string} Corps
 */

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)}`;

  // Conservez le rendu de Wallet Crew disponible.
  // Si Adobe Campaign gère 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,
    Corps: JSON.stringify({
      // La charge utile doit correspondre à la définition de votre événement de message transactionnel.
      email,
      ctx: {
        url,
        language,

        // Facultatif si vous souhaitez qu'Adobe 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(`L'appel Adobe Campaign a échoué (${result.StatusCode}) : ${result.ResponseText}`);
  }
}

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

{% endcode %}

### Ce qu’il faut valider

Déclenchez un vrai e-mail transactionnel, puis vérifiez ces points :

* Votre événement de message transactionnel est publié et appelable.
* 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>Avons-nous besoin d'un événement de message transactionnel ?</strong></summary>

Oui. Votre script doit appeler un point de terminaison d'événement de messagerie transactionnelle publié. Cet événement définit le schéma de charge utile attendu et les variables disponibles dans votre 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, votre script n'envoie que les variables (par exemple, l'URL de téléchargement de la Carte et les métadonnées client). Adobe Campaign gère le HTML, l'objet et les traductions.

</details>

<details>

<summary><strong>Quelle méthode d'authentification devons-nous utiliser ?</strong></summary>

Cela dépend de votre déploiement Adobe Campaign et de la manière dont votre organisation Adobe gère l'accès serveur à serveur. Cette page présente une approche basée sur IMS, car elle est courante, mais vous devez aligner la méthode d'authentification finale avec votre équipe d'administration Adobe et la documentation officielle d'Adobe pour votre environnement.

</details>

<details>

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

Incompatibilité de schéma. La définition de l'événement est stricte. Si les champs de votre charge utile ne correspondent pas à la structure attendue de l'événement, Campaign rejettera ou ignorera les champs, et les modèles afficheront des valeurs vides.

</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/email-provider/adobe-marketing-cloud-1/adobe-campaign-transactional-messaging.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.
