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

如何在Go msgraph-sdk-go中转发邮件并添加Cc/Bcc收件人?

解决Go msgraph-sdk-go转发邮件无法添加Cc/Bcc的问题

问题根源

你之前的代码存在两个核心问题:

  • 混用了Forward接口的请求体作为CreateForward的参数,该请求体仅暴露SetToRecipients()方法,生成的初始草稿未正确绑定收件人结构;
  • 后续通过Patch修改草稿收件人后,服务器端仍无法识别有效收件人,导致Send时抛出“未定义收件人”错误。

解决方案

方案一:直接创建带完整收件人的转发草稿(推荐)

使用CreateForward专属的请求体,在创建草稿阶段就传入To、Cc、Bcc收件人,无需后续Patch操作,直接发送即可:

func forwardMessage(id string, toRecipients []models.Recipientable, ccRecipients []models.Recipientable, bccRecipients []models.Recipientable) (success bool) {
    var err error
    var message models.Messageable
    // 使用CreateForward对应的请求体,而非Forward接口的请求体
    requestBody := users.NewItemMailFoldersItemMessagesItemCreateForwardPostRequestBody()

    requestBody.SetToRecipients(toRecipients)
    if len(ccRecipients) > 0 {
        requestBody.SetCcRecipients(ccRecipients)
    }
    if len(bccRecipients) > 0 {
        requestBody.SetBccRecipients(bccRecipients)
    }

    // 创建包含所有收件人的转发草稿
    message, err = pClient.Users().ByUserId(cpMailbox).Messages().ByMessageId(id).CreateForward().Post(context.Background(), requestBody, nil)
    if err != nil {
        fmt.Println(getOdataErrorV1(err).Error())
        return false
    }

    // 直接发送草稿
    err = pClient.Users().ByUserId(cpMailbox).Messages().ByMessageId(*message.GetId()).Send().Post(context.Background(), nil)
    if err != nil {
        fmt.Println(getOdataErrorV1(err).Error())
        return false
    }

    return true
}

方案二:直接转发(跳过草稿)

如果无需创建草稿,可直接给Forward请求体的公开字段赋值(绕过SDK生成方法的限制):

func forwardMessageDirect(id string, toRecipients []models.Recipientable, ccRecipients []models.Recipientable, bccRecipients []models.Recipientable) (success bool) {
    var err error
    requestBody := users.NewItemMailFoldersItemMessagesItemForwardPostRequestBody()
    requestBody.SetToRecipients(toRecipients)
    
    // 手动设置Cc/Bcc字段(SDK生成的Set方法缺失,但字段本身是公开的)
    if len(ccRecipients) > 0 {
        requestBody.CcRecipients = ccRecipients
    }
    if len(bccRecipients) > 0 {
        requestBody.BccRecipients = bccRecipients
    }

    err = pClient.Users().ByUserId(cpMailbox).Messages().ByMessageId(id).Forward().Post(context.Background(), requestBody, nil)
    if err != nil {
        fmt.Println(getOdataErrorV1(err).Error())
        return false
    }

    return true
}

说明

  • 方案一通过CreateForward的专属请求体,确保草稿从创建时就包含完整的收件人信息,符合Graph API的校验逻辑;
  • 方案二利用Go结构体字段的公开性,直接给Forward请求体赋值Cc/Bcc,无需额外操作即可完成转发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:34:54