Amazon SES:获取入站电子邮件的真实收件人

时间:2018-02-22 17:57:24

标签: java amazon-web-services email aws-lambda amazon-ses

我目前正在接收来自Amazon SES的电子邮件,我将其存储在Amazon S3上。 然后我有一个程序(用Java编写),它从S3检索电子邮件,解析它们并根据收件人的名字做一个特定的操作。

问题

当电子邮件发送给2个收件人时(让我们说A@mydomain.com和B@mydomain.com),Amazon SES收到2封电子邮件并将其存储在S3中。

这两封电子邮件相同(我的电子邮件客户端设置的某些自定义标题除外)。

我的Java程序从S3检索2封电子邮件但我无法确定每封电子邮件的目标,因为这两个电子邮件地址都出现在" TO"两封电子邮件的标题。

我找到了什么

  • Amazon SES在S3中存储MIME消息

  • 根据Internet Message Format RFC,MIME邮件包含收件人的完整列表,但不包含实际的收件人。 我想这些信息不是Mime Message的一部分,而是协议的一部分。

这意味着:

  • 亚马逊SES必须知道收件人
  • 一旦邮件存储在S3中,此信息就会丢失。

基于此分析正确(可能不是)的事实,我想使用Amazon Lambda表达式检索协议信息并将其存储为S3中电子邮件的元数据。 但是,我找不到检索协议信息的方法。

有什么想法吗?

有人知道如何实现这一目标吗? 如果我能从Lambda表达式中获取每封电子邮件的收件人电子邮件地址会很好,但我没有找到很多关于此的参考资料。

也许我对这项工作(电子邮件协议/流程)的解释是完全错误的,有人可以给我一些解释! :d

一些代码

如果我们在SES级别执行lambda功能,我发现了一些显示我们所拥有信息的代码,但是我没有找到我需要的信息。

https://gist.github.com/gonfva/b249f76893165bf5a8d1

S3Object还包含一些元数据,但它们似乎并不有用。

Bellow是我用来从亚马逊检索电子邮件的Java代码。

package fr.novapost.delivery.emailer.listener.amazon;

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectId;
import org.apache.commons.mail.util.MimeMessageParser;

import javax.mail.Address;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
import java.util.List;
import java.util.Properties;

public class Main {

public static void main(String[] args) {
    // Fill these variables with the proper values.
    String objectName = "";
    String bucketName = "";
    String accessKey = "";
    String secretAccessKey = "";

    BasicAWSCredentials awsCred = new BasicAWSCredentials(accessKey, secretAccessKey);
    AWSCredentialsProvider credentialProvider = new AWSStaticCredentialsProvider(awsCred);

    // Create S3 client
    AmazonS3 amazonS3 = AmazonS3ClientBuilder.standard().withCredentials(credentialProvider).withRegion(Regions.EU_WEST_1).build();

    // Retrieve object from S3
    GetObjectRequest request = new GetObjectRequest(new S3ObjectId(bucketName, objectName));
    S3Object s3Object = amazonS3.getObject(request);

    // Get content of the object (which is the MimeMessage) and create a MimeMessage from it.
    Session s = Session.getInstance(new Properties());
    try {
        MimeMessage mail = new MimeMessage(s, s3Object.getObjectContent());

        // Parse the mime message thanks to the org.apache.commons.mail.util.MimeMessageParser class.
        MimeMessageParser mimeParser = new MimeMessageParser(mail);
        mimeParser.parse();

        // Get the recipient's list.
        // It contains ALL the recipients.
        // I want to know for which specific recipient of this list this email was intended.
        List<Address> addresses = mimeParser.getTo();

        for (Address address : addresses) {
            System.out.println("recipient: " + address.toString());
        }
    } catch (MessagingException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}

1 个答案:

答案 0 :(得分:2)

To:Cc:邮件标题可能会建议收件人无关紧要,因为这些收件人实际上并未用于投放(在BCC的情况下,收件人肯定不会出现在那里)。

您应该会发现SES在顶部的第一个 Received:标题中添加了实际的信封收件人(这是您要查找的内容)。

Return-Path: <...>
Received: from x-x-x (x-x-x [x.x.x.x])
 by inbound-smtp.us-east-1.amazonaws.com with SMTP id xxxxxxxxxxxxxxxxxxxx
 for the-actual-recipient-is-this-address@example.com;
 Sat, 15 Jul 2017 05:07:18 +0000 (UTC)
X-SES-Spam-Verdict: PASS
X-SES-Virus-Verdict: PASS
当邮件被处理时,

Received:标题会被添加到前面,因此当您工作时它们变得不那么值得信赖 - 但最重要的是来自SES本身。