如何在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
相关产品推荐
相关产品推荐

