Amazon SES 使用来自 S3ObjectInputStream 对象的 java 读取存储在 s3 存储桶中的电子邮件
Amazon SES reading emails stored in an s3 bucket using java from S3ObjectInputStream object
我已将我的 AWS SES
配置为将所有传入电子邮件存储到 S3 存储桶中,对象键前缀为电子邮件。我有一个 Java 应用程序正在尝试读取该存储桶中的所有对象,然后将它们移动到另一个,以便只有未读的电子邮件保留在存储桶中。我使用以下代码:
public class FileReadImpl
{
private static final Logger logger = LoggerFactory.getLogger(FileReadImpl.class);
AmazonS3 s3;
public void init(String accessKey, String secretKey)
{
s3 = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey));
}
public List<S3ObjectInputStream> readEmailsAndMoveToRead(String accessKeyId, String secretAccessKey, String incommingBucket, String processedBucket)
{
List<S3ObjectInputStream> s3ObjectInputStreamList = new ArrayList<S3ObjectInputStream>();
AWSCredentials credentials = new BasicAWSCredentials(accessKeyId, secretAccessKey);
AmazonS3 s3 = new AmazonS3Client(credentials);
ObjectListing listing = s3.listObjects(incommingBucket, "Email/");
List<S3ObjectSummary> summaries = listing.getObjectSummaries();
while (listing.isTruncated())
{
listing = s3.listNextBatchOfObjects (listing);
summaries.addAll (listing.getObjectSummaries());
}
for (S3ObjectSummary s3ObjectSummary : summaries)
{
String key = s3ObjectSummary.getKey();//getting the key of the item
S3Object object = s3.getObject(
new GetObjectRequest(incommingBucket, key));
S3ObjectInputStream inuptStream = object.getObjectContent();
s3ObjectInputStreamList.add(inuptStream);
if(!s3.doesBucketExist(processedBucket))
{
s3.createBucket(processedBucket);
}
s3.copyObject(incommingBucket, key, processedBucket, key);
s3.deleteObject(incommingBucket, key);
try
{
inuptStream.close();
}
catch (IOException e)
{
logger.error(e.toString());
}
}
return s3ObjectInputStreamList;
}
}
我有另一个服务 class 可以访问上面的 class 以获取电子邮件列表并将它们存储到我的数据库中。代码如下所示:
public void getEmails()
{
FileReadImpl fileReadImpl = new FileReadImpl();
List<S3ObjectInputStream> s3ObjectInputStreamList = fileReadImpl.readEmailsAndMoveToRead("accessKeyId", "secretAccessKey", "incomingBucket", "processedBucket");
for (S3ObjectInputStream s3ObjectInputStream : s3ObjectInputStreamList)
{
//logic to save the email content as emails
}
}
我不确定如何从我拥有的 S3ObjectInputStream
对象中获取电子邮件内容、发件人详细信息、抄送详细信息等。如何处理此对象以获得我需要的所有详细信息。
您必须将输入流转换为 MIME 消息,操作如下:
for (S3ObjectSummary s3ObjectSummary : summaries)
{
String key = s3ObjectSummary.getKey();//getting the key of the item
S3Object object = s3.getObject(
new GetObjectRequest(incommingBucket, key));
InputStream mailFileInputStream = object.getObjectContent();
String bucketKey = object.getKey();
MimeMessage message = getMimeMessageForRawEmailString(mailFileInputStream);//converting input stream to mime message
object.close();
}
public MimeMessage getMimeMessageForRawEmailString(InputStream mailFileInputStream) throws Exception
{
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session, mailFileInputStream);
return message;
}
获得 Mime 消息后,使用解析器读取该消息的内容:
MimeMessageParser parser = new MimeMessageParser(message);
String from = parser.getFrom();
String htmlContent = parser.parse().getHtmlContent();
System.out.println("Body: "+htmlContent);
String plain = parser.parse().getPlainContent();
System.out.println("plain: "+plain);
这样,您将能够读取作为 S3 对象存储在 S3 存储桶中的电子邮件的所有内容
我已将我的 AWS SES
配置为将所有传入电子邮件存储到 S3 存储桶中,对象键前缀为电子邮件。我有一个 Java 应用程序正在尝试读取该存储桶中的所有对象,然后将它们移动到另一个,以便只有未读的电子邮件保留在存储桶中。我使用以下代码:
public class FileReadImpl
{
private static final Logger logger = LoggerFactory.getLogger(FileReadImpl.class);
AmazonS3 s3;
public void init(String accessKey, String secretKey)
{
s3 = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey));
}
public List<S3ObjectInputStream> readEmailsAndMoveToRead(String accessKeyId, String secretAccessKey, String incommingBucket, String processedBucket)
{
List<S3ObjectInputStream> s3ObjectInputStreamList = new ArrayList<S3ObjectInputStream>();
AWSCredentials credentials = new BasicAWSCredentials(accessKeyId, secretAccessKey);
AmazonS3 s3 = new AmazonS3Client(credentials);
ObjectListing listing = s3.listObjects(incommingBucket, "Email/");
List<S3ObjectSummary> summaries = listing.getObjectSummaries();
while (listing.isTruncated())
{
listing = s3.listNextBatchOfObjects (listing);
summaries.addAll (listing.getObjectSummaries());
}
for (S3ObjectSummary s3ObjectSummary : summaries)
{
String key = s3ObjectSummary.getKey();//getting the key of the item
S3Object object = s3.getObject(
new GetObjectRequest(incommingBucket, key));
S3ObjectInputStream inuptStream = object.getObjectContent();
s3ObjectInputStreamList.add(inuptStream);
if(!s3.doesBucketExist(processedBucket))
{
s3.createBucket(processedBucket);
}
s3.copyObject(incommingBucket, key, processedBucket, key);
s3.deleteObject(incommingBucket, key);
try
{
inuptStream.close();
}
catch (IOException e)
{
logger.error(e.toString());
}
}
return s3ObjectInputStreamList;
}
}
我有另一个服务 class 可以访问上面的 class 以获取电子邮件列表并将它们存储到我的数据库中。代码如下所示:
public void getEmails()
{
FileReadImpl fileReadImpl = new FileReadImpl();
List<S3ObjectInputStream> s3ObjectInputStreamList = fileReadImpl.readEmailsAndMoveToRead("accessKeyId", "secretAccessKey", "incomingBucket", "processedBucket");
for (S3ObjectInputStream s3ObjectInputStream : s3ObjectInputStreamList)
{
//logic to save the email content as emails
}
}
我不确定如何从我拥有的 S3ObjectInputStream
对象中获取电子邮件内容、发件人详细信息、抄送详细信息等。如何处理此对象以获得我需要的所有详细信息。
您必须将输入流转换为 MIME 消息,操作如下:
for (S3ObjectSummary s3ObjectSummary : summaries)
{
String key = s3ObjectSummary.getKey();//getting the key of the item
S3Object object = s3.getObject(
new GetObjectRequest(incommingBucket, key));
InputStream mailFileInputStream = object.getObjectContent();
String bucketKey = object.getKey();
MimeMessage message = getMimeMessageForRawEmailString(mailFileInputStream);//converting input stream to mime message
object.close();
}
public MimeMessage getMimeMessageForRawEmailString(InputStream mailFileInputStream) throws Exception
{
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session, mailFileInputStream);
return message;
}
获得 Mime 消息后,使用解析器读取该消息的内容:
MimeMessageParser parser = new MimeMessageParser(message);
String from = parser.getFrom();
String htmlContent = parser.parse().getHtmlContent();
System.out.println("Body: "+htmlContent);
String plain = parser.parse().getPlainContent();
System.out.println("plain: "+plain);
这样,您将能够读取作为 S3 对象存储在 S3 存储桶中的电子邮件的所有内容