如何在Azure Event Grid中获取自定义邮件头x-yot-custom-id?
关于Azure Event Grid邮件事件中访问自定义邮件头的问题
目前Azure Communication Services (ACS) 的Event Grid邮件状态事件(比如你代码里的AcsEmailDeliveryReportReceivedEventData)不会包含自定义邮件头,包括你添加的x-yot-custom-id。
原因说明
ACS的Event Grid邮件事件仅传递投递状态相关的核心元数据,比如MessageId、收件人、投递状态、错误详情等,自定义邮件头属于邮件内容的一部分,不在事件的默认返回字段范围内。另外,当前ACS也没有提供通过MessageId检索已发送邮件完整内容(含自定义头)的API接口,所以你尝试通过检索邮件获取头的方法确实不可行。
可行的替代方案
要实现邮件与系统记录的关联,最可靠的方式是提前保存MessageId与自定义ID的映射关系:
发送邮件时保存关联数据
在调用SendAsync发送邮件后,ACS会返回一个唯一的MessageId,你需要将这个MessageId和你的x-yot-custom-id(以及对应的系统记录ID)一起存入自己的数据库:// 发送邮件并获取MessageId var sendResult = await emailClient.SendAsync(WaitUntil.Completed, emailMessage); string messageId = sendResult.Value.MessageId; // 保存映射关系到数据库 await _yourDatabase.SaveEmailTrackingAsync(new EmailTracking { MessageId = messageId, CustomId = "123abc", // 你的自定义x-yot-custom-id SystemRecordId = "你的系统业务记录ID", SentTime = DateTime.UtcNow });在Event Grid事件中通过MessageId关联
当收到Event Grid的状态事件时,用事件中的statusEvent.MessageId查询数据库,获取对应的自定义ID和系统记录,再完成状态更新:if (eventData is AcsEmailDeliveryReportReceivedEventData statusEvent) { // 从数据库查询映射关系 var trackingRecord = await _yourDatabase.GetEmailTrackingByMessageIdAsync(statusEvent.MessageId); if (trackingRecord != null) { // 使用自定义ID关联系统记录,执行状态更新 await _azureEmailClient.UpdateStatus( trackingRecord.SystemRecordId, DateTime.UtcNow, statusEvent.Recipient, statusEvent.Status?.ToString(), statusEvent.DeliveryStatusDetails.StatusMessage ); } }
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

