如何通过Logic Apps提取全部Outlook邮件至SQL表(突破25条限制)
搞定Azure Logic Apps提取全部Outlook邮件的方法
核心逻辑
Office 365 Outlook连接器支持分页获取数据,默认单次最多返回25条,其实可以调到100条的上限,再通过Do Until循环反复请求下一页数据,直到没有更多内容为止,这样就能把上千封邮件全部提取出来。
具体操作步骤
1. 调大单次请求的邮件数量
把原Get emails (V3)里的top参数从25改成100——这是该连接器允许的最大单次返回数,能减少循环次数,提升效率:
"queries": { "importance": "Any", "fetchOnlyWithAttachment": false, "folderPath": "Id::AAMkADU1NzM2NmJiLWUzOGItNDlmZS1iNjc3LWFkYzIzYmMzY2M4NgAuAAAAAAA8vBvBB693S5_H10o_0OuyAQD3AekO3P8LQpKHquyOHAMyAAAAAAEMAAA=", "fetchOnlyUnread": false, "fetchOnlyFlagged": false, "includeAttachments": false, "top": 100 }
2. 用Do Until循环实现分页遍历
- 新建一个变量
nextPageLink,初始值设为@body('Get_emails_(V3)')?['@odata.nextLink']——这个值是API返回的下一页请求地址,为空时就表示没有更多数据了。 - 添加
Do Until循环,终止条件设为@empty(variables('nextPageLink')),也就是直到没有下一页就停止循环。 - 循环内执行三个操作:
- 处理当前页邮件:保留原有的
For_each循环,遍历当前页的邮件列表,把需要的字段插入SQL。原配置里的插入字段是空的,得填上对应的值,比如ReceivedDateTime填@{items('For_each')?['receivedDateTime']},InternetMessageID填@{items('For_each')?['internetMessageId']},发件人填@{items('For_each')?['from']?['emailAddress']?['address']};收件人、抄送、密送可以用join函数把多个地址拼成字符串,比如@{join(items('For_each')?['toRecipients'], '; ')}。 - 请求下一页数据:再添加一个
Get emails (V3)操作,把path改成@{replace(variables('nextPageLink'), 'https://outlook.office365.com/api/v3.0/me/', '')}——因为连接器已经自带基础地址,只需要取路径部分即可。 - 更新分页链接:把
nextPageLink变量更新为新请求返回的@odata.nextLink,让下次循环知道是否要继续请求。
- 处理当前页邮件:保留原有的
3. 补全SQL插入的字段映射
原插入操作的body为空,需要把你要提取的所有字段补充完整,示例如下:
"body": { "ReceivedDateTime": "@{items('For_each')?['receivedDateTime']}", "HasAttachments": "@{items('For_each')?['hasAttachments']}", "InternetMessageID": "@{items('For_each')?['internetMessageId']}", "Sender": "@{items('For_each')?['from']?['emailAddress']?['address']}", "Recipients": "@{join(items('For_each')?['toRecipients'], '; ')}", "CCRecipients": "@{join(items('For_each')?['ccRecipients'], '; ')}", "BCCRecipients": "@{join(items('For_each')?['bccRecipients'], '; ')}", "AttachmentCount": "@{length(items('For_each')?['attachments'])}" }
如果需要存储附件的详细信息,还得在For_each里再加嵌套循环处理每个邮件的附件;如果只需要标记是否有附件,HasAttachments字段就足够。
4. 避免重复提取邮件
因为你的工作流是每日运行,建议添加筛选条件避免重复插入旧数据:
- 在
Get emails (V3)的查询中添加startDateTime参数,设为前一天的当前时间;或者把上次处理的最晚ReceivedDateTime记录到SQL里,下次从该时间点之后开始提取。
修改后的工作流结构
每日触发 ├─ 初始化变量 nextPageLink = 首次请求返回的下一页地址 ├─ 首次获取100封邮件 ├─ 循环直到没有下一页 │ ├─ 遍历当前页邮件,插入SQL │ ├─ 请求下一页邮件 │ └─ 更新nextPageLink为新的下一页地址 └─ (可选) 记录最后处理时间,用于下次筛选
内容的提问来源于stack exchange,提问作者Hemant Kumar
相关产品推荐
相关产品推荐

