Pinme Email

glitternetwork/pinme/skills/pinme-email

by glitternetwork7822b0501607786958ecb458f3bd02a061933efaNo licenseListed Oct 9, 2026Updated Oct 9, 2026

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

Instructions onlySoftware Development
AI-generated overview

Guides AI to generate PinMe Worker TypeScript code that calls the platform's send_email API.

What it does
This skill provides reference instructions for integrating email sending into a PinMe Worker written in TypeScript. It documents the send_email endpoint, required environment variables, request and response formats, error codes, and example Worker code. It produces guidance and code patterns rather than executable scripts.
When to use it
Use it when a PinMe project (Worker TypeScript) needs to send email, such as verification codes or notifications. It is meant for developers or agents writing Worker code that calls the PinMe platform API.
Requirements
Requires a PinMe Worker environment with the injected API_KEY and optional BASE_URL environment variables, plus network access to the PinMe API. No scripts are shipped; it is instructions only.

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);

Source and attribution

Source:glitternetwork/pinmeinskills/pinme-emailat commit7822b05

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal