【问题标题】:Receiving/Reading Emails From SES从 SES 接收/阅读电子邮件
【发布时间】:2017-11-11 07:55:57
【问题描述】:

我正在尝试设置 AWS SES,但在阅读/接收电子邮件时遇到问题。最终,我希望能够使用 Outlook 或其他一些移动客户端应用程序来查看发送/接收到使用 SES 验证地址的电子邮件。

我已经成功验证了我的域和电子邮件地址。此外,我已经设置了一个已读回执,它将任何从 SES 收到的电子邮件转发到 S3 存储桶,但我不确定如何使用 IMAP/POP3 拉下这些电子邮件。

我是否还需要创建自己的电子邮件服务器并结合lambda 函数将收到的电子邮件转发到该服务器,以便我可以使用客户端应用程序下拉这些电子邮件。有没有办法使用 IMAP/POP3 直接连接到 SES?最后,我是否需要设置整个电子邮件堆栈,或者是否有一个简化的(最好是 NodeJS)邮件服务器,可以只将电子邮件推送到客户端。

谢谢,

【问题讨论】:

    标签: amazon-web-services email amazon-ses


    【解决方案1】:

    目前 SES 不支持 IMAP/POP3。我有类似的要求,在评估了几种方法后,我使用 Lambda 将电子邮件转发到我的网络邮件。

    您可以使用以下 Lambda 代码转发转发到 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 角色才能使其正常工作。

    有关详细步骤,请参阅以下中篇文章,该文章还将链接到带有 CloudFormation 堆栈的 Github 存储库以进行自动配置。

    Forwarding Emails to your Inbox Using Amazon SES

    您也可以使用 Amazon Workmail 接收电子邮件,但会增加每月订阅费用。

    【讨论】:

    • 感谢您的回答。我是否正确理解这一点...当 SES 收到admin@domain.com 的电子邮件时,会调用 lambda 函数以将该电子邮件转发到另一个电子邮件地址,例如example@gmail.com?如果是这样,当example@gmail.com回复转发的邮件时,From地址会显示原来的预期收件人(admin@domain.com)还是转发到的电子邮件地址(example@gmail.com
    • 当前代码替换了原始发件人电子邮件地址,因此当您收到发送至 gmail 的电子邮件时,它将来自您指定的发件人地址。要保留原始发件人地址,您可能需要稍微修改代码,以便可以直接回复原始发件人。
    • var splitEmail = email.split("\r\n\r\n") 将原始电子邮件拆分为具有 2 个字符串元素的数组 - 第一个字符串是原始标题,第二个字符串是原始正文。然后您丢弃原始标题,并在原始正文之前添加您刚刚编写的新标题。但是当您编写这些新标题时发生了什么?我了解您首先在多部分消息中搜索 Content-Type 标头,如果失败,则搜索非多部分 Content-Type,然后将其添加到新标头中。 [继续...]
    • 但是你为什么要搜索 Content-Transfer-Encoding?当您包含原始电子邮件的正文时,它不会自动包含在正确的位置吗?另外,为什么需要包含 MIME-Version 标头?如果你把它排除在外,会发生什么?这是一个非常好的、有用的答案,但是当开发人员不考虑将来处理一段代码的下一个开发人员时,我真的很烦。
    猜你喜欢
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2017-01-30
    • 2018-10-06
    • 2018-09-18
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多