Este tema contiene ejemplos de funciones de Lambda que controlan el flujo de correo.
Ejemplo 1: Rechazar spam
Este ejemplo detiene el procesamiento de mensajes que tienen al menos un indicador de spam.
exports.handler = function(event, context, callback) {
console.log('Spam filter');
var 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, null);
}
};
Ejemplo 2: Continuar si se encuentra un encabezado en particular
Este ejemplo continúa el procesamiento de la regla actual únicamente si el email contiene un valor de encabezado específico.
exports.handler = function(event, context, callback) {
console.log('Header matcher');
var sesNotification = event.Records[0].ses;
console.log("SES Notification:\n", JSON.stringify(sesNotification, null, 2));
// Iterate over the headers
for (var index in sesNotification.mail.headers) {
var 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, null);
return;
}
}
// Stop processing the rule if the header value wasn't found
callback(null, {'disposition':'STOP_RULE'});
};
Ejemplo 3: Recuperar correo electrónico de Amazon S3
Este ejemplo obtiene el correo electrónico sin procesar de Amazon S3 y lo procesa.
nota
En primer lugar, debe escribir el correo electrónico en Amazon S3 con una acción de S3.
var AWS = require('aws-sdk');
var s3 = new AWS.S3();
var bucketName = '<YOUR BUCKET GOES HERE>';
exports.handler = function(event, context, callback) {
console.log('Process email');
var sesNotification = event.Records[0].ses;
console.log("SES Notification:\n", JSON.stringify(sesNotification, null, 2));
// Retrieve the email from your bucket
s3.getObject({
Bucket: bucketName,
Key: sesNotification.mail.messageId
}, function(err, data) {
if (err) {
console.log(err, err.stack);
callback(err);
} else {
console.log("Raw email:\n" + data.Body);
// Custom email processing goes here
callback(null, null);
}
});
};
Ejemplo 4: Rebotar los mensajes que no superan la autenticación DMARC
Este ejemplo envía un mensaje de rebote si un email entrante no supera la autenticación DMARC.
nota
Cuando utilice este ejemplo, defina el valor de la variable de entorno emailDomain
en su dominio de recepción de emails.
'use strict';
const AWS = require('aws-sdk');
// Assign the emailDomain environment variable to a constant.
const emailDomain = process.env.emailDomain;
exports.handler = (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));
// Try to send the bounce.
new AWS.SES().sendBounce(sendBounceParams, (err, data) => {
// If something goes wrong, log the issue.
if (err) {
console.log(`An error occurred while sending bounce for message: ${messageId}`, err);
callback(err);
// Otherwise, log the message ID for the bounce email.
} else {
console.log(`Bounce for message ${messageId} sent, bounce message ID: ${data.MessageId}`);
// Stop processing additional receipt rules in the rule set.
callback(null, {
disposition: 'stop_rule_set',
});
}
});
// 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();
}
};