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.
Cette rubrique contient des exemples de fonctions Lambda qui contrôlent le flux de messagerie.
Exemple 1 : Suppression du courrier indésirable
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é
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
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.
-
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 : renvoyer les messages dont l'authentification échoue DMARC
Cet exemple envoie un message de rebond si l'DMARCauthentification d'un e-mail entrant échoue.
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'SESidentité 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'});
}
};