gpt4 book ai didi

javascript - 使用 AppScript 回复 Gmail 中更改收件人的电子邮件最终进入新线程

转载 作者:行者123 更新时间:2023-11-29 18:49:35 25 4
gpt4 key购买 nike

我的邮箱中有一封电子邮件,我希望 AppScript 程序仅将我和一个特殊的 google 组作为收件人来回复它。这样做的目的是程序与我进行通信,因为程序一旦处理完消息就会回复消息,并在回复正文中提供有关处理的必要详细信息。原始邮件中可能还有除我之外的其他收件人,我不希望程序将回复发送给他们。

所以我需要用一组改变的收件人来回复。当我在 Gmail GUI 中执行此操作时,它工作得很好,我点击回复,更改收件人,发送邮件,回复最终出现在原始线程中。但是,当我在脚本中执行此操作时,回复总是以新线程结束。最初我认为 Gmail 会根据电子邮件的主题来决定,但它似乎还有更多(也许它最近发生了变化,因为我认为它过去是这样工作的)。

我尝试了多种略有不同的方法,其中之一是:

var messageBody = "foo";
var newRecipients = "me@gmail.com, my-group@gmail.com";
var messageToReplyTo = ...;
var advancedParams = {from : "my-alias@gmail.com"};

var replyDraft = messageToReplyTo.createDraftReply(messageBody);
var replySubject = replyDraft.getMessage().getSubject();
var replyBody = replyDraft.getMessage().getBody();

replyDraft.update(newRecipients, replySubject, replyBody, advancedParams);

replyDraft.send();

最佳答案

为了实现这一目标,您需要做几件有趣的事情,但您可以轻松完成。您一定要查看 Drafts 的指南.

Per the API spec:

In order to be part of a thread, a message or draft must meet the following criteria:

  1. The requested threadId must be specified on the Message or Draft.Message you supply with your request.
  2. The References and In-Reply-To headers must be set in compliance with the RFC 2822 standard.
  3. The Subject headers must match.

首先,您需要获得对要更新的草稿的引用。这可能是使用 GmailApp 最简单的方法:

const thread = /** get the thread somehow */;
const newBody = /** your plaintext here */;
const reply = thread.createDraftReply(newBody);

Gmail 和 Drafts 的主要问题是 Draft 是发送到服务器资源的不可变消息。如果你改变了其中的任何一个,你就改变了它的全部。因此,要更改收件人地址等 header 值,您需要完全重建邮件。这就是为什么使用 GmailApp methods to update a draft无法维护现有线程信息 - 您不能将其指定为构建新消息的高级选项之一。因此,您必须使用 Gmail REST API 来完成此任务:

const rawMsg = Gmail.Users.Drafts.get("me", reply.getId(), {format: "raw"}).message;

要更新草稿,您需要提供以 base64 编码的 RFC 2822 格式消息。如果您愿意将丰富格式的消息部分转换为这样一个有效的字符串,请务必使用非原始格式,因为您可以直接访问 message.payload 中的 header 。 .

要处理原始消息,请知道 Apps 脚本在上述调用中将描述的 base64 编码字符串转换为字节数组。飞跃是将该字节数组视为字符串字节,具体来说,charCodes:

const msg_string = rawMsg.raw.reduce(function (acc, b) { return acc + String.fromCharCode(b); }, "");
console.log({message: "Converted byte[] to str", bytes: rawMsg.raw, str: msg_string});

一旦您将消息作为字符串,您就可以使用正则表达式来更新所需的 header :

const pattern = /^To: .+$/m;
var new_msg_string = msg_string.replace(pattern, "To: <....>");
// new_msg_string += ....

由于 Gmail API 端点为 update a Draft需要一个 base64 网络安全编码字符串,你可以计算:

const encoded_msg = Utilities.base64EncodeWebSafe(new_msg_string);

唯一剩下的就是执行调用(和/或 send 更新后的草稿)。

const resource = {
id: <draft id>, // e.g. reply.getId()
message: {
threadId: <thread id>, // e.g. thread.getId()
raw: encoded_msg
}
}
const resp = Gmail.Users.Drafts.update(resource, "me", reply.getId());
const sent_msg = Gmail.Users.Drafts.send({id: resp.id}, "me");
console.log({message: "Sent the draft", msg: sent_msg});

我并不声称对从 Message.raw 属性返回的 Byte 数组的处理是 100% 正确的,只是它看起来是正确的,但实际上并不正确导致我发送的测试消息出现任何错误。可能还有一种更简单的方法,因为 Apps 脚本服务有一个 Drafts.update 端点,它接受 Blob 输入,我还没有研究如何使用它。

关于javascript - 使用 AppScript 回复 Gmail 中更改收件人的电子邮件最终进入新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51786588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com