如何自动将Office 365 Outlook邮件及附件同步至AWS S3?
Office 365 Outlook邮件及附件自动同步到AWS S3的实现方案
方案一:AWS Lambda + Microsoft Graph API
这是无服务器后台运行的最优方案,完全符合要求:
Azure AD应用配置
- 登录Azure门户,注册新的Azure AD应用程序,获取
租户ID、客户端ID、客户端密钥。 - 为应用添加应用权限:
Mail.Read(必须是应用权限而非委派权限,因为Lambda是后台无交互运行),并授予管理员同意。
- 登录Azure门户,注册新的Azure AD应用程序,获取
Lambda函数开发
用Python编写函数,核心逻辑是调用Microsoft Graph API拉取邮件及附件,再上传到S3。示例代码如下:import boto3 import requests import os from urllib.parse import quote # 从Lambda环境变量读取配置 TENANT_ID = os.environ['TENANT_ID'] CLIENT_ID = os.environ['CLIENT_ID'] CLIENT_SECRET = os.environ['CLIENT_SECRET'] S3_BUCKET = os.environ['S3_BUCKET'] def get_access_token(): token_url = f"https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token" payload = { 'client_id': CLIENT_ID, 'client_secret': CLIENT_SECRET, 'scope': 'https://graph.microsoft.com/.default', 'grant_type': 'client_credentials' } resp = requests.post(token_url, data=payload) resp.raise_for_status() return resp.json()['access_token'] def sync_emails(): token = get_access_token() headers = {'Authorization': f'Bearer {token}'} # 拉取未读收件箱邮件并扩展附件信息,可修改$filter调整同步规则 msg_url = "https://graph.microsoft.com/v1.0/me/mailfolders/inbox/messages?$expand=attachments&$filter=isRead eq false" resp = requests.get(msg_url, headers=headers) resp.raise_for_status() messages = resp.json()['value'] s3_client = boto3.client('s3') for msg in messages: # 处理邮件主题特殊字符,避免S3路径错误 safe_subject = quote(msg['subject'].replace('/', '_').replace('\\', '_')) msg_id = msg['id'] # 标记邮件为已读,避免重复同步 requests.patch(f"https://graph.microsoft.com/v1.0/me/messages/{msg_id}", headers=headers, json={'isRead': True}) if 'attachments' in msg: for att in msg['attachments']: if att['@odata.type'] == '#microsoft.graph.fileAttachment': # 下载附件内容 att_download_url = f"https://graph.microsoft.com/v1.0/me/messages/{msg_id}/attachments/{att['id']}/$value" att_resp = requests.get(att_download_url, headers=headers) att_resp.raise_for_status() # 构造S3存储路径 s3_key = f"outlook_sync/{safe_subject}/{att['name']}" # 上传到S3 s3_client.put_object( Bucket=S3_BUCKET, Key=s3_key, Body=att_resp.content, ContentType=att['contentType'] ) def lambda_handler(event, context): sync_emails() return {'statusCode': 200, 'body': 'Sync completed'}Lambda配置
- 在Lambda控制台添加环境变量:
TENANT_ID、CLIENT_ID、CLIENT_SECRET、S3_BUCKET。 - 为Lambda的IAM角色添加
s3:PutObject权限,目标为指定S3桶。 - 配置CloudWatch Events触发器,设置定时规则(如每小时一次)实现自动同步。
- 在Lambda控制台添加环境变量:
注意事项
- 若附件超过4MB,需使用Graph API增量下载接口实现分段下载,参考官方文档调整代码。
- 修改Graph API的
$filter参数,可实现仅同步特定发件人、主题含关键词的邮件等精细规则。
方案二:服务器端定时脚本
若偏好传统服务器部署,可在EC2或其他云服务器上运行脚本,配合定时任务实现同步:
环境准备
- 安装Python及依赖(
requests、boto3)。 - 配置AWS凭证:通过IAM角色关联服务器(推荐),或在服务器上配置
~/.aws/credentials。
- 安装Python及依赖(
脚本开发
逻辑与Lambda函数一致,去掉lambda_handler,直接执行sync_emails()函数。定时任务配置
- Linux系统:用
crontab添加定时任务,例如每天凌晨2点执行:0 2 * * * /usr/bin/python3 /path/to/your/sync_script.py - Windows系统:用“任务计划程序”创建定时任务。
- Linux系统:用
方案三:Microsoft Power Automate云流
若不想编写代码,可尝试Power Automate云流方案,之前连接器配置失败可能是权限或配置问题:
创建云流
- 登录Power Automate,选择“创建”→“自动化云流”,触发条件选“当有新邮件到达时(V3)”,关联你的Office 365 Outlook账户。
- 添加动作“获取邮件附件”,选择触发动作中的邮件。
- 添加AWS S3的“上传文件”动作,配置AWS账户(需授予S3写入权限),选择目标桶,映射附件内容和文件名。
优化同步规则
- 在触发动作中设置过滤条件:如仅同步收件箱、未读邮件、特定文件夹的邮件。
- 添加“标记邮件为已读”动作,避免重复同步。
内容的提问来源于stack exchange,提问作者goka
相关产品推荐
相关产品推荐

