Token导航 LogoToken导航TokenDH.com
开发规范需要联网github未标认证来源可访问clear审计通过

aws-ses-best-practicesAWS SES 最佳实践

Agent Skill

用于辅助云资源、部署、容器、基础设施和运维自动化任务。它适合让 Agent 检查配置、整理部署步骤、分析资源状态、生成排障思路或辅助云服务接入。使用时需要明确目标环境、账号权限、区域和资源组,区分本地测试与生产操作;涉及删除资源、重启服务、修改网络或权限配置时,应先确认影响范围。

总安装

376

周安装

16

GitHub Stars

1

下载量

132
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

3

许可证

MIT

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:aws-ses-best-practices(AWS SES 最佳实践)
来源仓库:https://github.com/wraps-team/skills
仓库路径:skills/aws-ses-best-practices
安装命令:
npx skills add https://github.com/wraps-team/skills --skill aws-ses-best-practices
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。不同来源提供的安装方式可能略有差异;本站展示可直接复制的安装命令,安装前请核对来源页面。

skills.shnpx skills
npx skills add https://github.com/wraps-team/skills --skill aws-ses-best-practices

简介

提供 AWS SES 邮件投递、DKIM/SPF 认证和合规配置的最佳实践指南。

  • 适合优化发件人信誉、防止进入垃圾箱或满足 GDPR 等监管要求。
  • 输出 DNS 记录配置示例、身份验证流程和监控指标解读方法。
  • 需拥有域名控制权并在 SES 控制台完成邮箱或域身份绑定。
  • aws-ses-best-practices 属于开发规范类 Skill,可作为该场景下的辅助能力补充。

SKILL.md

AWS SES Best Practices

Email deliverability, warming, compliance, and operational guidelines for AWS Simple Email Service.

Email Authentication

SPF (Sender Policy Framework)

Add to your domain's DNS:

v=spf1 include:amazonses.com ~all

For custom MAIL FROM domain:

# TXT record for mail.yourapp.com
v=spf1 include:amazonses.com ~all

DKIM (DomainKeys Identified Mail)

SES provides three CNAME records for DKIM. Add all three:

# Example (actual values from SES console)
selector1._domainkey.yourapp.com CNAME selector1.dkim.amazonses.com
selector2._domainkey.yourapp.com CNAME selector2.dkim.amazonses.com
selector3._domainkey.yourapp.com CNAME selector3.dkim.amazonses.com

DMARC (Domain-based Message Authentication)

Add TXT record to your domain:

# Start with monitoring mode
_dmarc.yourapp.com TXT "v=DMARC1; p=none; rua=mailto:dmarc@yourapp.com"

# After monitoring, move to quarantine
_dmarc.yourapp.com TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@yourapp.com"

# Production: reject unauthenticated emails
_dmarc.yourapp.com TXT "v=DMARC1; p=reject; rua=mailto:dmarc@yourapp.com"

Custom MAIL FROM Domain

Improves deliverability by using your domain instead of amazonses.com:

# MX record for mail.yourapp.com
mail.yourapp.com MX 10 feedback-smtp.us-east-1.amazonses.com

# SPF record for mail.yourapp.com
mail.yourapp.com TXT "v=spf1 include:amazonses.com ~all"

IP Warming

New SES accounts have limited sending reputation. Warm up gradually.

Warming Schedule

DayDaily VolumeNotes
1-2200Start small, monitor bounces
3-4500Check complaint rate
5-71,000Monitor reputation dashboard
8-145,000Steady increase
15-2110,000
22-3025,000
30+50,000+Scale as needed

Warming Best Practices

  1. Start with engaged users — Send to users who recently opened/clicked
  2. Prioritize transactional — Welcome emails, password resets have high engagement
  3. Avoid cold lists — Don't send to addresses that haven't engaged in 6+ months
  4. Monitor daily — Check bounce/complaint rates in SES dashboard
  5. Slow down if issues — If bounces > 5% or complaints > 0.1%, reduce volume

Bounce Handling

Types of Bounces

Hard Bounces (Permanent):

  • Invalid/non-existent email address
  • Domain doesn't exist
  • Action: Remove immediately, never send again

Soft Bounces (Temporary):

  • Mailbox full
  • Server temporarily unavailable
  • Action: Retry with exponential backoff, remove after 3-5 attempts

Transient Bounces:

  • Auto-responders
  • Challenge-response systems
  • Action: Generally ignore, don't count against reputation

Bounce Rate Thresholds

RateStatusAction
< 2%HealthyContinue normally
2-5%WarningInvestigate, clean list
5-10%CriticalStop sends, clean list aggressively
> 10%DangerSES may suspend account

Handling Bounces with Wraps

// Wraps CLI sets up automatic bounce handling via SNS → Lambda → DynamoDB
// Query bounced addresses:
import { DynamoDBClient, QueryCommand } from '@aws-sdk/client-dynamodb';

const client = new DynamoDBClient({});
const bounces = await client.send(new QueryCommand({
  TableName: 'wraps-email-events',
  KeyConditionExpression: 'pk = :pk',
  ExpressionAttributeValues: {
    ':pk': { S: 'BOUNCE#hard' },
  },
}));

Complaint Handling

Complaint Rate Thresholds

RateStatusAction
< 0.1%HealthyContinue normally
0.1-0.3%WarningReview content, add unsubscribe
0.3-0.5%CriticalPause marketing emails
> 0.5%DangerSES may suspend account

Reducing Complaints

  1. Clear unsubscribe — One-click unsubscribe in every email
  2. Set expectations — Tell users what/when you'll email during signup
  3. Honor preferences — Let users choose email types/frequency
  4. Clean lists — Remove unengaged users proactively
  5. Relevant content — Only send what users signed up for

List-Unsubscribe Header

Add to all marketing emails:

// With raw email or custom headers
const headers = {
  'List-Unsubscribe': '<mailto:unsubscribe@yourapp.com>, <https://yourapp.com/unsubscribe>',
  'List-Unsubscribe-Post': 'List-Unsubscribe=One-Click',
};

List Hygiene

Email Validation

Validate emails at signup:

// Basic format validation
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

// Check for common typos
const typoSuggestions: Record<string, string> = {
  'gmial.com': 'gmail.com',
  'gmal.com': 'gmail.com',
  'hotmal.com': 'hotmail.com',
  'yaho.com': 'yahoo.com',
};

// Use email verification service for important signups
// (e.g., ZeroBounce, NeverBounce, Hunter)

Engagement-Based Cleanup

Remove or suppress addresses based on engagement:

Last EngagementAction
< 30 daysActive, send normally
30-90 daysReduce frequency
90-180 daysRe-engagement campaign
180+ daysSuppress from regular sends
365+ daysRemove from list

Suppression Lists

Maintain lists of addresses to never email:

// Hard bounces - permanent suppression
// Complaints - permanent suppression
// Unsubscribes - honor indefinitely
// Role addresses - suppress (admin@, info@, support@)

Content Best Practices

Subject Lines

  • Keep it short — Under 50 characters
  • Be specific — Tell them what's inside
  • Avoid spam triggers — No ALL CAPS, excessive punctuation, "FREE!!!"
  • Personalize — Include name or relevant detail

Email Body

  1. Text version — Always include plain text alternative
  2. Image-to-text ratio — Keep images < 40% of content
  3. Hosted images — Use absolute URLs, not embedded images
  4. Alt text — Every image needs alt text
  5. Mobile-friendly — Single column, 600px max width
  6. Clear CTA — One primary call-to-action

Avoid Spam Triggers

Words to avoid:

  • FREE, WINNER, CONGRATULATIONS
  • Act now, Limited time, Urgent
  • $$, Make money, Cash bonus
  • Click here, Buy now

Formatting to avoid:

  • ALL CAPS
  • Excessive punctuation!!!
  • Red text
  • Large fonts
  • Invisible text (white on white)

Sending Patterns

Consistent Schedule

  • Send at consistent times (users learn to expect your emails)
  • Avoid sudden volume spikes (looks like spam)
  • Spread large sends over time (don't blast all at once)

Time Zone Awareness

// Send at optimal local time
const sendAtLocalTime = (email: string, preferredHour: number) => {
  const userTimezone = getUserTimezone(email); // from user preferences
  const now = new Date();
  const targetTime = new Date(now.toLocaleString('en-US', { timeZone: userTimezone }));
  targetTime.setHours(preferredHour, 0, 0, 0);

  if (targetTime < now) {
    targetTime.setDate(targetTime.getDate() + 1);
  }

  return targetTime;
};

Throttling for Large Lists

// Don't send 100k emails at once
const BATCH_SIZE = 1000;
const DELAY_BETWEEN_BATCHES_MS = 60000; // 1 minute

async function sendBulk(recipients: string[], template: string) {
  for (let i = 0; i < recipients.length; i += BATCH_SIZE) {
    const batch = recipients.slice(i, i + BATCH_SIZE);
    await email.sendBulkTemplate({
      from: 'hello@yourapp.com',
      template,
      destinations: batch.map(to => ({ to, templateData: {} })),
    });

    if (i + BATCH_SIZE < recipients.length) {
      await sleep(DELAY_BETWEEN_BATCHES_MS);
    }
  }
}

Monitoring & Alerts

Key Metrics to Track

MetricTargetAlert Threshold
Bounce Rate< 2%> 5%
Complaint Rate< 0.1%> 0.3%
Delivery Rate> 95%< 90%
Open Rate> 20%< 10%
Click Rate> 2%< 1%

CloudWatch Alarms

Wraps CLI sets up basic alarms. Add custom ones:

// High bounce rate alarm
const alarm = new cloudwatch.Alarm(this, 'HighBounceRate', {
  metric: new cloudwatch.Metric({
    namespace: 'AWS/SES',
    metricName: 'Bounce',
    statistic: 'Sum',
    period: Duration.hours(1),
  }),
  threshold: 50,
  evaluationPeriods: 1,
  comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
});

SES Reputation Dashboard

Check regularly in AWS Console → SES → Reputation Metrics:

  • Account status (Healthy, Under review, Paused)
  • Bounce rate trend
  • Complaint rate trend

Compliance

CAN-SPAM (US)

  1. Accurate headers — From/reply-to must be accurate
  2. No deceptive subjects — Subject must reflect content
  3. Physical address — Include valid postal address
  4. Unsubscribe — Clear, working unsubscribe mechanism
  5. Honor opt-outs — Process within 10 business days

GDPR (EU)

  1. Consent — Clear, explicit opt-in for marketing
  2. Right to access — Provide data on request
  3. Right to erasure — Delete data on request
  4. Data portability — Export data in common format
  5. Lawful basis — Document why you're processing data

CASL (Canada)

  1. Express consent — Written/verbal permission required
  2. Implied consent — Limited (existing relationship, published email)
  3. Unsubscribe — Honor within 10 days
  4. Identification — Sender identity and contact info

Footer Template

<footer style="font-size: 12px; color: #666;">
  <p>
    You're receiving this email because you signed up at yourapp.com.
  </p>
  <p>
    <a href="{{unsubscribe_url}}">Unsubscribe</a> |
    <a href="{{preferences_url}}">Email Preferences</a>
  </p>
  <p>
    Your Company, Inc.<br>
    123 Main Street<br>
    City, State 12345
  </p>
</footer>

SES Limits & Quotas

Default Limits (Sandbox)

  • 200 emails/24 hours
  • 1 email/second
  • Can only send to verified addresses

Production Limits

  • Varies based on account history
  • Start at 50,000/day, 14/second
  • Request increases as needed

Requesting Limit Increase

  1. AWS Console → SES → Account Dashboard
  2. Click "Request Production Access" or "Request Limit Increase"
  3. Provide:

- Use case description - Expected volume - Bounce/complaint handling process - List collection method

Troubleshooting

"Email not delivered"

  1. Check SES console for bounces/complaints
  2. Verify recipient didn't unsubscribe
  3. Check spam folder
  4. Test with mail-tester.com

"High bounce rate"

  1. Validate email addresses at signup
  2. Remove old addresses (180+ days inactive)
  3. Use double opt-in
  4. Check for typos in bulk imports

"High complaint rate"

  1. Add clear unsubscribe link
  2. Review email content
  3. Reduce frequency
  4. Segment engaged vs unengaged users

"Emails going to spam"

  1. Verify SPF, DKIM, DMARC are set up
  2. Check content for spam triggers
  3. Warm up sending volume gradually
  4. Build engagement (opens/clicks improve reputation)

AWS CLI Diagnostics

Account Status

# Get sending quota and daily usage
aws ses get-send-quota

# Check if in sandbox (SESv2)
aws sesv2 get-account

# Account-level suppression settings
aws sesv2 get-account --query 'SuppressionAttributes'

Identity Verification

# List verified domains
aws ses list-identities --identity-type Domain

# List verified email addresses
aws ses list-identities --identity-type EmailAddress

# Check verification status for a domain
aws ses get-identity-verification-attributes \
  --identities yourapp.com

# Full identity details (SESv2)
aws sesv2 get-email-identity --email-identity yourapp.com

DKIM Status

# Check DKIM configuration
aws ses get-identity-dkim-attributes --identities yourapp.com

# SESv2 DKIM details
aws sesv2 get-email-identity --email-identity yourapp.com \
  --query 'DkimAttributes'

MAIL FROM Configuration

# Check custom MAIL FROM domain
aws ses get-identity-mail-from-domain-attributes \
  --identities yourapp.com

Configuration Sets

# List all configuration sets
aws sesv2 list-configuration-sets

# Get details for a configuration set
aws sesv2 get-configuration-set \
  --configuration-set-name my-config-set

# List event destinations
aws sesv2 get-configuration-set-event-destinations \
  --configuration-set-name my-config-set

Sending Statistics

# Basic send stats (last 2 weeks, 15-min intervals)
aws ses get-send-statistics

# CloudWatch metrics for sends
aws cloudwatch get-metric-statistics \
  --namespace AWS/SES \
  --metric-name Send \
  --start-time $(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
  --period 3600 \
  --statistics Sum

Reputation Metrics

# Bounce rate (last 7 days)
aws cloudwatch get-metric-statistics \
  --namespace AWS/SES \
  --metric-name Reputation.BounceRate \
  --start-time $(date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZ) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
  --period 86400 \
  --statistics Average

# Complaint rate (last 7 days)
aws cloudwatch get-metric-statistics \
  --namespace AWS/SES \
  --metric-name Reputation.ComplaintRate \
  --start-time $(date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZ) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
  --period 86400 \
  --statistics Average

Suppression List

# List suppressed addresses
aws sesv2 list-suppressed-destinations

# Filter by reason
aws sesv2 list-suppressed-destinations --reasons BOUNCE
aws sesv2 list-suppressed-destinations --reasons COMPLAINT

# Check specific address
aws sesv2 get-suppressed-destination \
  --email-address user@example.com

# Remove from suppression list
aws sesv2 delete-suppressed-destination \
  --email-address user@example.com

# Add to suppression list
aws sesv2 put-suppressed-destination \
  --email-address user@example.com \
  --reason COMPLAINT

Test Sending

# Send test email
aws ses send-email \
  --from verified@yourapp.com \
  --to recipient@example.com \
  --subject "Test Email" \
  --text "This is a test email sent via AWS CLI."

# Verify email address (sandbox mode)
aws ses verify-email-identity --email-address test@example.com

DNS Verification (External)

# Check DKIM records
dig +short TXT selector1._domainkey.yourapp.com

# Check SPF record
dig +short TXT yourapp.com | grep spf

# Check DMARC record
dig +short TXT _dmarc.yourapp.com

# Check MX record (for custom MAIL FROM)
dig +short MX mail.yourapp.com

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

04

需要参考平台分布和安装热度时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

OpenCode

31.79%
按下载量换算42

Cursor

21.39%
按下载量换算28

Claude Code

16.25%
按下载量换算21

Gemini CLI

14.25%
按下载量换算19

Codex

8.37%
按下载量换算11

goose

3.3%
按下载量换算4

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。

来源信息

继续浏览同类 Skills