Получение / чтение электронных писем от SES

Я пытаюсь настроить AWS SES и у меня проблемы с чтением / получением писем. В конечном счете, я хочу иметь возможность использовать Outlook или другое мобильное клиентское приложение для просмотра писем, отправленных / полученных на проверенные адреса с помощью SES.

Я успешно подтвердил свой домен и адреса электронной почты. Кроме того, я настроил квитанцию ​​о прочтении, которая перенаправляет все полученные электронные письма от SES в корзину S3, но я не уверен, как вывести эти электронные письма, используя IMAP/POP3.

Нужно ли мне создавать свой собственный почтовый сервер в сочетании с lambda функция пересылки полученного письма на этот сервер, чтобы я мог вытащить эти письма с помощью клиентского приложения. Нет ли способа напрямую подключиться к SES с помощью IMAP/POP3? Наконец, мне нужно настроить весь стек электронной почты или есть упрощенный (предпочтительно NodeJS) почтовый сервер, который может просто передавать сообщения клиенту.

Спасибо,

2 ответа

Решение

В настоящее время IMAP/POP3 не поддерживается с SES. У меня было такое же требование, и после оценки нескольких подходов я использовал лямбду для пересылки электронных писем на свою веб-почту.

Вы можете использовать следующий лямбда-код для пересылки писем, пересылаемых в тему SNS.

var AWS = require('aws-sdk');
var forwardFrom = process.env.from_address;
var forwardTo = process.env.to_address;
exports.handler = function(event, context) {
    var msgInfo = JSON.parse(event.Records[0].Sns.Message);

    // don't process spam messages
    if (msgInfo.receipt.spamVerdict.status === 'FAIL' || msgInfo.receipt.virusVerdict.status === 'FAIL') {
        console.log('Message is spam or contains virus, ignoring.');
        context.succeed();
    }

    var email = msgInfo.content,
        headers = "From: " + forwardFrom + "\r\n";
    headers += "Reply-To: " + msgInfo.mail.commonHeaders.from[0] + "\r\n";
    headers += "X-Original-To: " + msgInfo.mail.commonHeaders.to[0] + "\r\n";
    headers += "To: " + forwardTo + "\r\n";
    headers += "Subject: Fwd: " + msgInfo.mail.commonHeaders.subject + "\r\n";

    if (email) {
        var res;
        res = email.match(/Content-Type:.+\s*boundary.*/);
        if (res) {
            headers += res[0] + "\r\n";
        } else {
            res = email.match(/^Content-Type:(.*)/m);
            if (res) {
                headers += res[0] + "\r\n";
            }
        }

        res = email.match(/^Content-Transfer-Encoding:(.*)/m);
        if (res) {
            headers += res[0] + "\r\n";
        }

        res = email.match(/^MIME-Version:(.*)/m);
        if (res) {
            headers += res[0] + "\r\n";
        }

        var splitEmail = email.split("\r\n\r\n");
        splitEmail.shift();

        email = headers + "\r\n" + splitEmail.join("\r\n\r\n");
    } else {
        email = headers + "\r\n" + "Empty email";
    }

    new AWS.SES().sendRawEmail({
        RawMessage: { Data: email }
    }, function(err, data) {
        if (err) context.fail(err);
        else {
            console.log('Sent with MessageId: ' + data.MessageId);
            context.succeed();
        }
    });
}

Примечание. Чтобы это работало, вам нужно настроить from_address и to_address вместе с ролями IAM.

Подробные шаги см. В следующей средней статье, в которой также будет ссылка на репозиторий Github со стеком CloudFormation для автоматической подготовки.

Пересылка писем на ваш почтовый ящик с помощью Amazon SES

В качестве альтернативы вы можете использовать Amazon Workmail для получения электронных писем, но это добавит ежемесячную стоимость подписки.

Обновлен код @Ashan для Node.js 18 и AWS SDK v3, текущей рекомендуемой среды SES.

      const {
    SESClient,
    SendRawEmailCommand
} = require("@aws-sdk/client-ses");
const forwardFrom = process.env.from_address;
const forwardTo = process.env.to_address;
exports.handler = function(event, context) {
    const msgInfo = JSON.parse(event.Records[0].Sns.Message);

    // don't process spam messages
    if (msgInfo.receipt.spfVerdict.status === 'FAIL'
            || msgInfo.receipt.dkimVerdict.status === 'FAIL' 
            || msgInfo.receipt.spamVerdict.status === 'FAIL' 
            || msgInfo.receipt.virusVerdict.status === 'FAIL') {
        console.log('Message is spam or contains virus, ignoring.');
        context.succeed();
    }

    let email = msgInfo.content,
        headers = "From: " + forwardFrom + "\r\n";
    headers += "Reply-To: " + msgInfo.mail.commonHeaders.from[0] + "\r\n";
    headers += "X-Original-To: " + msgInfo.mail.commonHeaders.to[0] + "\r\n";
    headers += "To: " + forwardTo + "\r\n";
    headers += "Subject: Fwd: " + msgInfo.mail.commonHeaders.subject + ")\r\n";

    if (email) {
        let res;
        res = email.match(/Content-Type:.+\s*boundary.*/);
        if (res) {
            headers += res[0] + "\r\n";
        } else {
            res = email.match(/^Content-Type:(.*)/m);
            if (res) {
                headers += res[0] + "\r\n";
            }
        }

        res = email.match(/^Content-Transfer-Encoding:(.*)/m);
        if (res) {
            headers += res[0] + "\r\n";
        }

        res = email.match(/^MIME-Version:(.*)/m);
        if (res) {
            headers += res[0] + "\r\n";
        }

        let splitEmail = email.split("\r\n\r\n");
        splitEmail.shift();

        email = headers + "\r\n" + splitEmail.join("\r\n\r\n");
    } else {
        email = headers + "\r\n" + "Empty email";
    }

    const command = new SendRawEmailCommand({
        RawMessage: {
            Data: Buffer.from(email)
        }
    });
    const client = new SESClient();
    client.send(command)
        .then(function(data) {
            console.log('Sent with MessageId: ' + data.MessageId);
            context.succeed();
        })
        .catch(function(err) {
            context.fail(err);
        });
};
Другие вопросы по тегам