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 從公開儲存庫中收錄這些內容。

檢舉或申請下架