Google App Script Gmail插件:回复草稿无法归入原邮件线程问题
问题:Gmail插件回复邮件无法归入原线程
我用Google App Script开发了一款简化邮件回复流程的插件,替代以下手动操作:
- 在邮件界面转发邮件
- 复制原邮件收件人地址并粘贴到转发邮件
- 复制原邮件抄送地址并粘贴到转发邮件
- 添加一段短文本
- 将邮件保存到“草稿”文件夹
插件代码如下:
function REP() { // 激活临时Gmail权限,允许插件读取邮件元数据和内容 var accessToken = e.gmail.accessToken; GmailApp.setCurrentMessageAccessToken(accessToken); var d1 = CardService.newDivider(); var textToIn2 = CardService.newTextInput() .setFieldName("textTO2") .setMultiline(true); var composeAction = CardService.newAction() .setFunctionName('createReplyDraft'); var composeButton = CardService.newTextButton() .setText('FK3') .setComposeAction(composeAction, CardService.ComposedEmailType.REPLY_AS_DRAFT); var cardSection1 = CardService.newCardSection() .addWidget(textToIn2) .addWidget(d1) .addWidget(composeButton); var card = CardService.newCardBuilder() .addSection(cardSection1) .build(); return card; } function createReplyDraft(e) { // 创建回复草稿 var messageId = e.gmail.messageId; var message = GmailApp.getMessageById(messageId); var mto = message.getTo(); var mfrom = message.getFrom(); var mtoCC0 = message.getCc(); var mSub = message.getSubject(); var mBody = message.getBody(); var mAttach = message.getAttachments(); var f = "some e-mail adresss @aaaaaa.com"; // 要添加的地址 var Findf = false; if (mtoCC0.indexOf(f) < 0) { Findf = true; } if (Findf) { mtoCC0= mtoCC0 + " ," + f ;} var textget = e.formInputs.textTO2; mBody = "<br>" + textget + "<br><br><br>" + mBody; var draft = message.createDraftReply('', { cc: mtoCC0, htmlBody: mBody, attachments: mAttach, replyTo: mfrom, subject: mSub }); return CardService.newComposeActionResponseBuilder() .setGmailDraft(draft).build(); }
目前遇到的问题:同事收到我的回复时,邮件显示为新邮件而非原邮件线程的续接,请问需要修改哪些内容才能让回复归入原邮件线程?
插件的appsscript.json配置如下:
{ "oauthScopes": [ "https://www.googleapis.com/auth/script.container.ui", "https://www.googleapis.com/auth/gmail.addons.execute", "https://www.googleapis.com/auth/gmail.addons.current.message.metadata", "https://www.googleapis.com/auth/gmail.modify", "https://www.googleapis.com/auth/gmail.addons.current.action.compose", "https://www.googleapis.com/auth/script.locale" ], "gmail": { "name": "FallowK", "logoUrl": "https://www.gstatic.com/images/icons/material/system/1x/label_googblue_24dp.png", "primaryColor": "#07b4ed", "secondaryColor": "#ed7207", "contextualTriggers": [ { "unconditional": {}, "onTriggerFunction": "REP" } ] }, "timeZone": "Europe/Warsaw", "dependencies": {}, "exceptionLogging": "STACKDRIVER", "runtimeVersion": "V8" }
解决方案
Gmail通过邮件主题(需包含Re:前缀)和邮件头的In-Reply-To/References字段关联线程。当前代码手动指定原主题,覆盖了createDraftReply自动添加Re:前缀和线程关联头的默认行为,导致邮件无法归入原线程。
需要修改以下两处:
1. 修复主题格式(避免重复添加Re:)
在createDraftReply函数中,替换原主题处理代码:
var mSub = message.getSubject(); // 检查主题是否已包含Re:前缀,避免重复添加 if (!mSub.startsWith("Re: ")) { mSub = "Re: " + mSub; }
2. 简化createDraftReply参数,让方法自动处理线程关联
删除手动指定的subject和replyTo参数,让createDraftReply自动生成线程关联所需的邮件头和主题:
var draft = message.createDraftReply('', { cc: mtoCC0, htmlBody: mBody, attachments: mAttach });
修改后,createDraftReply会自动设置正确的In-Reply-To和References头,同时确保主题带有Re:前缀,让回复邮件正确归入原线程。
内容的提问来源于stack exchange,提问作者Chora Poczta
相关产品推荐
相关产品推荐

