乐于分享
好东西不私藏

能力加码!秒哒自定义插件「邮件推送」功能实践方案

能力加码!秒哒自定义插件「邮件推送」功能实践方案

秒哒支持接入邮件推送插件

融合邮件推送后的秒哒

将“生成结果”与“消息触达”无缝衔接

秒哒不再只停留在系统内部流转

而是把能力延伸到真实世界的收件箱中

👏下文将带大家走完

邮件推送插件接入的全部流程

👇

适用场景

结果通知
生成内容、分析结果完成后邮件提醒
业务提醒
审批结果、任务状态自动通知
运营触达
活动结果、资格校验邮件发送
内容协作
生成 → 审核 → 邮件同步
系统联动
秒哒作为中枢,对外发送消息

    Part 1

    发信域名配置

    小哒这里用一个可以免费申请域名的网站:https://www.cloudns.net/main/

    首先得创建一个ClouDNS账号,进入ClouDNS控制面板

    点击创建域名、选择免费域名、输入域名

    就可以得到免费域名了

    注意⚠️

    一个账号只能申请一个免费域名

    Part2  

    邮件推送配置

    这里以腾讯云邮件配置为例,腾讯云前1000封邮件免费,后面会按量计费,腾讯云邮件配置网址:https://console.cloud.tencent.com/ses

    邮件推送配置需要进行「四个步骤」

    发信域名配置,发信地址配置,发信模版配置和发送邮件。

    接下来让我们一步一步去配置。

    01

    发信域名配置

    选择发信域名模块,点击新建发信域名,填入刚才申请的域名点击创建就可以啦。

    接下来进行发信域名验证,点击待验证域名后面的验证,可以看到发信域名的详细配置。

    • 如果填入的域名是 test.com 形式,这属于主域名;

    • 如果填入的域名是 test.abc.com 形式,这属于非主域名,是否使用主域名发信,在下面的配置中存在差异,详见对应的说明。

    这里以已配置好的miaodayoujian.abrdns.com为例,想要通过验证需要在原来创建域名的网址进行配置。

    点击域名进入配置页面,点击添加新纪录。

    再添加新纪录页面中,需要我们把腾讯云发信域名配置的记录值作为新纪录一个一个填入。

    添加完毕后返回腾讯云配置页面提交验证

    • 如果状态全部显示已验证就说明验证成功~

    • 如果未通过验证,可以在当前页面对比记录值和当前值,返回cloudns对记录进行修改。

    全部模块显示已验证之后会显示验证通过。

    02

    发信地址配置

    选择发信地址模块,点击新建。

    填写邮箱前缀和发件人别名,点击提交,发信地址就创建好了。

    03

    发信模版配置

    选择发信模版模块,点击新建。

    填写模版名称,选择想要的模版类型并根据要求填入内容,点击提交即可。

    创建好的模版需要进行审核,预计1个工作日内完成审核(周末、节假日顺延)。

    为了保证模板通过率,模板内容必须体现实际业务且需要遵循邮件模板内容规范

    我们这里先创建两个纯文本模版作为例子。

    Part3

    发送邮件API配置

    腾讯云API中心-发送邮件网址:https://cloud.tencent.com/document/api/1288/51034

    跟前面几期教程一样,想要在秒哒配置自定义插件,需要三个比较重要的参数:

    「请求参数」「请求示例」和「响应示例」

    首先,请求参数可以在API文档中找到,请求示例和响应示例需要发起调试之后得到。

    同时输入参数中也标明没有申请过特殊配置的话,需要在发起调试里配置模版相关参数。

    发起调试后需要填入这个几个必填的参数和模版相关参数后,点击发送请求。

    发送成功就可以得到请求示例和响应示例

    目标邮箱中也会收到真实信件

    同时,可以看到请求示例有腾讯云API签名,直接放在秒哒里可能无法解析出正确签名,需要把腾讯云API签名示例粘贴给秒哒。

    选择代码示例中的HTTP Request和node.js(秒哒生成的应用大多数用的js代码),然后把代码复制下来一起粘贴给秒哒就可以啦。

    最后记得要在腾讯云访问管理中的API密钥管理新建一个密钥。

    Part4

    秒哒自定义插件配置和测试验证

    回到我们的秒哒官网的「自定义插件模块」,将以上参数粘贴给秒哒并解析:

    可参考以下示例模板: 请帮我创建一个插件,插件内容如下: · 插件名称:邮件发送 · 插件描述:调用腾讯云邮件发送的API服务 · 请求参数: 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:SendEmail。 Version 是 String 公共参数,本接口取值:2020-10-02。 Region 是 String 公共参数,本接口仅支持其中的: ap-guangzhou, ap-hongkong 。 FromEmailAddress 是 String 发件人邮箱地址。不使用别名时请直接填写发件人邮箱地址,例如:noreply@mail.qcloud.com如需填写发件人别名时,请按照如下方式(注意别名与邮箱地址之间必须使用一个空格隔开):别名+一个空格+<邮箱地址>,别名中不能带有冒号(:)。 示例值:QCLOUDTEAM <noreply@mail.qcloud.com> Destination.N 是 Array of String 收信人邮箱地址,最多支持群发50人。注意:邮件内容会显示所有收件人地址,非群发邮件请多次调用API发送。 示例值:["destination@mail.qcloud.com"] Subject 是 String 邮件主题 示例值:YourTestSubject Template 否 Template 使用模板发送时,填写模板相关参数。 · 请求示例:
// 腾讯云API签名v3实现示例 // 本代码基于腾讯云API签名v3文档实现: https://cloud.tencent.com/document/product/213/30654 // 请严格按照文档说明使用,不建议随意修改签名相关代码 const https = require("https") const crypto = require("crypto")  function sha256(message, secret = "", encoding) { const hmac = crypto.createHmac("sha256", secret) return hmac.update(message).digest(encoding) } function getHash(message, encoding = "hex") { const hash = crypto.createHash("sha256"return hash.update(message).digest(encoding) } function getDate(timestamp) { const date = new Date(timestamp * 1000) const year = date.getUTCFullYear() const month = ("0" + (date.getUTCMonth() + 1)).slice(-2) const day = ("0" + date.getUTCDate()).slice(-2) return `${year}-${month}-${day}` }  // 密钥信息从环境变量读取,需要提前在环境变量中设置 TENCENTCLOUD_SECRET_ID 和 TENCENTCLOUD_SECRET_KEY // 使用环境变量方式可以避免密钥硬编码在代码中,提高安全性 // 生产环境建议使用更安全的密钥管理方案,如密钥管理系统(KMS)、容器密钥注入等 // 请参见:https://cloud.tencent.com/document/product/1278/85305 // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 const SECRET_ID = process.env.TENCENTCLOUD_SECRET_ID const SECRET_KEY = process.env.TENCENTCLOUD_SECRET_KEY const TOKEN = ""  const host = "ses.tencentcloudapi.com" const service = "ses" const region = "ap-hongkong" const action = "SendEmail" const version = "2020-10-02" const timestamp = parseInt(String(new Date().getTime() / 1000)) const date = getDate(timestamp) const payload = "{\"FromEmailAddress\":\"test@miaodayoujian.abrdns.com\",\"Destination\":[\"2439307298@qq.com\"],\"Subject\":\"test\",\"Template\":{\"TemplateID\":162186,\"TemplateData\":\"{\\"user_name\\":\\"andy\\",\\"title\\":\\"1\\",\\"original_comment\\":\\"24\\",\\"reply_content\\":\\"24\\",\\"replier_name\\":\\"24\\"}\"}}"  // ************* 步骤 1:拼接规范请求串 ************* const signedHeaders = "content-type;host" const hashedRequestPayload = getHash(payload) const httpRequestMethod = "POST" const canonicalUri = "/" const canonicalQueryString = "" const canonicalHeaders = "content-type:application/json; charset=utf-8\n" + "host:" + host + "\n"  const canonicalRequest = httpRequestMethod + "\n" + canonicalUri + "\n" + canonicalQueryString + "\n" + canonicalHeaders + "\n" + signedHeaders + "\n" + hashedRequestPayload  // ************* 步骤 2:拼接待签名字符串 ************* const algorithm = "TC3-HMAC-SHA256" const hashedCanonicalRequest = getHash(canonicalRequest) const credentialScope = date + "/" + service + "/" + "tc3_request" const stringToSign = algorithm + "\n" + timestamp + "\n" + credentialScope + "\n" + hashedCanonicalRequest  // ************* 步骤 3:计算签名 ************* const kDate = sha256(date, "TC3" + SECRET_KEY) const kService = sha256(service, kDate) const kSigning = sha256("tc3_request", kService) const signature = sha256(stringToSign, kSigning, "hex")  // ************* 步骤 4:拼接 Authorization ************* const authorization = algorithm + " " + "Credential=" + SECRET_ID + "/" + credentialScope + "" + "SignedHeaders=" + signedHeaders + "" + "Signature=" + signature  // ************* 步骤 5:构造并发起请求 ************* const headers = { Authorization: authorization, "Content-Type": "application/json; charset=utf-8", Host: host, "X-TC-Action": action, "X-TC-Timestamp": timestamp, "X-TC-Version": version, }  if (region) { headers["X-TC-Region"] = region } if (TOKEN) { headers["X-TC-Token"] = TOKEN }  const options = { hostname: host, method: httpRequestMethod, headers, }  const req = https.request(options, (res) => { let data = "" res.on("data", (chunk) => { data += chunk })  res.on("end", () => { console.log(data) }) })  req.on("error", (error) => { console.error(error) })  req.write(payload)  req.end()

curl -X POST https://ses.tencentcloudapi.com -H "Authorization: TC3-HMAC-SHA256 Credential=AKIDfBeFD37Mw5jnb2nJajunFMlbSB79ReLklcede_R2U66ejxCtvuTEqFGxsaZ_s3YJ/2026-01-16/ses/tc3_request, SignedHeaders=content-type;host, Signature=4d295ca7c52f6beec2746a0a17bfc67301dd3b09bedbd7faf492af6a338a99dd" -H "Content-Type: application/json" -H "Host: ses.tencentcloudapi.com" -H "X-TC-Action: SendEmail" -H "X-TC-Timestamp: 1768548980" -H "X-TC-Version: 2020-10-02" -H "X-TC-Region: ap-hongkong" -H "X-TC-Language: zh-CN" -H "X-TC-Token: 6jMbAoG3Etb0awctfiiKDje9LJq967Fa167f0bb6d1ddb141471c857f9ba9af62QsxGAXAVet3FFdiBJcZQpkUKnnp64Z8Zg05sjlcuAutFY5SIAp6ickAYaP0guBILzHFCdcUpDFdYJeQUwmKv0AexWly3vOUh7Lq8puZjw8Ls6_DTjISe8j2d_v4qxkqItcQfVFR20dqiQPi5_GQsxPPAw3NUhp9KyO2QqQmYmtE1xx4HdpEFuK57KFeSBHHcZ4DP4EpRRnZHEJUtc8-Pr9wKLvmBqCU94j8S6hKuCykaZ6_fZWU7utKDq7jqx7ZUxl6UY84ZwyzVLFc8hbVQLA" -d '{"FromEmailAddress":"test@miaodayoujian.abrdns.com","Destination":["2439307298@qq.com"],"Subject":"test","Template":{"TemplateID":162186,"TemplateData":"{\"user_name\":\"andy\",\"title\":\"1\",\"original_comment\":\"24\",\"reply_content\":\"24\",\"replier_name\":\"24\"}"}}' · 响应示例: { "Response": { "MessageId": "qcloudses-30-1391750054-date-20260116153620-LJoCOUegIXBN1", "RequestId": "18e86d8d-2c4d-433d-af7a-bc3197f4f159" } }

    在填入刚刚申请的密钥点击创建,自定义插件就配置好了~

    回到秒哒首页,创建应用验证邮件发送功能,可以看到插件被成功调用

    可以成功发送邮件啦~🎉

    小哒负责应用的外壳和逻辑中枢

    而邮件推送插件

    就是那套对外联络系统

    只要应用按下“发送按钮”

    信息自动送达收件箱

    如果你看好“哒子”,不妨顺手给我们

    点赞👍 / 转发📬 / 在看👀 / 评论📤

    更多干货落地 🌟星标不迷路

    ↓点击阅读原文进入秒哒
    本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 能力加码!秒哒自定义插件「邮件推送」功能实践方案

    评论 抢沙发

    7 + 2 =
    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址
    ×
    订阅图标按钮