首页 > 解决方案 > 即使我设置了标题“In-Reply-To”和“References”,发送邮件到某个线程也失败了

问题描述

环境

问题

当我尝试将邮件发送到某个线程时,设置了 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>

标签: gogoogle-apigmail-api

解决方案


根据使用 Gmail API 文档管理线程,如果您想向线程添加草稿或消息,您必须满足以下条件:

  1. 请求threadId必须在您随请求提供的消息或 Draft.Message 中指定。

  2. References和标In-Reply-To头必须按照 RFC 2822 标准进行设置。

  3. 标题Subject必须匹配。

因此,threadId必须指定 才能成功插入消息。

参考


推荐阅读