

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Exemples de fonctions Lambda
<a name="receiving-email-action-lambda-example-functions"></a>

Cette rubrique contient des exemples de fonctions Lambda qui contrôlent le flux de messagerie.

## Exemple 1 : Suppression du courrier indésirable
<a name="receiving-email-action-lambda-example-functions-1"></a>

Cet exemple arrête de traiter les messages qui ont au moins un indicateur de courrier indésirable.

```
export const handler = async (event, context, callback) => {
    console.log('Spam filter');
    
    const sesNotification = event.Records[0].ses;
    console.log("SES Notification:\n", JSON.stringify(sesNotification, null, 2));
    
    // Check if any spam check failed
    if (sesNotification.receipt.spfVerdict.status === 'FAIL'
            || sesNotification.receipt.dkimVerdict.status === 'FAIL'
            || sesNotification.receipt.spamVerdict.status === 'FAIL'
            || sesNotification.receipt.virusVerdict.status === 'FAIL') {
                
        console.log('Dropping spam');

        // Stop processing rule set, dropping message
        callback(null, {'disposition':'STOP_RULE_SET'});
    } else {
        callback(null, {'disposition':'CONTINUE'});   
    }
};
```

## Exemple 2 : Continuer si un en-tête spécifique est trouvé
<a name="receiving-email-action-lambda-example-functions-2"></a>

Cet exemple continue de traiter la règle actuelle uniquement si l'e-mail contient une valeur d'en-tête spécifique.

```
export const handler = async (event, context, callback) => {
    console.log('Header matcher');
 
    const sesNotification = event.Records[0].ses;
    console.log("SES Notification:\n", JSON.stringify(sesNotification, null, 2));
    
    // Iterate over the headers
    for (let index in sesNotification.mail.headers) {
        const header = sesNotification.mail.headers[index];
        
        // Examine the header values
        if (header.name === 'X-Header' && header.value === 'X-Value') {
            console.log('Found header with value.');
            callback(null, {'disposition':'CONTINUE'});
            return;
        }
    }
    
    // Stop processing the rule if the header value wasn't found
    callback(null, {'disposition':'STOP_RULE'});
};
```

## Exemple 3 : Récupération de l'e-mail depuis Amazon S3
<a name="receiving-email-action-lambda-example-functions-3"></a>

Cet exemple extrait l'e-mail brut d'Amazon S3 et le traite.

**Note**  
Vous devez d'abord écrire l'e-mail dans Amazon S3 à l'aide d'une action S3.
[Assurez-vous que la fonction Lambda dispose des autorisations IAM pour récupérer des objets depuis le compartiment S3. Reportez-vous à cet article de Re:Post pour plus d'informations.AWS](https://repost.aws/knowledge-center/lambda-execution-role-s3-bucket)
Il est possible que les délais d'exécution Lambda par défaut soient trop courts pour votre flux de travail. Pensez à les augmenter. 

```
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3"; 
const bucketName = '<Your Bucket Name>';

export const handler = async (event, context, callback) => {
    const client = new S3Client();
    console.log('Process email');
  
    var sesNotification = event.Records[0].ses;
    console.log("SES Notification:\n", JSON.stringify(sesNotification, null, 2));
    console.log("MessageId: " + sesNotification.mail.messageId)
  
    const getObjectCommand = new GetObjectCommand({
        Bucket: bucketName,
        Key: sesNotification.mail.messageId
    });
  
    try {
        const response = await client.send(getObjectCommand);
        const receivedMail = await response.Body.transformToString();
        console.log(receivedMail);
        callback(null, {'disposition':'CONTINUE'})
    } catch (e) {
        // Perform error handling here
        console.log("Encountered S3 client error: "+ e, e.stack);
        callback(null, {'disposition':'STOP_RULE_SET'})
    }
};
```

## Exemple 4 : Retour à l'expéditeur des messages pour lesquels l'authentification DMARC échoue
<a name="receiving-email-action-lambda-example-functions-4"></a>

Cet exemple envoie un message de retour à l'expéditeur si l'authentification DMARC échoue pour des e-mails entrants.

**Note**  
Lorsque vous utilisez cet exemple, définissez la valeur de la variable d'environnement `emailDomain` sur votre domaine de réception des e-mails.
Assurez-vous que la fonction Lambda dispose des `ses:SendBounce` autorisations nécessaires pour l'identité SES qui envoie les messages de rebond.

```
import { SESClient, SendBounceCommand } from "@aws-sdk/client-ses";
const sesClient = new SESClient();
// Assign the emailDomain environment variable to a constant.
const emailDomain = process.env.emailDomain;

export const handler = async (event, context, callback) => {
    console.log('Spam filter starting');

    const sesNotification = event.Records[0].ses;
    const messageId = sesNotification.mail.messageId;
    const receipt = sesNotification.receipt;

    console.log('Processing message:', messageId);

    // If DMARC verdict is FAIL and the sending domain's policy is REJECT
    // (p=reject), bounce the email.
    if (receipt.dmarcVerdict.status === 'FAIL' 
        && receipt.dmarcPolicy.status === 'REJECT') {
        // The values that make up the body of the bounce message.
        const sendBounceParams = {
            BounceSender: `mailer-daemon@${emailDomain}`,
            OriginalMessageId: messageId,
            MessageDsn: {
                ReportingMta: `dns; ${emailDomain}`,
                ArrivalDate: new Date(),
                ExtensionFields: [],
            },
            // Include custom text explaining why the email was bounced.
            Explanation: "Unauthenticated email is not accepted due to the sending domain's DMARC policy.",
            BouncedRecipientInfoList: receipt.recipients.map((recipient) => ({
                Recipient: recipient,
                // Bounce with 550 5.6.1 Message content rejected
                BounceType: 'ContentRejected',
            })),
        };

        console.log('Bouncing message with parameters:');
        console.log(JSON.stringify(sendBounceParams, null, 2));
        
        const sendBounceCommand = new SendBounceCommand(sendBounceParams);
        
        // Try to send the bounce. 
        try {
          const response = await sesClient.send(sendBounceCommand);
          console.log(response);
          console.log(`Bounce for message ${messageId} sent, bounce message ID: ${response.MessageId}`);
          // Stop processing additional receipt rules in the rule set.
          callback(null, {disposition: 'STOP_RULE_SET'});
        } catch (e) {
          // If something goes wrong, log the issue.
          console.log(`An error occurred while sending bounce for message: ${messageId}`, e);
          // Perform any additional error handling here
          callback(e)
        }
        
    // If the DMARC verdict is anything else (PASS, QUARANTINE or GRAY), accept
    // the message and process remaining receipt rules in the rule set.
    } else {
        console.log('Accepting message:', messageId);
        callback(null, {disposition: 'CONTINUE'});
    }
};
```