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

如何在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的映射关系:

  1. 发送邮件时保存关联数据
    在调用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
    });
    
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:33:18