diff --git a/integrations/routing.mdx b/integrations/routing.mdx index a4462e3..97dd44d 100644 --- a/integrations/routing.mdx +++ b/integrations/routing.mdx @@ -756,6 +756,23 @@ The workflow functions below use application-owned callbacks such as `createSupp ``` + + AhaSend checks every message that arrives at `mx.ahasend.com` before it is queued for your route. A message that fails a check is refused during the SMTP transaction with a permanent error, so the sender's server returns it as a bounce and nothing reaches your endpoint. The bounce text quotes our reply: + + | Check | SMTP reply | What it means | + |---|---|---| + | Neither domain is ours | `556` | No AhaSend account owns the recipient's domain or the sender's domain. Usually a typo in the address, or a domain whose MX points to AhaSend without being added to an account. | + | Not exactly one `From` address | `550` | The message has no `From` header, or more than one address in it. | + | Fails the sender's DMARC policy | `550` | The `From` domain publishes `p=reject` or `p=quarantine`, and neither SPF nor DKIM aligns with that domain. | + | No SPF or DKIM pass | `550` | The `From` domain has no DMARC record, or one with `p=none`, and the message has neither a passing SPF result nor a valid DKIM signature for any domain. | + | Bare line endings | `552` | Lines end in LF instead of CRLF, which the SMTP standard requires. Typical of a script that writes the message by hand. | + | Larger than 20 MiB | `552` | The whole message, attachments included after base64 encoding. See [SMTP limits](/smtp). | + + The authentication checks keep forged mail out of your application: a message that passes was sent by a server the `From` domain authorizes. A sender whose domain has no SPF, no DKIM and no DMARC is refused; they need at least SPF or DKIM, which Gmail and Microsoft require of them anyway. + + A rejected message is not stored and does not appear in your message log; the sender's bounce is the only record. + + **Automatic Route Disabling:** - AhaSend disables routes after more than 100 consecutive failed attempts