如何使用 Gmail 发送回复 API

How To Send A Reply With Gmail API

我有两个 gmail 帐户我创建了一个包含五封邮件的线程,并在此页面上使用 gmail gapi 检索了它们 https://developers.google.com/gmail/api/v1/reference/users/threads/get

这是我得到的:

如您所见,尽管 ID 标识完全相同的字母,但它们并不匹配。为什么会这样,如何获取统一的id?

P.S。我这样做的真正原因是我需要使用 gmail API 发送对消息的回复,但为此,您需要知道您回复的消息的 ID。如果我用我拥有的 id(不是接收者拥有的消息 id)回复消息,它只会发送一条 'new' 消息。

如何使用 Gmail 发送回复 API?

提前致谢。

docs say 一样,如果您尝试发送回复并希望将电子邮件发送到线程,请确保:

  1. Subjectheader匹配
  2. ReferencesIn-Reply-To header 遵循 RFC 2822 标准。

如果您想自己执行此操作,您可以获得要回复的消息的 SubjectReferencesMessage-ID-header:

要求:

userId = me
id = 14fd1c555a1352b7 // id of the message I want to respond to.
format = metadata
metadataHeaders = Subject,References,Message-ID

GET https://www.googleapis.com/gmail/v1/users/me/messages/14fd1c555a1352b7?format=metadata&metadataHeaders=Subject&metadataHeaders=References&metadataHeaders=Message-ID

响应:

{
 "id": "14fd1c555a1352b7",
 "threadId": "14fd1c52911f0f64",
 "labelIds": [
  "SENT",
  "INBOX",
  "IMPORTANT",
  "UNREAD"
 ],
 "snippet": "Next level dude 2015-09-15 18:10 GMT+02:00 Emil Tholin <emtholin@gmail.com>: wow 2015-09-15 18:",
 "historyId": "575289",
 "internalDate": "1442333414000",
 "payload": {
  "mimeType": "multipart/alternative",
  "headers": [
   {
    "name": "In-Reply-To",
    "value": "<CADsZLRyzVPLRQuTthGSHKMCXL7Ora1jNW7h0jvoNgR+hU59BYg@mail.gmail.com>"
   },
   {
    "name": "References",
    "value": "<CADsZLRxZDUGn4Frx80qe2_bE5H5bQhgcqGk=GwFN9gs7Z_8oZw@mail.gmail.com> <CADsZLRyzVPLRQuTthGSHKMCXL7Ora1jNW7h0jvoNgR+hU59BYg@mail.gmail.com>"
   },
   {
    "name": "Message-ID", // This is the same for both users, as you were asking about.
    "value": "<CADsZLRwQWzLB-uq4_4G2E64NX9G6grn0cEeO0L=avY7ajzuAFg@mail.gmail.com>"
   },
   {
    "name": "Subject",
    "value": "Re: Cool"
   }
  ]
 },
 "sizeEstimate": 1890
}

为了遵循 RFC 2822 标准,我们将要响应的消息的 Message-ID 添加到 References-header,并用 space 分隔. In-Reply-To-header 也有我们要回复的消息的值。我们还将 Re: 添加到我们的 Subject-header 以表明它是一个响应。

// Base64-encode the mail and make it URL-safe 
// (replace "+" with "-", replace "/" with "_", remove trailing "=")
var encodedResponse = btoa(
  "Content-Type: text/plain; charset=\"UTF-8\"\n" +
  "MIME-Version: 1.0\n" +
  "Content-Transfer-Encoding: 7bit\n" +
  "References: <CADsZLRxZDUGn4Frx80qe2_bE5H5bQhgcqGk=GwFN9gs7Z_8oZw@mail.gmail.com> <CADsZLRyzVPLRQuTthGSHKMCXL7Ora1jNW7h0jvoNgR+hU59BYg@mail.gmail.com> <CADsZLRwQWzLB-uq4_4G2E64NX9G6grn0cEeO0L=avY7ajzuAFg@mail.gmail.com>\n" +
  "In-Reply-To: <CADsZLRwQWzLB-uq4_4G2E64NX9G6grn0cEeO0L=avY7ajzuAFg@mail.gmail.com>\n" +
  "Subject: Re:Cool\n" +
  "From: sender@gmail.com\n" +
  "To: reciever@gmail.com\n\n" +

  "This is where the response text will go"
).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');

$.ajax({
  url: "https://www.googleapis.com/gmail/v1/users/me/messages/send?access_token=<USER_ACCESS_TOKEN>",
  method: "POST",
  contentType: "application/json",
  data: JSON.stringify({
    raw: encodedResponse
  })
});

如您所见,这是手动操作的背后难题。您也可以只回复线程。但是,这可能不足以满足您的用例。

这样,您只需提供邮件和 threadId,并确保 Subject 相同,Google 就会正确显示。

// Base64-encode the mail and make it URL-safe 
// (replace "+" with "-", replace "/" with "_", remove trailing "=")
var encodedResponse = btoa(
  "Content-Type: text/plain; charset=\"UTF-8\"\n" +
  "MIME-Version: 1.0\n" +
  "Content-Transfer-Encoding: 7bit\n" +
  "Subject: Subject of the original mail\n" +
  "From: sender@gmail.com\n" +
  "To: reciever@gmail.com\n\n" +

  "This is where the response text will go"
).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');

$.ajax({
  url: "https://www.googleapis.com/gmail/v1/users/me/messages/send?access_token=<USER_ACCESS_TOKEN>",
  method: "POST",
  contentType: "application/json",
  data: JSON.stringify({           
    raw: encodedResponse,
    threadId: "<THREAD_ID_OF_MESSAGE_TO_RESPOND_TO>"
  })
});

@Tholle 的回答(谢谢!)是正确的,让我走上了正确的轨道,但在最近的变化之后:

https://gsuiteupdates.googleblog.com/2019/03/threading-changes-in-gmail-conversation-view.html

我不得不把他的两条路混为一谈。

在我的程序中,我必须回复一个主题,但如果我只包含 threadId(如 #2),则 Gmail 仅将新邮件放入回复者邮件中的主题中,而在邮件中原始发件人(也是 gmail)显示为新线程。

我通过将 threadId 和 headers“参考”以及“In-Reply-To”与上一条消息的 ID 一起解决。