You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:27:13