When an email does not send, the cause is almost always one of a short list: the message never left your device or application, the server refused it, the recipient's server rejected it, or it was accepted and then filtered or delayed. The fastest fix is to work out which stage failed. This guide gives a step-by-step way to do that, for personal email in a mail app and for applications that send through SMTP or an API, with the error messages and fixes for each case.
Step 1: Check whether the message left at all
Open the outbox or sent folder. If the message is stuck in the outbox, the problem is between your app and your sending server: no internet, wrong SMTP settings, a blocked port, or a login that failed. If it is in the sent folder, it left your device, and the problem is further along. For applications, check your own logs for the response from the SMTP server or the API, since that response is the most useful clue you have.
Step 2: Read the error or the bounce message
Most failures come with a message. A bounce message from a mail system usually contains a code and a reason. The first digit tells you what kind of failure it is: a code that starts with 4 is a temporary failure and the sender will retry, and a code that starts with 5 is permanent. Our guides to reading a bounce code, SMTP bounce codes and SMTP error codes explain the codes in detail.
| Symptom or message | Likely cause | What to do |
|---|---|---|
| Stuck in outbox, cannot connect | No internet, wrong server or port, or a firewall blocks the port | Check the connection, the server name and the port. Try 587 with STARTTLS. See SMTP timeout and TLS troubleshooting |
| Authentication failed (535) | Wrong user name or password, or an app password is needed | Re-enter the credentials. For Gmail, see Gmail SMTP settings |
| Mailbox full (552 or 4.2.2) | The recipient's mailbox is over its quota | Ask the recipient to free space, or try again later |
| User unknown or no such user (550 5.1.1) | The address does not exist, usually a typo | Check the spelling and resend. Stop sending to the address if it is a list contact |
| Message too large (552 5.3.4) | The attachment or the message exceeds a size limit | Reduce the size or share a link. See email size limits |
| Rejected as spam or blocked (550 5.7.x) | Failed authentication, a blocklisted IP or a poor reputation | Check SPF, DKIM, DMARC and blocklists. See the spam troubleshooting checklist |
| Deferred or temporarily rejected (4xx) | Rate limiting, greylisting or a busy server | Wait. The sending server retries on its own. See queued, deferred and greylisted mail |
Step 3: Check your sending account
Accounts can be limited or suspended. Your provider may have paused sending after a spike in complaints, a security alert, or because you reached a daily limit. Log in to the provider's dashboard and look for notices. A personal mailbox may need you to confirm your identity after a sign-in from a new place. If you suspect that someone else has access to the account, change the password and read account security and compromise response.
Step 4: Check authentication and DNS
If you send from your own domain, mailbox providers expect SPF, DKIM and DMARC to pass. A recent DNS change, a missing record or a record that exceeds the SPF lookup limit can cause sudden rejections. Use our SPF, DKIM and DMARC checker, then see authenticating your sending domain and the SPF lookup limit.
Step 5: Check the recipient side
If the message shows as sent and there is no bounce, it may have been accepted and then filtered. Ask the recipient to check the spam, junk and any quarantine folder, and to search for your address. Look at the message headers, if you have them, to see what authentication results the receiving server recorded.
Email not sending from an application
For a website, plugin or application, the checks are the same, with a few that apply to code. Confirm the SMTP host, port and security mode, and that the credentials are the ones for the sending service, not for a mailbox. Make sure the server allows outbound connections on your port, since some hosts block them. Log the full response from the server, not just a pass or fail. Check that the From address uses a domain you have authenticated. For WordPress sites, see the WordPress SMTP setup guide, and for Node.js see the Nodemailer guide. If you hit rate limits, add retries with back-off, as described in rate limits and back-off.
Your sending service's logs show what happened to each message after your application handed it over. Use them to follow a single message through its life, as in tracing a message through logs and events.
Do not keep retrying a permanent error. A 5xx rejection will not succeed the next time. Fix the cause, or stop sending to that address. Repeated sending to addresses that do not exist harms your reputation.
A quick checklist
- Is the message in the outbox, or did it leave?
- What does the error or bounce say, and does it start with 4 or 5?
- Are the server, port, security mode and credentials correct?
- Is the account active, within its limits and not flagged?
- Do SPF, DKIM and DMARC pass for the From domain?
- Is the recipient address correct, and is their mailbox able to receive?
- Is the message very large, or does it contain content that filters dislike?
Common causes for personal email in Gmail, Outlook and similar apps
For a mailbox you use by hand, a handful of causes explain most failures. The attachment may be over the size limit. The recipient's address may contain a typo, or may have been saved with a trailing space. The account may be asking you to sign in again, or to approve a new device. Your storage may be full, since many services refuse to send or receive when the account is over quota. An add-in, a rule or a security product may be holding messages back. Try sending a short plain-text message to yourself, and then to another address on a different provider. If both work, the problem lies with the original message or its recipient. If neither works, it is your account, your settings or your connection.
Test with a plain message before changing anything
It is tempting to change several settings at once. Resist that. Send one very small text message with no attachment and no images. If it goes through, add back one element at a time, such as the attachment or the link, until it fails. That shows you exactly which element caused the problem. For an application, do the same with the simplest possible message from a command line or a small script, so that you remove your own code from the picture. When the simple message works from the script and not from the application, the fault is in the application's settings or code and not in the sending account.
When to ask for help
If you still cannot find the cause, collect the facts that a support team needs: the exact error text, the time of the failure, the sending address and the recipient address, and the message headers if the message was delivered somewhere. With those facts, a provider can usually find the cause in a few minutes, where a vague report such as "email is not working" can take several rounds of questions.
Want clear delivery logs for every message? See what happened to each email you send, from the first connection to the final delivery status, and fix problems from the evidence instead of guesswork.
References and further reading
Frequently asked questions
Why is my email stuck in the outbox?
It usually means the app cannot reach the sending server. Common causes are no internet, a wrong server name or port, a blocked port, or a failed login. Check the settings and try port 587 with STARTTLS.
What does a 5xx error mean?
A code starting with 5 is a permanent failure, such as an address that does not exist or a policy block. Retrying will not help. Fix the cause or stop sending to that address. A code starting with 4 is temporary and is retried.
Why does my email say sent but never arrive?
The receiving server may have accepted it and then filtered it as spam or placed it in quarantine, or it may be delayed. Ask the recipient to check spam and junk folders, and read the message headers.
Why are my emails going to spam or being rejected?
Typical causes are failed SPF, DKIM or DMARC, a blocklisted IP, content that filters dislike or a poor sender reputation. Check authentication and blocklists first.
How do I find out why an email from my application failed?
Log the full SMTP or API response and use your sending service's message logs to follow the message. The response code and text name the stage and the reason.