[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-3205e365-a9c2-439b-b624-560e96fac3f1":3,"$fyIBRBsRt4q1FVfUHaclCbDJTpReWaG0ESVado3O09bM":43},{"id":4,"title":5,"description":6,"categoryId":7,"moduleId":8,"tags":9,"prompt":10,"icon":11,"source":12,"sourceUrl":13,"authorId":14,"authorName":15,"isPublic":16,"stars":17,"runs":18,"createdAt":19,"updatedAt":19,"module":20,"category":27,"packages":34},"3205e365-a9c2-439b-b624-560e96fac3f1","email-systems","电子邮件是所有营销渠道中回报率最高的。每投入36美元","cat_life_career","mod_other","sickn33,other","---\nname: email-systems\ndescription: Email has the highest ROI of any marketing channel. $36 for every\n  $1 spent. Yet most startups treat it as an afterthought - bulk blasts, no\n  personalization, landing in spam folders.\nrisk: none\nsource: vibeship-spawner-skills (Apache 2.0)\ndate_added: 2026-02-27\n---\n\n# Email Systems\n\nEmail has the highest ROI of any marketing channel. $36 for every $1 spent.\nYet most startups treat it as an afterthought - bulk blasts, no personalization,\nlanding in spam folders.\n\nThis skill covers transactional email that works, marketing automation that\nconverts, deliverability that reaches inboxes, and the infrastructure decisions\nthat scale.\n\n## Principles\n\n- Transactional vs Marketing separation | Description: Transactional emails (password reset, receipts) need 100% delivery.\nMarketing emails (newsletters, promos) have lower priority. Use separate\nIP addresses and providers to protect transactional deliverability. | Examples: Good: Password resets via Postmark, marketing via ConvertKit | Bad: All emails through one SendGrid account\n- Permission is everything | Description: Only email people who asked to hear from you. Double opt-in for marketing.\nEasy unsubscribe. Clean your list ruthlessly. Bad lists destroy deliverability. | Examples: Good: Confirmed subscription + one-click unsubscribe | Bad: Scraped email list, hidden unsubscribe, bought contacts\n- Deliverability is infrastructure | Description: SPF, DKIM, DMARC are not optional. Warm up new IPs. Monitor bounce rates.\nDeliverability is earned through technical setup and good behavior. | Examples: Good: All DNS records configured, dedicated IP warmed for 4 weeks | Bad: Using free tier shared IP, no authentication records\n- One email, one goal | Description: Each email should have exactly one purpose and one CTA. Multiple asks\nmeans nothing gets clicked. Clear single action. | Examples: Good: \"Click here to verify your email\" (one button) | Bad: \"Verify email, check out our blog, follow us on Twitter, refer a friend...\"\n- Timing and frequency matter | Description: Wrong time = low open rates. Too frequent = unsubscribes. Let users\nset preferences. Test send times. Respect inbox fatigue. | Examples: Good: Weekly digest on Tuesday 10am user's timezone, preference center | Bad: Daily emails at random times, no way to reduce frequency\n\n## Patterns\n\n### Transactional Email Queue\n\nQueue all transactional emails with retry logic and monitoring\n\n**When to use**: Sending any critical email (password reset, receipts, confirmations)\n\n\u002F\u002F Don't block request on email send\nawait queue.add('email', {\n  template: 'password-reset',\n  to: user.email,\n  data: { resetToken, expiresAt }\n}, {\n  attempts: 3,\n  backoff: { type: 'exponential', delay: 2000 }\n});\n\n### Email Event Tracking\n\nTrack delivery, opens, clicks, bounces, and complaints\n\n**When to use**: Any email campaign or transactional flow\n\n# Track lifecycle:\n- Queued: Email entered system\n- Sent: Handed to provider\n- Delivered: Reached inbox\n- Opened: Recipient viewed\n- Clicked: Recipient engaged\n- Bounced: Permanent failure\n- Complained: Marked as spam\n\n### Template Versioning\n\nVersion email templates for rollback and A\u002FB testing\n\n**When to use**: Changing production email templates\n\ntemplates\u002F\n  password-reset\u002F\n    v1.tsx (current)\n    v2.tsx (testing 10%)\n    v1-deprecated.tsx (archived)\n\n# Deploy new version gradually\n# Monitor metrics before full rollout\n\n### Bounce Handling State Machine\n\nAutomatically handle bounces to protect sender reputation\n\n**When to use**: Processing bounce and complaint webhooks\n\nswitch (bounceType) {\n  case 'hard':\n    await markEmailInvalid(email);\n    break;\n  case 'soft':\n    await incrementBounceCount(email);\n    if (count >= 3) await markEmailInvalid(email);\n    break;\n  case 'complaint':\n    await unsubscribeImmediately(email);\n    break;\n}\n\n### React Email Components\n\nBuild emails with reusable React components\n\n**When to use**: Creating email templates\n\nimport { Button, Html } from '@react-email\u002Fcomponents';\n\nexport default function WelcomeEmail({ userName }) {\n  return (\n    \u003CHtml>\n      \u003Ch1>Welcome {userName}!\u003C\u002Fh1>\n      \u003CButton href=\"https:\u002F\u002Fapp.com\u002Fstart\">\n        Get Started\n      \u003C\u002FButton>\n    \u003C\u002FHtml>\n  );\n}\n\n### Preference Center\n\nLet users control email frequency and topics\n\n**When to use**: Building marketing or notification systems\n\nPreferences:\n☑ Product updates (weekly)\n☑ New features (monthly)\n☐ Marketing promotions\n☑ Account notifications (always)\n\n# Respect preferences in all sends\n# Required for GDPR compliance\n\n## Sharp Edges\n\n### Missing SPF, DKIM, or DMARC records\n\nSeverity: CRITICAL\n\nSituation: Sending emails without authentication. Emails going to spam folder.\nLow open rates. No idea why. Turns out DNS records were never set up.\n\nSymptoms:\n- Emails going to spam\n- Low deliverability rates\n- mail-tester.com score below 8\n- No DMARC reports received\n\nWhy this breaks:\nEmail authentication (SPF, DKIM, DMARC) tells receiving servers you're\nlegit. Without them, you look like a spammer. Modern email providers\nincreasingly require all three.\n\nRecommended fix:\n\n# Required DNS records:\n\n## SPF (Sender Policy Framework)\nTXT record: v=spf1 include:_spf.google.com include:sendgrid.net ~all\n\n## DKIM (DomainKeys Identified Mail)\nTXT record provided by your email provider\nAdds cryptographic signature to emails\n\n## DMARC (Domain-based Message Authentication)\nTXT record: v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com\n\n# Verify setup:\n- Send test email to mail-tester.com\n- Check MXToolbox for record validation\n- Monitor DMARC reports\n\n### Using shared IP for transactional email\n\nSeverity: HIGH\n\nSituation: Password resets going to spam. Using free tier of email provider.\nSome other customer on your shared IP got flagged for spam.\nYour reputation is ruined by association.\n\nSymptoms:\n- Transactional emails in spam\n- Inconsistent delivery\n- Using same provider for marketing and transactional\n\nWhy this breaks:\nShared IPs share reputation. One bad actor affects everyone. For\ncritical transactional email, you need your own IP or a provider\nwith strict shared IP policies.\n\nRecommended fix:\n\n# Transactional email strategy:\n\n## Option 1: Dedicated IP (high volume)\n- Get dedicated IP from your provider\n- Warm it up slowly (start with 100\u002Fday)\n- Maintain consistent volume\n\n## Option 2: Transactional-only provider\n- Postmark (very strict, great reputation)\n- Includes shared pool with high standards\n\n### Separate concerns:\n- Transactional: Postmark or Resend\n- Marketing: ConvertKit or Customer.io\n- Never mix marketing and transactional\n\n### Not processing bounce notifications\n\nSeverity: HIGH\n\nSituation: Emailing same dead addresses over and over. Bounce rate climbing.\nEmail provider threatening to suspend account. List is 40% dead.\n\nSymptoms:\n- Bounce rate above 2%\n- No webhook handlers for bounces\n- Same emails failing repeatedly\n\nWhy this breaks:\nBounces damage sender reputation. Email providers track bounce rates.\nAbove 2% and you start looking like a spammer. Dead addresses must\nbe removed immediately.\n\nRecommended fix:\n\n# Bounce handling requirements:\n\n### Hard bounces:\nRemove immediately on first occurrence\nInvalid address, domain doesn't exist\n\n### Soft bounces:\nRetry 3 times over 72 hours\nAfter 3 failures, treat as hard bounce\n\n### Implementation:\n```typescript\n\u002F\u002F Webhook handler for bounces\napp.post('\u002Fwebhooks\u002Femail', (req, res) => {\n  const event = req.body;\n  if (event.type === 'bounce') {\n    await markEmailInvalid(event.email);\n    await removeFromAllLists(event.email);\n  }\n});\n```\n\n### Monitor:\nTrack bounce rate by campaign\nAlert if bounce rate exceeds 1%\n\n### Missing or hidden unsubscribe link\n\nSeverity: CRITICAL\n\nSituation: Users marking as spam because they cannot unsubscribe. Spam complaints\nrising. CAN-SPAM violation. Email provider suspends account.\n\nSymptoms:\n- Hidden unsubscribe links\n- Multi-step unsubscribe process\n- No List-Unsubscribe header\n- High spam complaint rate\n\nWhy this breaks:\nUsers who cannot unsubscribe will mark as spam. Spam complaints hurt\nreputation more than unsubscribes. Also it is literally illegal.\nCAN-SPAM, GDPR all require clear unsubscribe.\n\nRecommended fix:\n\n# Unsubscribe requirements:\n\n### Visible:\n- Above the fold in email footer\n- Clear text, not hidden\n- Not styled to be invisible\n\n### One-click:\n- Link directly unsubscribes\n- No login required\n- No \"are you sure\" hoops\n\n### List-Unsubscribe header:\n```\nList-Unsubscribe: \u003Cmailto:unsubscribe@example.com>,\n  \u003Chttps:\u002F\u002Fexample.com\u002Funsubscribe?token=xxx>\nList-Unsubscribe-Post: List-Unsubscribe=One-Click\n```\n\n### Preference center:\nOption to reduce frequency instead of full unsubscribe\n\n### Sending HTML without plain text alternative\n\nSeverity: MEDIUM\n\nSituation: Some users see blank emails. Spam filters flagging emails. Accessibility\nissues for screen readers. Email clients that strip HTML show nothing.\n\nSymptoms:\n- No text\u002Fplain part in emails\n- Blank emails for some users\n- Lower engagement in some segments\n\nWhy this breaks:\nNot everyone can render HTML. Screen readers work better with plain text.\nSpam filters are suspicious of HTML-only. Multipart is the standard.\n\nRecommended fix:\n\n# Always send multipart:\n```typescript\nawait resend.emails.send({\n  from: 'you@example.com',\n  to: 'user@example.com',\n  subject: 'Welcome!',\n  html: '\u003Ch1>Welcome!\u003C\u002Fh1>\u003Cp>Thanks for signing up.\u003C\u002Fp>',\n  text: 'Welcome!\\n\\nThanks for signing up.',\n});\n```\n\n# Auto-generate text from HTML:\nUse html-to-text library as fallback\nBut hand-crafted plain text is better\n\n# Plain text should be readable:\nNot just HTML stripped of tags\nActual formatted text content\n\n### Sending high volume from new IP immediately\n\nSeverity: HIGH\n\nSituation: Just switched providers. Started sending 50,000 emails\u002Fday immediately.\nMassive deliverability issues. New IP has no reputation. Looks like spam.\n\nSymptoms:\n- New IP\u002Fprovider\n- Sending high volume immediately\n- Sudden deliverability drop\n\nWhy this breaks:\nNew IPs have no reputation. Sending high volume immediately looks\nlike a spammer who just spun up. You need to gradually build trust.\n\nRecommended fix:\n\n# IP warm-up schedule:\n\nWeek 1: 50-100 emails\u002Fday\nWeek 2: 200-500 emails\u002Fday\nWeek 3: 500-1000 emails\u002Fday\nWeek 4: 1000-5000 emails\u002Fday\nContinue doubling until at volume\n\n# Best practices:\n- Start with most engaged users\n- Send to Gmail\u002FMicrosoft first (they set reputation)\n- Maintain consistent volume\n- Don't spike and drop\n\n# During warm-up:\n- Monitor deliverability closely\n- Check feedback loops\n- Adjust pace if issues arise\n\n### Emailing people who did not opt in\n\nSeverity: CRITICAL\n\nSituation: Bought an email list. Scraped emails from LinkedIn. Added conference\ncontacts. Spam complaints through the roof. Provider suspends account.\nMaybe a lawsuit.\n\nSymptoms:\n- Purchased email lists\n- Scraped contacts\n- High unsubscribe rate on first send\n- Spam complaints above 0.1%\n\nWhy this breaks:\nPermission-based email is not optional. It is the law (CAN-SPAM, GDPR).\nIt is also effective - unwilling recipients hurt your metrics and\nreputation more than they help.\n\nRecommended fix:\n\n# Permission requirements:\n\n### Explicit opt-in:\n- User actively chooses to receive email\n- Not pre-checked boxes\n- Clear what they are signing up for\n\n### Double opt-in:\n- Confirmation email with link\n- Only add to list after confirmation\n- Best practice for marketing lists\n\n### What you cannot do:\n- Buy email lists\n- Scrape emails from websites\n- Add conference contacts without consent\n- Use partner\u002Fcustomer lists without consent\n\n### Transactional exception:\nPassword resets, receipts, account alerts\ndo not need marketing opt-in\n\n### Emails that are mostly or entirely images\n\nSeverity: MEDIUM\n\nSituation: Beautiful designed email that is one big image. Users with images\nblocked see nothing. Spam filters flag it. Mobile loading is slow.\nNo one can copy text.\n\nSymptoms:\n- Single image emails\n- No text content visible\n- Missing or generic alt text\n- Low engagement when images blocked\n\nWhy this breaks:\nImages are blocked by default in many clients. Spam filters are\nsuspicious of image-only emails. Accessibility suffers. Load times\nincrease.\n\nRecommended fix:\n\n# Balance images and text:\n\n## 60\u002F40 rule:\n- At least 60% text content\n- Images for enhancement, not content\n\n### Always include:\n- Alt text on every image\n- Key message in text, not just image\n- Fallback for images-off view\n\n### Test:\n- Preview with images disabled\n- Should still be usable\n\n# Example:\n```html\n\u003Cimg\n  src=\"hero.jpg\"\n  alt=\"Save 50% this week - use code SAVE50\"\n  style=\"max-width: 100%\"\n\u002F>\n\u003Cp>Use code \u003Cstrong>SAVE50\u003C\u002Fstrong> to save 50% this week.\u003C\u002Fp>\n```\n\n### Missing or default preview text\n\nSeverity: MEDIUM\n\nSituation: Inbox shows \"View this email in browser\" or random HTML as preview.\nLower open rates. First impression wasted on boilerplate.\n\nSymptoms:\n- View in browser as preview\n- HTML code visible in preview\n- No preview component in template\n\nWhy this breaks:\nPreview text is prime real estate - appears right after subject line.\nDefault or missing preview text wastes this space. Good preview text\nincreases open rates 10-30%.\n\nRecommended fix:\n\n# Add explicit preview text:\n\n### In HTML:\n```html\n\u003Cdiv style=\"display:none;max-height:0;overflow:hidden;\">\n  Your preview text here. This appears in inbox preview.\n  \u003C!-- Add whitespace to push footer text out -->\n  &nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;\n\u003C\u002Fdiv>\n```\n\n### With React Email:\n```tsx\n\u003CPreview>\n  Your preview text here. This appears in inbox preview.\n\u003C\u002FPreview>\n```\n\n### Best practices:\n- Complement the subject line\n- 40-100 characters optimal\n- Create curiosity or value\n- Different from first line of email\n\n### Not handling partial send failures\n\nSeverity: HIGH\n\nSituation: Sending to 10,000 users. API fails at 3,000. No tracking of what sent.\nEither double-send or lose 7,000. No way to know who got the email.\n\nSymptoms:\n- No per-recipient send logging\n- Cannot tell who received email\n- Double-sending issues\n- No retry mechanism\n\nWhy this breaks:\nBulk sends fail partially. APIs timeout. Rate limits hit. Without\ntracking individual send status, you cannot recover gracefully.\n\nRecommended fix:\n\n# Track each send individually:\n\n```typescript\nasync function sendCampaign(emails: string[]) {\n  const results = await Promise.allSettled(\n    emails.map(async (email) => {\n      try {\n        const result = await resend.emails.send({ to: email, ... });\n        await db.emailLog.create({\n          email,\n          status: 'sent',\n          messageId: result.id,\n        });\n        return result;\n      } catch (error) {\n        await db.emailLog.create({\n          email,\n          status: 'failed',\n          error: error.message,\n        });\n        throw error;\n      }\n    })\n  );\n\n  const failed = results.filter(r => r.status === 'rejected');\n  \u002F\u002F Retry failed sends or alert\n}\n```\n\n# Best practices:\n- Log every send attempt\n- Include message ID for tracking\n- Build retry queue for failures\n- Monitor success rate per campaign\n\n## Validation Checks\n\n### Missing plain text email part\n\nSeverity: WARNING\n\nEmails should always include a plain text alternative\n\nMessage: Email being sent with HTML but no plain text part. Add 'text:' property for accessibility and deliverability.\n\n### Hardcoded from email address\n\nSeverity: WARNING\n\nFrom addresses should come from environment variables\n\nMessage: From email appears hardcoded. Use environment variable for flexibility.\n\n### Missing bounce webhook handler\n\nSeverity: WARNING\n\nEmail bounces should be handled to maintain list hygiene\n\nMessage: Email provider used but no bounce handling detected. Implement webhook handler for bounces.\n\n### Missing List-Unsubscribe header\n\nSeverity: INFO\n\nMarketing emails should include List-Unsubscribe header\n\nMessage: Marketing email detected without List-Unsubscribe header. Add header for better deliverability.\n\n### Synchronous email send in request handler\n\nSeverity: WARNING\n\nEmail sends should be queued, not blocking\n\nMessage: Email sent synchronously in request handler. Consider queuing for better reliability.\n\n### Email send without retry logic\n\nSeverity: INFO\n\nEmail sends should have retry mechanism for failures\n\nMessage: Email send without apparent retry logic. Add retry for transient failures.\n\n### Email API key in code\n\nSeverity: ERROR\n\nAPI keys should come from environment variables\n\nMessage: Email API key appears hardcoded in source code. Use environment variable.\n\n### Bulk email without rate limiting\n\nSeverity: WARNING\n\nBulk sends should respect provider rate limits\n\nMessage: Bulk email sending without apparent rate limiting. Add throttling to avoid hitting limits.\n\n### Email without preview text\n\nSeverity: INFO\n\nEmails should include preview\u002Fpreheader text\n\nMessage: Email template without preview text. Add hidden preheader for inbox preview.\n\n### Email send without logging\n\nSeverity: WARNING\n\nEmail sends should be logged for debugging and auditing\n\nMessage: Email being sent without apparent logging. Log sends for debugging and compliance.\n\n## Collaboration\n\n### Delegation Triggers\n\n- copy|subject|messaging|content -> copywriting (Email needs copy)\n- design|template|visual|layout -> ui-design (Email needs design)\n- track|analytics|measure|metrics -> analytics-architecture (Email needs tracking)\n- infrastructure|deploy|server|queue -> devops (Email needs infrastructure)\n\n### Email Marketing Stack\n\nSkills: email-systems, copywriting, marketing, analytics-architecture\n\nWorkflow:\n\n```\n1. Infrastructure setup (email-systems)\n2. Template creation (email-systems)\n3. Copy writing (copywriting)\n4. Campaign launch (marketing)\n5. Performance tracking (analytics-architecture)\n```\n\n### Transactional Email\n\nSkills: email-systems, backend, devops\n\nWorkflow:\n\n```\n1. Provider setup (email-systems)\n2. Template coding (email-systems)\n3. Queue integration (backend)\n4. Monitoring (devops)\n```\n\n## When to Use\nUse this skill when the request clearly matches the capabilities and patterns described above.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.\n","","imported","https:\u002F\u002Fgithub.com\u002Fsickn33\u002Fantigravity-awesome-skills","user_system_seed","SkillOPIC",true,56,1637,"2026-05-16 13:16:33",{"id":8,"name":21,"slug":22,"icon":23,"description":24,"sort":25,"createdAt":26},"其他","other","mdi-page-next-outline","其他类型Skill",5,"2026-05-16 12:53:40",{"id":7,"name":28,"slug":29,"icon":30,"description":31,"moduleId":8,"sort":32,"skillCount":33,"createdAt":26},"职场发展","career","mdi-briefcase-outline","面试准备、简历优化、职业规划",4,575,[35],{"id":36,"skillId":4,"version":37,"fileName":38,"fileSize":39,"filePath":40,"fileHash":41,"manifest":42,"createdAt":19},"fae3d7f8-15f9-4211-8e67-dd37cbad973e","1.0.0","email-systems.zip",7230,"uploads\u002Fskills\u002F3205e365-a9c2-439b-b624-560e96fac3f1\u002Femail-systems.zip","521c618b174571adb75054a58e18114e6ba4d713f725a3ecd3aa845d302d7754","[{\"path\":\"SKILL.md\",\"isDirectory\":false,\"size\":18385}]",{"code":44,"message":45,"data":46},200,"success",{"items":47,"stats":48,"page":51},[],{"averageRating":49,"totalRatings":49,"ratingCounts":50},0,[49,49,49,49,49],{"limit":52,"offset":49,"hasMore":53,"nextOffset":52,"ratedOnly":16},15,false]