go - 即使我设置了标题“In-Reply-To”和“References”,发送邮件到某个线程也失败了
问题描述
环境
- 戈朗
- GmailAPI(google.golang.org/api/gmail/v1)
问题
当我尝试将邮件发送到某个线程时,设置了 In-Reply-To 和 References 标头,邮件无法附加到该线程。
我的问题:你认为这个问题的原因是什么?
邮件头
在这里我附上邮件的标题。
Received: from 487462728342 named unknown by gmailapi.google.com with HTTPREST; Thu, 19 Nov 2020 22:34:45 -0800
In-Reply-To: <CAMZJxVNx_GfH3mryUr78WD_N6ayz__H3=x7zTocOrWzbo+kcnA@mail.gmail.com>
References: <CAMZJxVM8vEEeuMzzMUbVirk-Mx554putqNs=HyxikWGPSy-Ayw@mail.gmail.com> <CAMZJxVNx_GfH3mryUr78WD_N6ayz__H3=x7zTocOrWzbo+kcnA@mail.gmail.com>
X-Tracking-Address: hogehoge@gmail.com
Subject: Re: Hello
To: moriwm77@gmail.com
CC: hogehoge@gmail.com
BCC:
Content-Type: multipart/mixed; boundary="===============1605854084=="
Date: Thu, 19 Nov 2020 22:34:45 -0800
Message-Id: <CAMZJxVPX-6dZyNy2cSu3eAUMUZ4p-ai62uOH6=MZY7LYq6O5Lg@mail.gmail.com>
From: moriwm77@gmail.com
--===============1605854084==
Content-Type: text/plain; charset="utf-8"
If...
--===============1605854084==--
代码
这是一个调用 GSuite 的 gmail API 的适配器函数。
// SendMail send gmail.
func (api *GSuiteAPI) SendMail(token *oauth2.Token, m Message) error {
ctx := context.Background()
srv, err := gmail.NewService(ctx, option.WithTokenSource(api.config.TokenSource(ctx, token)))
if err != nil {
return handleError(err)
}
boundary := "===============" + strconv.FormatInt(time.Now().Unix(), 10) + "=="
sMail := []string{}
for key, value := range m.Headers {
sMail = append(sMail, key+": "+value)
}
sMail = append(sMail, "Subject: =?UTF-8?B?"+base64.StdEncoding.EncodeToString([]byte(m.Subject))+"?=")
sMail = append(sMail, "To: "+strings.Join(m.To, ","))
sMail = append(sMail, "CC: "+strings.Join(m.CC, ","))
sMail = append(sMail, "BCC: "+strings.Join(m.BCC, ","))
sMail = append(sMail, "Content-Type: multipart/mixed; boundary=\""+boundary+"\"")
// Boby
sMail = append(sMail, "")
sMail = append(sMail, "--"+boundary)
sMail = append(sMail, "Content-Type: text/plain; charset=\"utf-8\"")
sMail = append(sMail, "")
sMail = append(sMail, m.Body)
log.Info().Msgf("%+v", strings.Join(sMail, "\r\n"))
// Attachment
for _, attachment := range m.Attachments {
name := strings.Replace(attachment.Name, "\"", "", -1)
sMail = append(sMail, "")
sMail = append(sMail, "--"+boundary)
sMail = append(sMail, "Content-Type: application/octet-stream; name=\""+name+"\"")
sMail = append(sMail, "Content-Disposition: attachment; filename=\""+name+"\"")
sMail = append(sMail, "Content-Transfer-Encoding: Base64")
sMail = append(sMail, "")
sMail = append(sMail, attachment.Data)
}
source := strings.Join(sMail, "\r\n")
var message gmail.Message
if api.mailConfig.Enable {
message.Raw = base64.
StdEncoding.
EncodeToString([]byte(source))
_, err = srv.Users.Messages.Send("me", &message).Do()
if err != nil {
return handleError(err)
}
}
return nil
}
“In-Reply-To”标头和“References”标头包含在“m.Headers”中。喜欢
m.Headers["In-Reply-To"]
// => <CAMZJxVNx_GfH3mryUr78WD_N6ayz__H3=x7zTocOrWzbo+kcnA@mail.gmail.com>
m.Headers["References"]
// => <CAMZJxVM8vEEeuMzzMUbVirk-Mx554putqNs=HyxikWGPSy-Ayw@mail.gmail.com> <CAMZJxVNx_GfH3mryUr78WD_N6ayz__H3=x7zTocOrWzbo+kcnA@mail.gmail.com>
解决方案
根据使用 Gmail API 文档管理线程,如果您想向线程添加草稿或消息,您必须满足以下条件:
请求
threadId
必须在您随请求提供的消息或 Draft.Message 中指定。
References
和标In-Reply-To
头必须按照 RFC 2822 标准进行设置。标题
Subject
必须匹配。
因此,threadId
必须指定 才能成功插入消息。
参考
推荐阅读
- flutter - Flutter Web 图像选择器仅获取图像文件
- asp.net-core - 使用 oppeniddict 中的隐式和客户端凭据流访问令牌请求的授权失败
- python-3.x - 如何识别序列中缺失的日期并进行估算
- java - 关于java web层之间数据传输的问题
- lua - Lua-cURL: https get into string
- python - Python POST 请求未通过登录页面
- docker - Docker 容器中的目录权限似乎在 MacOS 和 Ubuntu 之间有所不同
- javascript - 默认选择一行并使用 jQuery DataTables 发送 XHR 请求
- multithreading - 如何在不等待另一个 goroutine 中设置的情况下读取频道?
- laravel - Laravel 数据库通知如何只显示那些在当月创建的通知(显示当月通知)