Amazon SES:获取入站电子邮件的真实收件人
Amazon SES: Getting the real recipient of an inbound email
我目前正在接收来自存储在 Amazon S3 上的 Amazon SES 的电子邮件。
然后我有一个程序(用 Java 编写)从 S3 检索电子邮件,解析它们并根据收件人的姓名执行特定操作。
问题
当一封电子邮件发送给 2 个收件人(假设 A@mydomain.com 和 B@mydomain.com)时,Amazon SES 收到 2 封电子邮件并将它们都存储在 S3 中。
两封电子邮件完全相同(我的电子邮件客户端设置的一些自定义 header 除外)。
我的 Java 程序从 S3 检索了 2 封电子邮件,但是 我无法确定每封电子邮件的收件人,因为两个电子邮件地址都在 "TO" header 两封电子邮件。
我发现了什么
Amazon SES 将 MIME 消息存储在 S3 中
基于Internet Message Format RFC,MIME 邮件包含收件人的完整列表,但不包含实际收件人。
我猜这个信息不是 Mime 消息的一部分,而是协议的一部分。
意思是:
- Amazon SES 必须知道收件人
- 一旦邮件存储在 S3 中,此信息就会丢失。
基于此分析正确(可能不正确)这一事实,我想使用 Amazon Lambda 表达式检索协议信息并将它们作为电子邮件的元数据存储在 S3 中。
但是,我找不到检索协议信息的方法。
有什么想法吗?
有人知道如何实现吗?
如果我能从 Lambda 表达式中获取每封电子邮件的收件人电子邮件地址,那就太好了,但我没有找到很多关于此的参考资料。
也许我对这项工作(电子邮件协议/过程)的解释是完全错误的,有人可以给我一些解释! :D
一些与之相关的代码
如果我们在 SES 级别执行 lambda 函数,我发现了一些显示信息的代码,但我没有在那里找到我需要的信息。
https://gist.github.com/gonfva/b249f76893165bf5a8d1
S3Object 也包含一些元数据,但它们似乎没有用。
下面是我用来从 Amazon 检索电子邮件的 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();
}
}
}
To:
和 Cc:
邮件 header 可能建议的收件人是无关紧要的,因为它们实际上并未用于投递(对于 BCC,收件人绝对不应该出现在那里)。
您应该会发现 SES 在从顶部开始的 first Received:
header 中添加了实际的信封收件人(这就是您要找的) .
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:
header 会在处理邮件时预先添加,因此您在处理邮件时会变得不那么值得信赖 -- 但最重要的来自 SES 本身。
我目前正在接收来自存储在 Amazon S3 上的 Amazon SES 的电子邮件。 然后我有一个程序(用 Java 编写)从 S3 检索电子邮件,解析它们并根据收件人的姓名执行特定操作。
问题
当一封电子邮件发送给 2 个收件人(假设 A@mydomain.com 和 B@mydomain.com)时,Amazon SES 收到 2 封电子邮件并将它们都存储在 S3 中。
两封电子邮件完全相同(我的电子邮件客户端设置的一些自定义 header 除外)。
我的 Java 程序从 S3 检索了 2 封电子邮件,但是 我无法确定每封电子邮件的收件人,因为两个电子邮件地址都在 "TO" header 两封电子邮件。
我发现了什么
Amazon SES 将 MIME 消息存储在 S3 中
基于Internet Message Format RFC,MIME 邮件包含收件人的完整列表,但不包含实际收件人。 我猜这个信息不是 Mime 消息的一部分,而是协议的一部分。
意思是:
- Amazon SES 必须知道收件人
- 一旦邮件存储在 S3 中,此信息就会丢失。
基于此分析正确(可能不正确)这一事实,我想使用 Amazon Lambda 表达式检索协议信息并将它们作为电子邮件的元数据存储在 S3 中。 但是,我找不到检索协议信息的方法。
有什么想法吗?
有人知道如何实现吗? 如果我能从 Lambda 表达式中获取每封电子邮件的收件人电子邮件地址,那就太好了,但我没有找到很多关于此的参考资料。
也许我对这项工作(电子邮件协议/过程)的解释是完全错误的,有人可以给我一些解释! :D
一些与之相关的代码
如果我们在 SES 级别执行 lambda 函数,我发现了一些显示信息的代码,但我没有在那里找到我需要的信息。
https://gist.github.com/gonfva/b249f76893165bf5a8d1
S3Object 也包含一些元数据,但它们似乎没有用。
下面是我用来从 Amazon 检索电子邮件的 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();
}
}
}
To:
和 Cc:
邮件 header 可能建议的收件人是无关紧要的,因为它们实际上并未用于投递(对于 BCC,收件人绝对不应该出现在那里)。
您应该会发现 SES 在从顶部开始的 first Received:
header 中添加了实际的信封收件人(这就是您要找的) .
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:
header 会在处理邮件时预先添加,因此您在处理邮件时会变得不那么值得信赖 -- 但最重要的来自 SES 本身。