If you are asking "why are my emails not sending?", the answer depends on where the message stopped. It might never have left your mail app or code. A server might have refused it with an error. Or it might have been delivered somewhere you did not expect. This guide covers the first two cases. The fixes for Gmail and Outlook come first, then the developer side: SMTP authentication, blocked ports, error codes, rate limits, suppressed addresses, unverified sending domains and DNS. If your email does arrive but lands in junk, that is a different problem, covered in why are my emails going to spam.
First, find where the email stopped
| What you see | Where it stopped | Go to |
|---|---|---|
| Message sits in Outbox, "Queued" or "Sending…" | Your mail app never handed it to the server | Gmail or Outlook sections |
| Error pop-up as you hit Send | Your provider refused it (limits, size, storage, sign-in) | Gmail or Outlook sections |
| A bounce message ("Undeliverable", "Delivery Status Notification") | The recipient's server rejected it | SMTP error codes |
| Your app logs an exception or a 4xx/5xx response | Your code or the sending service refused it | Developer side |
| App says "sent", recipient sees nothing | Delivered, filtered or delayed | "Sent but not received" |
Why your emails are not sending from Gmail
When Gmail won't send, the cause is usually one of these:
- Storage is full. Personal accounts get 15 GB shared across Gmail, Drive and Photos. When it is full, Gmail stops: you can't send or receive email, and mail sent to you goes back to the sender (Google). Empty Trash and Spam, and clear large Drive files.
- You hit the sending limit. Sending one email to more than 500 recipients, or more than 500 emails in a day, can trigger "You have reached a limit for sending mail". Sending usually resumes within 1 to 24 hours (Google).
- Too many of your messages bounced. "Messages you sent couldn't be delivered" can appear when many recipients were invalid. Check the addresses and expect to wait about 24 hours (Google).
- The attachment is too big or blocked. Personal Gmail allows 25 MB of attachments. Anything bigger is turned into a Google Drive link, and executables such as
.execan't be attached (Google). - The app is offline or out of date. If messages sit in the Outbox on mobile, check your connection, update the app and retry from the Outbox.
If your software sends through Gmail's SMTP server and stopped working, the cause is usually sign-in. Third-party apps that use a password need an app password, and app passwords only work on accounts with 2-Step Verification. They may not be offered on work or school accounts or with Advanced Protection (Google). For an application, a sending API is usually a better fit than a personal Gmail account.
Why your email won't send in Outlook
Microsoft's checklist for "I can't send or receive messages in Outlook" covers most cases (Microsoft):
- Offline mode (classic Outlook). If the status bar says Disconnected, Working Offline or Trying to connect…, go to Send / Receive → Preferences → Work Offline to toggle it, then send again.
- A large attachment blocks the queue. Open the oldest message in the Outbox. If an attachment is larger than 20 MB, remove it and attach a smaller file or a link. Outlook.com flags attachments over 25 MB and suggests a OneDrive link (Microsoft).
- Mailbox or cloud storage is full. If your Microsoft cloud storage is full, you cannot send or receive email. On Outlook.com, a full inbox blocks new messages too, so empty Junk Email first.
- Changed password. Sign in again with the new password. If Outlook asks you to "create an app password", generate one at your email provider.
- Add-ins, antivirus or a broken profile. Start with
outlook.exe /safe. If sending works in safe mode, an add-in is the cause. Otherwise, repair or recreate the profile, and check whether antivirus email scanning is blocking sends.
For apps and devices that send through Microsoft 365: Microsoft is retiring Basic authentication (username and password) for SMTP AUTH client submission in Exchange Online, so a printer, script or app that logs in with a plain password will start getting rejected. Move it to OAuth or another sending method, and check Microsoft's current timeline (Microsoft Tech Community).
Attachment size limits
The attachment size limit is one of the most common reasons an email won't send.
| Service | Limit |
|---|---|
| Gmail (personal) | 25 MB total; larger files become a Drive link |
| Outlook (desktop) | Microsoft's troubleshooting flags attachments over 20 MB |
| Outlook.com | Microsoft's troubleshooting flags attachments over 25 MB |
The limit applies to the encoded message, not the file on disk. Email carries binary attachments as Base64, which turns every 3 bytes into 4 characters, so a 20 MB file takes up roughly 27 MB in the message (RFC 2045). Share large files as links.
Why are my emails not sending from my app or server?
For developers, "email not sending" usually comes down to one of the eight causes below. Check them roughly in this order.
1. The server rejected your credentials
SMTP servers usually answer a missing or wrong login with 530 5.7.0 Authentication required or a 535 reply. Gmail's server, for example, returns "Authentication required" when the session hasn't authenticated (Google). HTTP APIs return 401 or 403. Check:
- The key or password came from the right environment and has not been revoked or rotated.
- The variable actually loads in production. Print whether it is set, never its value.
- You are using the username the provider expects. On Volanea, the SMTP username is
volaneaand the password is your project's secret API key. The host and port are in the SMTP settings in your Volanea dashboard.
If the protocol itself is new to you, start with what SMTP is.
2. A blocked port
Cloud hosts block outbound port 25 by default. Amazon EC2 blocks port 25 traffic to public IPv4 and IPv6 addresses unless you ask AWS to lift the restriction (AWS). Google Compute Engine blocks connections to external destinations on port 25 but places no restriction on ports 587 or 465 (Google Cloud).
Port 25 is for server-to-server relay. Applications should submit mail on 587 with STARTTLS (RFC 6409) or on 465 with implicit TLS (RFC 8314), or skip SMTP and send over HTTPS. To test whether a port is reachable from the machine that sends, use the host from your provider's settings:
nc -vz smtp.your-provider.example 587
openssl s_client -starttls smtp -connect smtp.your-provider.example:587 -crlf
If nc times out, the network is blocking you, not your code. See troubleshooting SMTP connection issues.
3. An SMTP error code you didn't read
Every SMTP reply starts with a three-digit code. 2xx means accepted, 4xx means a temporary failure (retry later) and 5xx means a permanent failure (don't retry unchanged) (RFC 5321). The enhanced code after it, such as 5.1.1, narrows the cause. Real examples from Gmail (Google):
| Reply | Meaning | Fix |
|---|---|---|
421 4.7.0 Try again later, closing connection | Temporary rejection | Retry with backoff; check reputation if it persists |
450 4.2.1 Recipient receiving mail too fast | Recipient-side rate limit | Slow down and retry later |
452 4.5.3 Too many recipients | Too many addresses in one message | Split into separate sends |
530 5.7.0 Authentication required | Not logged in | Fix credentials (cause 1) |
550 5.1.1 Account does not exist | Bad address | Remove it; it is a hard bounce |
550 5.4.5 Daily user sending limit exceeded | Account quota hit | Wait, or move bulk sending to a sending service |
550 5.7.1 Policy prohibits the email | Blocked by a policy rule | Read the full text; check content and reputation |
550 5.7.25 Sending IP needs a PTR record | Missing reverse DNS | Add PTR (self-hosted servers) |
550 5.7.26 Unauthenticated email… DMARC policy | SPF/DKIM failed under DMARC | Fix authentication (cause 7) |
The text after the code often names the exact problem, so log the full reply. More codes: SMTP codes and how to troubleshoot them. How bounces are classified: bounces.
4. Rate limits and quotas
There are two kinds of limit. The first is per-second or per-minute rate limits: the sending service or a receiving server throttles you, and you see HTTP 429 or SMTP 421/450. Retry with exponential backoff and send in batches. The second is plan or account quotas: daily or monthly caps. Volanea, for example, does not bill overages. When a project reaches its monthly credit limit, sending pauses until the credits reset. If sends stop at the same point every month, check usage before debugging code. Plans are listed on pricing.
When you retry, send an idempotency key so a request that timed out but actually succeeded does not go out twice.
5. The address is suppressed
Sending services keep a suppression list of addresses that hard-bounced, complained or unsubscribed, and they won't send to them again. That protects your reputation, but it looks like "emails won't send to this one person". On Volanea, check an address with GET /v1/suppressions/check. Remove an entry only if you are sure the original problem is fixed. See why emails land on the suppression list.
6. The sending domain isn't verified
Email APIs only send from domains you have proven you own. If the From address uses a domain that is unverified, still pending DNS checks, or a typo of your real domain, the send is refused. Use a From address on a verified domain. If verification is stuck, see what if my domain is not verifying.
7. DNS problems
DNS breaks sending in three ways:
- Sender authentication. With missing or broken SPF or DKIM, receivers that enforce DMARC reject you (
550 5.7.26). Check the domain with the DMARC checker. - Reverse DNS. If you run your own mail server, its IP needs a PTR record (
550 5.7.25). - The recipient's domain. A typo'd domain or one with no MX record can't receive mail at all. Check with
dig +short MX example.com. Validate addresses at signup so typos never reach your send queue.
8. Your code never sent it
Sometimes nothing reached the provider at all: an unawaited promise, an exception caught and ignored, or a serverless function that returned before the request finished. Always await the send, check the status, and log the response:
async function sendReceipt(to, orderId) {
const res = await fetch("https://api.volanea.com/v1/send", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.VOLANEA_API_KEY,
"Content-Type": "application/json",
"Idempotency-Key": `receipt:${orderId}`,
},
body: JSON.stringify({
from: "receipts@example.com",
fromName: "Acme",
to,
subject: `Your receipt for order ${orderId}`,
html: `<p>Thanks for your order ${orderId}.</p>`,
}),
});
const body = await res.text();
if (!res.ok) {
// The error body usually explains the cause.
throw new Error(`Send failed (${res.status}): ${body}`);
}
return body;
}
On Volanea, SMTP and the HTTP API share one send pipeline, so the same causes apply whichever you use.
"Sent" but not received
If your app or provider reports the message as accepted but the recipient sees nothing, the problem is delivery, not sending. Check your provider's delivery events (webhooks or logs) for a delivered, bounced or deferred status. If it says delivered, the message is in the recipient's spam folder, a filter or quarantine. See what if an email says delivered but wasn't received and why emails go to spam.
Quick checklist
- Can you send any email from this account or key? If not, check credentials, storage and account limits.
- Is there an error message or bounce? Read the full code and text.
- Is it one recipient or all of them? One recipient points to a bad address or suppression; all of them points to auth, domain, port or quota.
- Is the port reachable from the sending host (
nc -vz)? - Is the From domain verified, and do SPF, DKIM and DMARC pass?
- Have you hit a daily, monthly or per-minute limit?
- Did your code actually await the send and check the response?
To test sends and templates before you ship them, see the email testing guide.
FAQ
Why are my emails not sending in Outlook?
The most common causes are Work Offline being on, an attachment over 20 MB at the front of the Outbox, full mailbox storage, or a changed password. Fix the oldest stuck message first, then use Send/Receive.
Why is Gmail not sending my emails?
Check whether your 15 GB storage is full, whether you hit the limit of roughly 500 recipients a day, and whether the attachment is over 25 MB. Gmail usually lets you send again 1 to 24 hours after a limit error.
Why can't I send or receive emails at all?
When both directions fail, the cause is usually full storage or a sign-in problem, such as a changed password or a missing app password. Both Gmail and Outlook stop sending and receiving when storage is full.
What is the email attachment size limit?
Gmail allows 25 MB. Microsoft's troubleshooting flags attachments over 20 MB in Outlook and over 25 MB in Outlook.com. Base64 encoding makes files about a third larger in transit, so share big files as links.
Why does my app say the email was sent but nobody got it?
Acceptance is not delivery. Check the provider's delivery events. A bounce shows why it was rejected. "Delivered" means it landed in spam or a filter on the recipient's side.
Why are emails from my server not sending?
Usually because outbound port 25 is blocked by your cloud host, the SMTP login is failing, or the From domain isn't verified with your sending provider. Use port 587 or 465, or an HTTPS API.
Need sending that tells you why a message failed? Create a free Volanea account. It includes 1,000 credits a month, and no card is needed.