Runoneall

Runoneall's Blog

首页
关于
链接
RSS
Email


使用云湖开放API部署云湖邮局

  • 作者: Tom Brown
  • 时间: 2024-12-09
  • 分类: 默认  

先上效果图


不局限在云湖,任何有收发消息API的即时通讯软件都可以部署

收消息

  • 使用Cloudflare Worker部署
  • 到电子邮件那里新建worker,再新建地址,选择转发到worker,选中刚刚创建的worker
  • 因Cloudflare限制,必须使用wrangler开发(网页编辑器无法导入包)
  • 使用wrangler创建项目,名字与刚创建的电子邮件worker相同
  • 进入项目并安装postal-mime包
  • 到云湖控制台中新建机器人

在 wrangler.toml 里写入如下变量

[vars]
YH_BOT_TOKEN = "换成你的云湖机器人Token"
YH_USER_ID = "换成你的ID"

然后编写代码:

import PostalMime from "postal-mime";

async function toYunhu(msg, env) {
  const token = env.YH_BOT_TOKEN;
  const apiUrl =
    "https://chat-go.jwzhd.com/open-apis/v1/bot/send?token=" + token;
  const response = await fetch(apiUrl, {
    method: "POST",
    headers: { "Content-Type": "application/json; charset=utf-8" },
    body: JSON.stringify({
      recvId: env.YH_USER_ID,
      recvType: "user",
      contentType: "html",
      content: { text: msg },
    }),
  });
  return response.json();
}

export default {
  async email(message, env, ctx) {
    let email_string = ``;
    const email_from = message.from;
    const email_to = message.to;
    email_string += `<div style="background-color: white; color: black;">
  <ul>
    <li>From: ${email_from}</li>
    <li>To: ${email_to}</li>
  </ul>
  <hr>`;
    const email_content = await PostalMime.parse(message.raw);
    const email_subject = email_content.subject;
    let email_text = email_content.html;
    if (email_text == null) {
      email_text = email_content.text;
    }
    email_string += `  <details>
    <summary>
      <strong style="font-size: 20px;">${email_subject}</strong>
    </summary>
    ${email_text}
  </details>
</div>`;
    await toYunhu(email_string, env);
  },
};

最后使用wrangler部署

发消息(这一章节较为复杂!)

  • 新建一个普通worker用于发送邮件
  • 无需wrangler
  • 准备 Github REST API Token(用于调用markdown转html接口)
  • 准备 Resend Email Token(用于发送邮件)
  • 将域名解析到Resend(可选)(如果想用域名邮箱则必须)

打开云湖控制台并新建自定义输入指令

把每个表单ID对应的输入框名记下来!

打开cloudflare网页编辑器并编写代码

async function sendEmail(email_to, email_title, email_content, env) {
  const token = env.RESEND_EMAIL_TOKEN;
  const response = await fetch("https://api.resend.com/emails", {
    method: "POST",
    headers: {
      "content-type": "application/json",
      Authorization: `Bearer ${token}`,
    },
    body: JSON.stringify({
      from: "这里填入你的resend邮箱名,如果将域名解析到resend则可以填域名邮箱",
      to: email_to,
      subject: email_title,
      html: email_content,
    }),
  });
  return response.body;
}

async function toYunhu(msg, env) {
  const token = env.YH_BOT_TOKEN;
  const apiUrl =
    "https://chat-go.jwzhd.com/open-apis/v1/bot/send?token=" + token;
  const response = await fetch(apiUrl, {
    method: "POST",
    headers: { "Content-Type": "application/json; charset=utf-8" },
    body: JSON.stringify({
      recvId: env.YH_USER_ID,
      recvType: "user",
      contentType: "html",
      content: { text: msg },
    }),
  });
  return response.json();
}

async function toHTML(markdown, env) {
  const token = env.GH_REST_TOKEN;
  const response = await fetch("https://api.github.com/markdown", {
    method: "POST",
    headers: {
      Accept: "application/vnd.github+json",
      "User-Agent": "Markdown-To-Html-App",
      Authorization: `Bearer ${token}`,
      "X-GitHub-Api-Version": "2022-11-28",
    },
    body: JSON.stringify({ text: markdown }),
  });
  return response.text();
}

async function getEmailInfo(yhJson) {
  let email_info = {};
  let formJson = yhJson["event"]["message"]["content"]["formJson"];
  if (formJson == null) {
    formJson = yhJson["event"]["message"]["content"]["formjson"];
  }
  email_info["address"] = formJson["这里是 目标 输入框的表单ID"]["value"];
  email_info["title"] = formJson["这里是 标题 输入框的表单ID"]["value"];
  email_info["content"] = formJson["这里是 正文 输入框的表单ID"]["value"];
  return email_info;
}

export default {
  async fetch(request, env, ctx) {
    if (request.method == "POST") {
      const email_info = await getEmailInfo(await request.json());
      const address = email_info["address"];
      const title = email_info["title"];
      const content = await toHTML(email_info["content"], env);
      const email_response = await sendEmail(address, title, content, env);
      await toYunhu("已发送", env);
      return new Response(email_response);
    }
  },
};

在 worker设置 -> 变量和机密 那里新建变量

  • GH_REST_TOKEN:你的Github REST API Token
  • RESEND_EMAIL_TOKEN:你的Resend Email Token
  • YH_BOT_TOKEN:你的云湖机器人Token
  • YH_USER_ID:你的云湖ID

部署完成

© 2025 Runoneall. Old Fasion Theme. Powered by Hexo.