前言

本文适用于接受以 POST 方法提交 JSON 体的 API 对端的通知解决方案,此案以 Telegram Bot 为例。

以前的 Gmail Bot 还是很好用的,对于笔者这种重度用户来说登录网页来看邮件的时效性和便捷性都不如早起醒来瞄一眼 Bot 分类栏里出现的小红点——虽是十余年前的迷思,在手机上使用邮件 App 查看或同步邮件的话,其本家邮件(或是委托其同步的邮件)基本都是通过系统推送渠道告知用户新到的,若没有提供商的支持,透过 POP 等协议来同步的能耗和及时性都不及打开 IM 听任联系人 Q 我 8。Zoho Mail 虽然也有 App,但其商用办公解决方案提供的 Webhook 显然更简洁,为什么不用这种更为优雅的耦合方式呢?

本文不涉及到对传入 Webhook 或 API 的操作,因此这里不介绍 Bot 侧的工作,直接从创建 Zoho Deluge 函数开始。

配置 Zoho Mail 的 DRE 函数

需要组织机构管理员「启用集成」https://mailadmin.zoho.com/cpanel/home.do#otherApps/integrations/settings (默认已经启用)

创建 DRE 函数

访问 https://mail.zoho.com/zm/#settings/integrations-settings/DeveloperSpace/dre 并单击「创建函数」,自定义「函数名称」,「类别」选择「传出 Webhook」,在新出现的窗口粘贴以下内容:

info Body;
newLine = hexToText("0A");
summaryValue = Body.get("summary");
subjectValue = Body.get("subject");
senderValue = Body.get("sender");
messageIdValue = Body.get("messageId");
fromAddressValue = Body.get("fromAddress");
modeValue = Body.get("Mode");
notifyHeader = "You have a new mail.";
chatIdValue = "114514191";
messageText = notifyHeader + newLine + "&#x2709; " + "<b>" + senderValue + "</b>" + " &lt;" + "<i>" + fromAddressValue + "</i>" + "&gt; " + newLine + subjectValue + newLine + newLine + summaryValue;
linkValue = "https://mail.zoho.com/zm/#mail/tab/" + messageIdValue;
inlineKeyboardButton = {"text":"Open in Zoho Mail","url":linkValue};
if(modeValue == "6")
{
    result = {"chat_id":chatIdValue,"text":messageText,"parse_mode":"HTML","reply_markup":{"inline_keyboard":{{inlineKeyboardButton}}}};
}
else
{
    result = {};
}
return result;

函数详解

先贴出调用传出 Webhook 时会给到的 Body 的示例内容:

{
    "summary": "这是邮件摘要",
    "sentDateInGMT": 1753886387000, // 邮件发送时间(UTC)的Unix时间戳后加了三个0
    "subject": "这是邮件主题",
    "Mode": 6, // 6是收到,1是发送,其他不知道,文档也没写
    "messageId": 17538863870133100, // Zoho Mail 的信息ID,用于构建直达本邮件的URL
    "toAddress": "<[email protected]>", // 收件人地址
    "folderId": 114514000000001919, // Zoho Mail 的文件夹ID
    "zuid": 114514191, // Zoho 用户 ID
    "size": 114, // 邮件尺寸
    "sender": "John Smith", // 发件人
    "receivedTime": 1753886387114, // 邮件收到时间(UTC)的Unix时间戳,最后三位是毫秒
    "fromAddress": "[email protected]", // 发件人地址
    "html": "<div><div dir=\"ltr\"><div>test2<\/div>\r\n<\/div>\r\n<\/div>", // 邮件内容
    "messageIdString": "1753537733180131300", // 字符串化的信息ID
    "IntegIdList": "1753537733180131300,"
}

回到上一步创建的函数。根据指示,info Body; 一行是必填的;newLine = hexToText("0A"); 则是用来换行(具体原因见后记);后续的各种 Value 无外乎是取出 Body 的值来重新赋予。如果需要处理 sentDateInGMTreceivedTime 则需如下处理:

sentDateValue = Body.get("sentDateInGMT");
receivedTimeValue = Body.get("receivedTime");
sentDateText = sentDateValue.toText("yyyy/MM/dd hh:mm:ss","Asia/Shanghai");
receivedTimeText = receivedTimeValue.toText("yyyy/MM/dd hh:mm:ss","Asia/Shanghai");

参数格式可以参考 https://www.zoho.com/deluge/help/functions/common/to-text.html

notifyHeader 可以自定义甚至删除,chatIdValue 便是 Telegram Bot 对话的 ID,messageText 是用来组合推送消息主体内容的(主要还是仿 Gmail Bot 消息风格,虽然那也不怎么好看就是了);linkValueinlineKeyboardButton 是用于组合内联键盘 (Inline Keyboard) 按钮及其链接的,因为本文做的只是推送而不是互动,因此没有其他花里胡哨的响应;最后的 ifelse 主要用于过滤非「接收」的邮件(比如创建邮件模版、发送邮件等),并隐去其信息,让发送到 Bot API 的内容为空,达到防止不必要的泄露的目的。

配置 Zoho Mail 的传出 Webhook

访问 https://mail.zoho.com/zm/#settings/integrations-settings/DeveloperSpace/outgoingwebhooks 并单击「创建新的配置」,然后「自定义用户名」,并填写「Webhook 的 URL」,此处以 https://api.example.com/bot1145141919:AA8Vosmb4WBajGDcQpLbC9XLEnx8dsppUJv7/sendMessage 为示例;「选择实体」为「邮件」,「选择邮件条件」为「条件类型」中的「没有条件,适用于所有邮件」(当然可以自己配置规则),「有限数据列表」若勾选,Body 中将只提供 subjectfromAddress 等信息。

配置 Webhook

「自定义函数」中,单击「编写函数」按钮,在弹出的窗口中选中刚刚创建的 DRE 函数。点击「保存」,完成创建。此时可见测试通过时的推送消息。

测试邮件推送

结束。

后记

Zoho Deluge 太抽象了,笔者折腾了好久的 \n 换行才发现 Zoho Deluge 有个非常抽象的特性——自动将 \ 转义为 \\ ,该特性未在文档中标出且需向其技术部门发邮件才能关闭,其他藏着掖着的限制也不少,建议不用 Zoho

Last modification:July 30, 2025
If you think my article is useful to you, please feel free to appreciate