Pinme Email

glitternetwork/pinme/skills/pinme-email

作者 glitternetwork7822b0501607786958ecb458f3bd02a061933efa无许可证收录于 2026年10月9日更新于 2026年10月9日

Use this skill when a PinMe project (Worker TypeScript) needs to integrate email sending (send_email). Guides AI to generate correct Worker TS code.

AI 生成的概览

指导 AI 生成调用 PinMe 平台 send_email API 的 Worker TypeScript 代码。

功能
该技能提供将邮件发送功能集成到 TypeScript 编写的 PinMe Worker 中的参考说明。它记录了 send_email 端点、所需环境变量、请求与响应格式、错误码以及 Worker 示例代码。它产出的是指导与代码模式,而非可执行脚本。
适用场景
当 PinMe 项目(Worker TypeScript)需要发送邮件(如验证码或通知)时使用。它面向编写调用 PinMe 平台 API 的 Worker 代码的开发者或智能体。
运行要求
需要具备注入 API_KEY 及可选 BASE_URL 环境变量的 PinMe Worker 环境,并需要访问 PinMe API 的网络连接。不附带脚本,仅为说明文档。

PinMe Worker Email API Integration

Guides how to call PinMe platform's email sending API in a PinMe Worker (TypeScript).

Environment Variables

The following environment variables are automatically injected when the Worker is created — no manual configuration needed:

typescript
// backend/src/worker.tsexport 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 is the sole credential for the Worker to call PinMe platform APIs. When BASE_URL is not set, it defaults to https://pinme.cloud.


Send Email API

Endpoint: POST {BASE_URL}/api/v4/send_email Authentication: X-API-Key header (using env.API_KEY) Sender: Automatically set to {project_name}@pinme.cloud

Request Format

json
{  "to": "[email protected]",  "subject": "Your verification code",  "html": "<p>Your code is <strong>123456</strong></p>"}
FieldTypeRequiredDescription
tostringYesRecipient email address
subjectstringYesEmail subject
htmlstringYesHTML body

Response Format

Success (200):

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

Errors:

HTTP StatusMeaningdata.error Example
401API Key missing or invalid"X-API-Key header is required" / "Invalid API key"
400Parameter validation failed"Invalid email address" / "Subject is required"
500Email service error"Failed to send email"

Worker Example Code

typescript
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 routesasync 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 });}

Error Handling Pattern

PinMe platform API unified response format:

typescript
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}

Recommended Unified Error Handler

typescript
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 };}

Usage Example

typescript
const baseUrl = env.BASE_URL ?? 'https://pinme.cloud';
// Send emailconst 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);

来源与署名

来源:glitternetwork/pinme位于skills/pinme-email提交7822b05

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架