开发G-Mail Add-In:如何在发送邮件前触发确认对话框?
Gmail Add-On 实现发送前确认对话框的方案
Gmail Apps Script 确实没有像Outlook的ItemSend那样直接拦截发送动作的原生事件,但可以通过自定义撰写界面按钮的方式实现需求,这是目前最可行的方案:
核心思路
替换默认的发送按钮为自定义按钮,点击自定义按钮时先弹出确认对话框,用户确认后再调用API发送邮件。
步骤1:配置Manifest添加自定义撰写按钮
在你的appsscript.json(manifest文件)中添加compose action配置,让自定义按钮显示在邮件撰写界面:
{ "gmail": { "name": "邮件发送确认", "logoUrl": "https://your-logo-url.png", "contextualTriggers": [ { "unconditional": {}, "onTriggerFunction": "showComposeAction" } ], "composeTrigger": { "selectActions": [ { "text": "确认发送", "runFunction": "confirmAndSend" } ], "draftAccess": "WRITE" } } }
步骤2:编写确认与发送逻辑
在你的Apps Script代码中实现三个关键函数:
showComposeAction:加载撰写界面的初始插件卡片(确保插件在撰写界面可见)confirmAndSend:弹出确认对话框,用户确认后触发发送动作sendEmail:实际执行邮件发送操作
// 加载撰写界面的插件卡片 function showComposeAction(e) { const card = CardService.newCardBuilder() .setHeader(CardService.newCardHeader().setTitle("发送确认插件")) .addSection(CardService.newCardSection() .addWidget(CardService.newTextParagraph().setText("点击「确认发送」按钮完成邮件发送"))) .build(); return [card]; } // 弹出确认对话框 function confirmAndSend(e) { const sendAction = CardService.newAction() .setFunctionName("sendEmail") .setParameters({draftId: e.draftId}); const confirmDialog = CardService.newConfirmationDialog() .setTitle("确认发送邮件?") .setText("你确定要发送这封邮件吗?") .setOkButtonText("发送") .setOkAction(sendAction) .setCancelButtonText("取消"); return CardService.newActionResponseBuilder() .setConfirmationDialog(confirmDialog) .build(); } // 实际发送邮件 function sendEmail(e) { const draftId = e.parameters.draftId; try { const draft = GmailApp.getDraft(draftId); draft.send(); const successNotify = CardService.newNotification() .setText("邮件已成功发送") .setType(CardService.NotificationType.SUCCESS); return CardService.newActionResponseBuilder() .setNotification(successNotify) .build(); } catch (error) { const errorNotify = CardService.newNotification() .setText(`发送失败:${error.message}`) .setType(CardService.NotificationType.ERROR); return CardService.newActionResponseBuilder() .setNotification(errorNotify) .build(); } }
注意事项
- 需要引导用户使用自定义的「确认发送」按钮,默认发送按钮无法被拦截,这是当前Gmail插件的限制。
- 确保已在云平台项目中启用
Gmail API(在Apps Script编辑器中依次点击「资源」→「云平台项目」→「API和服务」→「启用API和服务」,搜索启用Gmail API)。 - 测试时需将插件部署为测试版本,添加测试用户后在Gmail中验证功能。
另外还有一种体验较差的备选方案:通过定时触发器监听草稿更新,检测到待发送状态时弹出提示,但这种方式延迟高且可靠性低,不推荐作为主要方案。
内容的提问来源于stack exchange,提问作者Fatih Karameşe
相关产品推荐
相关产品推荐

