# How to Send an Email Using Amazon SES: A Step-by-Step Guide

Key Takeaways

  • Amazon SES (Simple Email Service) is AWS's managed service for sending transactional, marketing, and bulk email at scale.
  • Sending starts in a "sandbox" mode limited to verified addresses — moving to production requires a support request.
  • You can send via SMTP, the AWS CLI, or an SDK (boto3, Node.js, Java).
  • Domain verification with DKIM signing dramatically improves deliverability and avoids spam folders.
  • SES pricing is usage-based: roughly $0.10 per 1,000 emails sent from an EC2 or Lambda-hosted application.

What Is Amazon SES?

Amazon Simple Email Service (amazonses, often searched as "amazon email services") is a cloud-based email-sending platform built for developers who need reliable, scalable outbound email — password resets, order confirmations, newsletters, or notification systems — without running their own mail servers.

SES handles the hard parts of email infrastructure: IP reputation management, bounce and complaint handling, DKIM/SPF signing, and feedback loops with major mailbox providers.

Step 1: Verify Your Identity

Before you can send amazon ses email, you must verify either an email address or, for production use, an entire domain.

aws ses verify-domain-identity --domain f9infotech.com --region us-east-1

This returns a verification token you add as a TXT record in Route 53 (or your DNS provider):

aws route53 change-resource-record-sets \
  --hosted-zone-id Z1234567890ABC \
  --change-batch '{
    "Changes": [{
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "_amazonses.f9infotech.com",
        "Type": "TXT",
        "TTL": 1800,
        "ResourceRecords": [{ "Value": "\"verification-token-here\"" }]
      }
    }]
  }'

Step 2: Enable DKIM Signing

DKIM (DomainKeys Identified Mail) proves your emails weren't tampered with in transit — a major deliverability signal.

aws ses verify-domain-dkim --domain f9infotech.com

AWS returns three CNAME tokens; add each as a DNS record, then SES automatically begins signing outgoing mail once DNS propagates.

Step 3: Move Out of the Sandbox

New SES accounts start in sandbox mode: you can only send to verified addresses, capped at 200 emails/day. To send to arbitrary recipients, request production access via the SES console (Account Dashboard → Request production access) describing your use case, bounce-handling plan, and expected volume.

Step 4: Send Email via CLI

aws ses send-email \
  --from "noreply@f9infotech.com" \
  --destination '{"ToAddresses":["customer@example.com"]}' \
  --message '{
    "Subject": {"Data": "Your order has shipped"},
    "Body": {
      "Text": {"Data": "Your order #4821 has shipped and will arrive in 3-5 days."}
    }
  }'

Step 5: Send Email via Python (boto3)

import boto3
from botocore.exceptions import ClientError

ses = boto3.client("ses", region_name="us-east-1")

try:
    response = ses.send_email(
        Source="noreply@f9infotech.com",
        Destination={"ToAddresses": ["customer@example.com"]},
        Message={
            "Subject": {"Data": "Welcome to f9infotech"},
            "Body": {
                "Html": {
                    "Data": "<h1>Welcome!</h1><p>Thanks for signing up.</p>"
                }
            },
        },
    )
    print("Message sent:", response["MessageId"])
except ClientError as e:
    print("Send failed:", e.response["Error"]["Message"])

Sending Flow Overview

<svg viewBox="0 0 740 240" xmlns="http://www.w3.org/2000/svg" font-family="Arial, sans-serif" font-size="13" fill="currentColor">
  <defs>
    <marker id="arrow2" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
      <polygon points="0 0, 10 3.5, 0 7" fill="currentColor"/>
    </marker>
  </defs>
  <style>
    .box { fill: none; stroke: currentColor; stroke-width: 1.6; }
    .arrow { stroke: currentColor; stroke-width: 1.6; fill: none; marker-end: url(#arrow2); }
  </style>

  <rect class="box" x="20" y="90" width="130" height="60" rx="8"/>
  <text x="85" y="125" text-anchor="middle">Your App</text>

  <line class="arrow" x1="150" y1="120" x2="230" y2="120"/>
  <text x="190" y="105" text-anchor="middle" font-size="11">SendEmail API</text>

  <rect class="box" x="230" y="70" width="150" height="100" rx="8"/>
  <text x="305" y="110" text-anchor="middle">Amazon SES</text>
  <text x="305" y="130" text-anchor="middle" font-size="11">(DKIM sign +</text>
  <text x="305" y="146" text-anchor="middle" font-size="11">reputation mgmt)</text>

  <line class="arrow" x1="380" y1="120" x2="460" y2="120"/>

  <rect class="box" x="460" y="90" width="130" height="60" rx="8"/>
  <text x="525" y="125" text-anchor="middle">Recipient Inbox</text>

  <line class="arrow" x1="305" y1="170" x2="305" y2="210"/>
  <text x="305" y="228" text-anchor="middle" font-size="11">bounce/complaint → SNS topic</text>
</svg>

Handling Bounces and Complaints

Configure SNS notifications so your app reacts to failed deliveries:

aws ses set-identity-notification-topic \
  --identity f9infotech.com \
  --notification-type Bounce \
  --sns-topic arn:aws:sns:us-east-1:123456789012:ses-bounces

Suppress or flag addresses that bounce hard — repeated hard bounces damage your sender reputation and can trigger SES account review.

Pricing

  • $0.10 per 1,000 emails sent (from an app inside AWS)
  • $0.12 per 1,000 if sent outside AWS infrastructure
  • First 62,000 emails/month free when sending from an EC2 instance

FAQ

What's the difference between amazonses and a regular SMTP relay? SES is a managed, highly deliverable email API/SMTP endpoint with built-in reputation management, bounce handling, and DKIM — a self-managed SMTP relay gives you none of that out of the box.

How do I avoid landing in spam when sending amazon web services email? Verify your domain, enable DKIM, set up SPF and a DMARC record, warm up gradually, and monitor your bounce/complaint rate — SES can suspend accounts that exceed a 5% bounce or 0.1% complaint rate.

Can SES send bulk marketing campaigns? Yes, SES supports bulk sending, but for list management, templates, and unsubscribe handling you'll typically pair it with a tool built on SES (e.g., using SES as the sending backend).

Is there a sending rate limit? Yes — each account has a maximum send rate (emails/second) and a 24-hour sending quota, both of which increase automatically as your sending reputation improves.

Need Reliable Email Infrastructure on AWS?

f9infotech helps teams configure Amazon SES correctly the first time — domain verification, DKIM/DMARC, bounce handling, and production access requests included. Talk to our AWS team about setting up scalable email delivery for your application.