TLS-RPT report failures

Fix missing TLS-RPT reports, decode failure types from the JSON data, understand which providers actually send reports, and avoid the most common misunderstandings about SMTP TLS reporting.

What TLS-RPT reports are

TLS-RPT (SMTP TLS Reporting, RFC 8460) is a mechanism for receiving servers to get daily JSON reports from sending mail servers. These reports describe what happened when a sender tried to establish a TLS connection to deliver mail to your domain. Did the TLS handshake succeed? Did it fail because the certificate expired? Was the MTA-STS policy unreachable?

You enable TLS-RPT by publishing a DNS TXT record at _smtp._tls.example.com:

_smtp._tls.example.com.  IN TXT  "v=TLSRPTv1; rua=mailto:[email protected]"

Once published, compliant senders will deliver daily JSON reports (typically gzipped as .json.gz) to the address you specified. These reports cover TLS negotiation outcomes for mail delivered to your domain, not from it. That distinction matters, and we will come back to it.

No reports received

Symptom

You published a _smtp._tls record, waited several days, and received nothing. No reports, no errors, no bounces.

Root causes

This is the single most common TLS-RPT complaint, and it usually comes down to one of three things.

1. Low sender adoption

TLS-RPT adoption is far lower than DMARC aggregate reporting. As of 2026, only a handful of major providers send TLS-RPT reports in meaningful volume:

  • Google (Gmail, Workspace)
  • Microsoft (Outlook.com, Microsoft 365)
  • Comcast
  • Mail.ru
  • Mimecast

If your domain primarily receives mail from senders outside this list, you may legitimately get zero reports. That does not mean your setup is broken.

2. Wrong rua address

A typo in the rua value, a wrong subdomain, or a mailbox that does not exist will silently eat your reports. Verify the DNS record matches an active mailbox:

dig TXT _smtp._tls.example.com +short

Confirm that the address in the output actually receives mail. Send yourself a test message to that address and verify delivery.

3. Reports going to spam

TLS-RPT emails carry .json.gz attachments from automated senders. Spam filters flag these aggressively. Check your spam and junk folders. If you use a dedicated reporting mailbox, verify that no upstream filter is quarantining messages with compressed attachments.

Timeline

TLS-RPT reports are daily aggregates. After publishing your DNS record, allow 24 to 48 hours for DNS propagation and the first reporting cycle to complete. If you still have nothing after 72 hours and you confirmed the DNS record and mailbox are correct, the issue is likely sender adoption for your specific mail volume.

Microsoft sends to first rua only

Symptom

You configured multiple rua endpoints in your TLS-RPT record (your inbox plus a monitoring service). Google and Comcast deliver to both. Microsoft delivers only to the first one.

Diagnosis

The TLS-RPT spec (RFC 8460 section 3) allows multiple reporting URIs separated by commas. Most implementations send to all of them. Microsoft's implementation only sends to the first address in the list.

# Your record
"v=TLSRPTv1; rua=mailto:[email protected],mailto:[email protected]"

# Microsoft sends only to: [email protected]
# Google sends to both addresses

Solution

Put your most important endpoint first. If you use a monitoring service and want to ensure Microsoft data is captured, place the monitoring service address before your personal mailbox:

"v=TLSRPTv1; rua=mailto:[email protected],mailto:[email protected]"

Google reports flagged as spam or phishing

Symptom

Emails from [email protected] arrive in spam, or colleagues flag them as phishing because they contain compressed attachments and come from an unfamiliar automated sender.

Solution

These are legitimate TLS-RPT reports from Google. The sender is [email protected] and the attachments are .json.gz files containing report data.

  • Whitelist [email protected] in your spam filter
  • If using Exchange Online, create a transport rule to bypass junk filtering for this sender
  • Inform your team that these emails are expected automated reports, not phishing

TLS-RPT failure types explained

Each TLS-RPT JSON report contains a result-type field that tells you exactly what went wrong during the TLS handshake. Here is a reference for every failure type you will encounter.

certificate-expired

The TLS certificate on your MX server has expired. The sending server attempted a TLS connection, received a certificate with a notAfter date in the past, and either downgraded to plaintext or refused delivery (depending on whether MTA-STS or DANE is enforced).

Fix: Renew the certificate on your MX host immediately. If you use Let's Encrypt, check that your Certbot renewal cron is running. Verify with:

openssl s_client -connect mx.example.com:25 -starttls smtp 2>/dev/null | openssl x509 -noout -dates

certificate-host-mismatch

The certificate presented by your MX server does not include the MX hostname in its Subject Alternative Name (SAN) list. For example, your MX record points to mail.example.com, but the certificate is only valid for example.com and www.example.com.

Fix: Reissue the certificate with the correct MX hostname in the SAN field. Verify the SAN entries:

openssl s_client -connect mx.example.com:25 -starttls smtp 2>/dev/null | openssl x509 -noout -ext subjectAltName

certificate-not-trusted

The certificate is self-signed, or the server is not sending the complete certificate chain (missing intermediate certificates). The sending server cannot build a trust path to a recognized root CA.

Fix: Install the full certificate chain on your MX server. Most CAs provide a "full chain" or "bundle" file that includes the intermediates. Self-signed certificates will always trigger this failure for senders that enforce certificate validation.

starttls-not-supported

Your MX server does not advertise the STARTTLS SMTP extension. The sending server connected on port 25, issued an EHLO, and the response did not include 250-STARTTLS. Without STARTTLS, no TLS negotiation is possible.

Fix: Enable STARTTLS in your MTA configuration (Postfix: smtpd_tls_security_level = may, Exim: tls_advertise_hosts = *). Verify:

openssl s_client -connect mx.example.com:25 -starttls smtp

If you get a connection refused or no TLS handshake, STARTTLS is not enabled.

sts-policy-fetch-error

The sending server could not retrieve your MTA-STS policy file at https://mta-sts.example.com/.well-known/mta-sts.txt. The server responded with a non-200 status, timed out, or the DNS record at _mta-sts.example.com was not found.

Fix: This is the most common MTA-STS failure. See our dedicated guide: MTA-STS policy fetch errors.

sts-policy-invalid

The policy file was fetched successfully, but its content has syntax errors. Common causes: missing version: STSv1 line, invalid mode value, missing mx: entries, or extra whitespace/BOM characters.

Fix: Verify the exact content of your policy file:

curl -v https://mta-sts.example.com/.well-known/mta-sts.txt

The file must follow this exact format (no blank lines before the first field, no trailing characters):

version: STSv1
mode: testing
mx: mx1.example.com
mx: mx2.example.com
max_age: 86400

sts-webpki-invalid

The HTTPS certificate on mta-sts.example.com is invalid. The sending server could not establish a trusted TLS connection to fetch the policy file. This is different from sts-policy-fetch-error. Here the server was reachable, but the certificate itself was the problem.

Fix: Ensure mta-sts.example.com has a valid, publicly trusted TLS certificate. Check it:

curl -I https://mta-sts.example.com/.well-known/mta-sts.txt

If curl reports a certificate error, fix the certificate on the web server hosting the MTA-STS policy.

validation-failure

A general TLS handshake failure that does not fit the more specific categories. This is a catch-all. The TLS negotiation failed, but the sending server did not classify the reason into a more specific type. Possible causes include cipher suite mismatches, protocol version incompatibilities (e.g., server only supports TLS 1.0), or transient network issues.

Fix: Check your MX server's TLS configuration. Ensure it supports TLS 1.2 or later and offers modern cipher suites. Test with:

openssl s_client -connect mx.example.com:25 -starttls smtp -tls1_2

tlsa-invalid

The DANE TLSA record published in DNS does not match the certificate presented by the MX server. This only applies if you have published TLSA records for your MX hosts (DANE, RFC 6698). If you do not use DANE, you will not see this failure type.

Fix: Regenerate and republish your TLSA records to match the current certificate. See the DANE + Let's Encrypt section below for a common cause of this failure.

Direction confusion: TLS-RPT is about inbound mail

TLS-RPT reports tell you what happened when other servers delivered mail to your domain. They describe the TLS connection from the sender's perspective. Did the sender successfully establish an encrypted connection to your MX servers?

TLS-RPT does not tell you about your outbound mail. If you want to know whether your server successfully used TLS when sending to gmail.com, TLS-RPT will not help. For outbound TLS visibility, check your SMTP server logs (Postfix: grep "TLS connection established" /var/log/mail.log).

This confusion is especially common in organizations where the same team manages both inbound and outbound mail infrastructure. TLS-RPT is strictly a receiver-side diagnostic tool.

DANE + Let's Encrypt TLSA renewal breakage

Symptom

Every 60 to 90 days, you see a burst of tlsa-invalid failures in your TLS-RPT reports. They appear after a Let's Encrypt certificate renewal and resolve themselves after DNS propagation completes.

Diagnosis

Let's Encrypt certificates renew every 90 days. By default, Certbot generates a new private key with each renewal. Since DANE TLSA records (usage 3, selector 1) are pinned to the public key hash, a new key means the TLSA hash no longer matches the certificate. During the window between certificate renewal and TLSA record update (plus DNS propagation, which can take hours to a full day), every DANE-validating sender will report tlsa-invalid.

Solution

Two approaches:

  • Reuse the private key. Add --reuse-key to your Certbot renewal command. The public key stays the same across renewals, so the TLSA hash remains valid.
    certbot renew --reuse-key
  • Pin with TLSA type 3 1 1. Use certificate association type 3 (DANE-EE), selector 1 (SubjectPublicKeyInfo), and matching type 1 (SHA-256). Combined with --reuse-key, this gives you a stable TLSA record that survives renewals. If you must rotate keys, pre-publish the new TLSA record with a low TTL and wait for full DNS propagation before the renewal runs.

Prevention

Automate report parsing

Manually downloading .json.gz files, decompressing them, and reading raw JSON is not sustainable. DMARCTrust's Receiver Shield parses TLS-RPT JSON reports automatically. It surfaces failure types, identifies which MX hosts have problems, and tracks trends over time so you can catch certificate expirations or misconfigurations before they affect delivery.

Monitor your MX certificates

Most TLS-RPT failures trace back to certificate problems. Set up automated certificate monitoring for every hostname listed in your MX records. At minimum, alert when a certificate is within 14 days of expiration.

Validate your MTA-STS policy

If you publish an MTA-STS policy, validate that the policy file is reachable and syntactically correct after every change. Use our domain checker to verify your MTA-STS configuration, or read the MTA-STS fundamentals guide for a full walkthrough of policy setup and validation.

Was this page helpful? Send us feedback

Last updated: March 2026