Contoh fungsi Lambda - Layanan Email Sederhana Amazon

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Contoh fungsi Lambda

Topik ini berisi contoh fungsi Lambda yang mengendalikan aliran email.

Contoh 1: Hapus spam

Contoh ini menghentikan pemrosesan pesan yang memiliki setidaknya satu indikator spam.

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

Contoh 2: Lanjutkan jika header tertentu ditemukan

Contoh ini terus memproses aturan saat ini hanya jika email berisi nilai header tertentu.

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

Contoh 3: Mengambil email dari Amazon S3

Contoh ini mendapatkan email mentah dari Amazon S3 dan memprosesnya.

catatan
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'}) } };

Contoh 4: Pentalkan pesan yang menggagalkan autentikasi DMARC

Contoh ini mengirimkan pesan pentalan jika email yang masuk gagal autentikasi DMARC.

catatan
  • Saat menggunakan contoh ini, atur nilai variabel lingkungan emailDomain menjadi domain penerima email Anda.

  • Pastikan bahwa fungsi Lambda memiliki ses:SendBounce izin untuk identitas SES yang mengirim pesan bouncing.

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