mcpField
P
pinme-email

pinme-email

github.com/glitternetwork开发3.8k501 次安装15 周前更新
代码仓库

关于 pinme-email

这份 TypeScript 指南介绍如何在 PinMe Worker 中调用 PinMe 邮件 API,涵盖自动注入的凭据、请求格式和错误处理。

主要功能

  1. 01通过 PinMe API 发送邮件
  2. 02使用自动注入的 API 凭据
  3. 03配置可选的 API 基础 URL
  4. 04统一处理 API 错误

适用场景

  1. 01从 Worker 发送验证码邮件
  2. 02在 Worker 路由中返回邮件发送错误

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/glitternetwork/pinme --skill pinme-email

安装后在 Claude Code 中输入/pinme-email确认已加载。

详细介绍

PinMe Worker 邮件 API 集成

介绍如何在 PinMe Worker(TypeScript)中调用 PinMe 平台的邮件发送 API。

环境变量

创建 Worker 时会自动注入以下环境变量,无需手动配置:

// backend/src/worker.ts
export interface Env {
  DB: D1Database;
  API_KEY: string;      // Project API Key — used for send_email authentication
  BASE_URL?: string;    // Optional override for PinMe API base URL, defaults to https://pinme.cloud
}

API_KEY 是 Worker 调用 PinMe 平台 API 的唯一凭证。未设置 BASE_URL 时,默认值为 https://pinme.cloud。


发送邮件 API

端点: POST {BASE_URL}/api/v4/send_email 身份验证: X-API-Key 请求头(使用 env.API_KEY) 发件人: 自动设为 {project_name}@pinme.cloud

请求格式
{
  "to": "[email protected]",
  "subject": "Your verification code",
  "html": "<p>Your code is <strong>123456</strong></p>"
}
字段类型必填说明
tostring是收件人邮箱地址
subjectstring是邮件主题
htmlstring是HTML 正文
响应格式

成功(200):

{ "code": 200, "msg": "ok", "data": { "ok": true } }

错误:

HTTP 状态含义data.error 示例
401API Key 缺失或无效"X-API-Key header is required" / "Invalid API key"
400参数验证失败"Invalid email address" / "Subject is required"
500邮件服务错误"Failed to send email"
Worker 示例代码
async function sendEmail(env: Env, to: string, subject: string, html: string): Promise<{ ok: boolean; error?: string }> {
  const baseUrl = env.BASE_URL ?? 'https://pinme.cloud';
  const resp = await fetch(`${baseUrl}/api/v4/send_email`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': env.API_KEY,
    },
    body: JSON.stringify({ to, subject, html }),
  });

  const result = await resp.json() as { code: number; msg: string; data?: { ok?: boolean; error?: string } };

  if (resp.status !== 200 || result.code !== 200) {
    return { ok: false, error: result.data?.error || result.msg || 'Unknown error' };
  }
  return { ok: true };
}

// Usage in routes
async function handleSendVerification(request: Request, env: Env): Promise<Response> {
  const { email } = await request.json() as { email: string };
  const code = Math.random().toString().slice(2, 8);

  const result = await sendEmail(env, email, 'Verification Code',
    `<p>Your code is <strong>${code}</strong></p>`);

  if (!result.ok) {
    return json({ error: result.error }, 500);
  }
  return json({ ok: true });
}

错误处理模式

PinMe 平台 API 的统一响应格式:

interface PinmeResponse<T = unknown> {
  code: number;   // 200=success, other=failure
  msg: string;    // "ok" | "error" | "invalid params"
  data?: T;       // Business data on success, may contain { error: string } on failure
}
建议的统一错误处理器
async function callPinmeAPI<T>(url: string, apiKey: string, body: unknown): Promise<{ data?: T; error?: string }> {
  let resp: Response;
  try {
    resp = await fetch(url, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json', 'X-API-Key': apiKey },
      body: JSON.stringify(body),
    });
  } catch {
    return { error: 'Network error' };
  }

  if (!resp.ok) {
    try {
      const err = await resp.json() as PinmeResponse;
      return { error: err.data && typeof err.data === 'object' && 'error' in err.data
        ? (err.data as { error: string }).error
        : err.msg || `HTTP ${resp.status}` };
    } catch {
      return { error: `HTTP ${resp.status}` };
    }
  }

  const result = await resp.json() as PinmeResponse<T>;
  if (result.code !== 200) {
    return { error: result.data && typeof result.data === 'object' && 'error' in result.data
      ? (result.data as { error: string }).error
      : result.msg };
  }
  return { data: result.data as T };
}
使用示例
const baseUrl = env.BASE_URL ?? 'https://pinme.cloud';

// Send email
const emailResult = await callPinmeAPI<{ ok: boolean }>(
  `${baseUrl}/api/v4/send_email`, env.API_KEY,
  { to: '[email protected]', subject: 'Hello', html: '<p>Hi</p>' },
);
if (emailResult.error) return json({ error: emailResult.error }, 500);

评论

支持 Markdown