You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Amazon SES中检索已发送邮件元数据并保存为MSG用于审计

解决方案:AWS SES邮件元数据检索与.msg格式归档

一、检索SES已发送邮件的元数据与内容

AWS SES本身不支持直接回溯已发送邮件的完整内容,以下是两种可靠的实现方案:

1. 发送前预存完整邮件副本(推荐)

在调用SES发送邮件前,先将构建好的完整MIME格式邮件(即.eml格式内容)存储到S3,同时记录SES返回的Message ID作为关联标识,后续可通过该ID快速检索对应邮件。

Python代码示例:

import boto3
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
import base64

# 初始化AWS客户端
ses_client = boto3.client('ses', region_name='us-east-1')
s3_client = boto3.client('s3', region_name='us-east-1')

# 构建完整MIME邮件
msg = MIMEMultipart()
msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'
msg['Subject'] = '审计测试邮件'

# 添加正文
body = MIMEText('这是用于审计的邮件内容', 'plain')
msg.attach(body)

# 添加附件
with open('audit-document.pdf', 'rb') as f:
    part = MIMEBase('application', 'octet-stream')
    part.set_payload(f.read())
base64.encodebytes(part.get_payload())
part.add_header('Content-Disposition', f'attachment; filename="audit-document.pdf"')
msg.attach(part)

# 转换为字符串格式的MIME内容
email_mime = msg.as_string()

# 发送邮件并获取Message ID
send_response = ses_client.send_raw_email(
    Source='sender@example.com',
    Destinations=['recipient@example.com'],
    RawMessage={'Data': email_mime}
)
message_id = send_response['MessageId']

# 将邮件保存到S3,以Message ID作为存储键
s3_client.put_object(
    Bucket='your-audit-archive-bucket',
    Key=f'sent-emails/{message_id}.eml',
    Body=email_mime.encode('utf-8')
)

2. 结合SES配置集捕获元数据

通过SES配置集(Configuration Sets)可以捕获邮件发送、送达等事件,其中包含收件人、主题、Message ID、部分邮件头等元数据,但不包含完整邮件内容和附件。可将此事件数据与S3预存的邮件副本通过Message ID关联,补充元数据维度。

二、将邮件转换为.msg格式

.eml是标准MIME格式,.msg是Outlook专有格式,需通过第三方工具或库转换:

1. Windows环境:使用pywin32调用Outlook API

直接利用Outlook的内置转换能力,适合Windows服务器环境:

import win32com.client
import os

def eml_to_msg(eml_file_path, msg_file_path):
    outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
    msg_item = outlook.OpenSharedItem(eml_file_path)
    msg_item.SaveAs(msg_file_path, 3)  # 3对应Outlook的olMSG格式
    msg_item.Close(0)

# 示例调用
eml_to_msg('s3-downloaded-email.eml', 'audit-archive.msg')

2. 跨平台方案:使用msgkit库

纯Python库,无需依赖Outlook,支持跨平台构建.msg文件:

from msgkit import Message
from email import policy
from email.parser import BytesParser

# 读取S3下载的.eml文件
with open('downloaded-email.eml', 'rb') as f:
    eml_content = BytesParser(policy=policy.default).parse(f)

# 构建.msg对象
msg = Message()
msg.subject = eml_content['Subject']
msg.sender = eml_content['From']
msg.to = eml_content['To']
msg.body = eml_content.get_body(preferencelist=('plain')).get_content()

# 遍历添加附件
for part in eml_content.walk():
    if part.is_attachment() and part.get_filename():
        msg.add_attachment(
            filename=part.get_filename(),
            data=part.get_payload(decode=True),
            mime_type=part.get_content_type()
        )

# 保存为.msg文件
msg.save('audit-archive.msg')

三、架构优化建议

  1. 自动化流程:配置Lambda函数监听S3的Put事件,当.eml文件上传后自动触发转换为.msg,并存入S3的专属归档目录(如msg-archives/)
  2. 检索能力:将Message ID、收件人、发送时间等元数据存入DynamoDB,支持多维度检索,再关联S3的邮件文件
  3. 合规性:对S3桶启用服务器端加密(SSE),仅赋予审计角色访问权限,确保数据符合合规要求

内容的提问来源于stack exchange,提问作者Dewz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:10:19