Email authentication

Fastmail setup checker

Compare a domain’s MX, SPF and all three DKIM CNAMEs with the exact values Fastmail documents.

Free, no accountLive check

Try

Result

The verdict appears here once you press Check Fastmail records.

What this is

This fastmail setup checker reads what a domain publishes and lines it up against the values on Fastmail’s own manual DNS page - and because every one of those values is computable from the domain itself, each row comes back exactly right or exactly wrong rather than merely present.

Fastmail is the unusual mail host whose whole record set can be worked out from the domain name: two fixed mail servers, one fixed SPF include, and three DKIM CNAME targets with the domain embedded in the middle of each. Nothing is minted per account, so there is no dashboard value to copy and no part of the set that has to be taken on trust.

That is why this check does not stop at “a DKIM record is there”. A CNAME at fm2._domainkey pointing at another domain’s target, at a half-edited hostname, or at something left behind by a previous Fastmail domain resolves perfectly well and still verifies no signature for the domain it sits under. Comparing the target against the computed one is the only thing that catches it.

How to read the result

The table pairs each of the six documented values with what the domain actually answers, and marks every row exactly right, exactly wrong, or nothing published. A row that is wrong carries the value that belongs there, ready to paste over whatever is live.

Underneath, SPF, DKIM and DMARC go through the same full checks their own tools run, so a record that matches Fastmail precisely and still has a fault of its own - a weak key, two SPF records at once, no DMARC policy at all - is reported rather than waved through on the strength of matching.

This checker only covers Fastmail’s own fixed SPF include and three DKIM CNAMEs. For how SPF, DKIM and DMARC fit together, what order to fix them in, and what to do once one fails, see our guide How SPF, DKIM and DMARC work together, and what to do when one fails.

Common mistakes

What goes wrong most often, and how to tell.

  • Carrying a DKIM CNAME over from another domainThe three targets differ only by the domain embedded in them, which is what makes a copied one easy to miss: fm1.olddomain.com.dkim.fmhosted.com sitting at fm1._domainkey.newdomain.com has the shape of a correct Fastmail record and authenticates nothing for the domain it is published under.
  • Reading “the CNAME resolves” as “DKIM works”A CNAME pointing at any hostname that exists will resolve, and a lookup through it may even return a key. The signature a receiver checks is the one made for this domain’s selector, so the target has to be this domain’s computed target rather than any target that happens to answer.
  • Publishing the two MX records at the wrong prioritiesFastmail documents in1-smtp at 10 and in2-smtp at 20. Swapping them, or giving both the same number, leaves delivery working often enough to look fine while sending a share of the mail to the server meant to be second in line.
  • Leaving a previous host’s MX record alongside Fastmail’sAn extra MX record is not ignored - it is another place mail can legitimately be delivered. A forgotten record from the host the domain used before Fastmail quietly keeps receiving some of it, which is why this check expects those two records and nothing else.

Questions

What people ask about this tool.

  • Because every value Fastmail documents can be computed from the domain name, so there is one correct answer for each of them. A record that exists but does not match that answer is not a half-finished setup - it is a record that cannot do its job, and calling it “present” would hide exactly that.
  • Yes. Fastmail signs outgoing mail with whichever of the three selectors it is rotating through, so a message can arrive signed under any one of them. If the matching CNAME is not published, that message’s signature has nothing in DNS to be checked against.
  • No. Everything on this page comes from public DNS, while Fastmail’s own verification state lives in your account. A domain whose six records are all exactly right can still be sitting unverified in Fastmail’s settings, which is the one thing a DNS check can never see.
  • That is the qualifier on Fastmail’s own page, and a neutral one: it takes no position on senders the record does not list. This page reports what you publish against that honestly, so matching Fastmail is marked as matching and the separate question of strictness is raised by the SPF check below.

Sources

Every fixed value here comes from the provider’s own documentation. These pages change, so each says the day it was last read.

Use it from the API

The same check, as one request.

Request
curl -X POST https://resellerhq.com/api/tools/fastmail-setup-checker \
  -H "Content-Type: application/json" \
  -d '{"domain":"exact.example"}'
Response
{
  "tool": "fastmail-setup-checker",
  "input": {
    "domain": "exact.example"
  },
  "result": {
    "verdict": {
      "tone": "warning",
      "headline": "Every value Fastmail documents is exactly right for exact.example",
      "summary": "6 of the 6 values Fastmail documents match what exact.example publishes. SPF, DKIM and DMARC are each checked in full underneath."
    },
    "findings": [
      {
        "id": "spf-neutral-all",
        "severity": "warn",
        "title": "SPF: \"?all\" takes no position on unlisted senders",
        "detail": "A Neutral result is treated the same as no SPF record at all by most receivers, so ending the record with \"?all\" gives up the benefit of having checked every mechanism before it.",
        "fix": "Change \"?all\" to \"~all\" once you are confident the listed mechanisms cover every legitimate sender, or \"-all\" to enforce it outright."
      },
      {
        "id": "fastmail-spf-neutral-all-as-documented",
        "severity": "info",
        "title": "The record ends \"?all\", as Fastmail documents it",
        "detail": "Fastmail's own page publishes \"v=spf1 include:spf.messagingengine.com ?all\", so this domain matches it exactly. A neutral qualifier is weaker than most domains want, which is why the SPF check below still raises it - matching Fastmail and being as strict as you could be are two different things."
      },
      {
        "id": "dkim-key-type-recognised",
        "severity": "info",
        "title": "DKIM: 2048-bit RSA key",
        "detail": "The modulus decoded from \"p=\" is 2048 bits, read directly from the DER-encoded key rather than estimated from its length."
      },
      {
        "id": "fastmail-mx-exactly-right",
        "severity": "pass",
        "title": "Both MX records are exactly right",
        "detail": "exact.example offers mail to in1-smtp.messagingengine.com at priority 10 and in2-smtp.messagingengine.com at priority 20, which is the pair Fastmail documents, with nothing extra alongside them."
      },
      {
        "id": "fastmail-spf-include-found",
        "severity": "pass",
        "title": "SPF names Fastmail as a sender",
        "detail": "The SPF record at exact.example includes spf.messagingengine.com, so Fastmail's outgoing servers are authorised to send as this domain."
      },
      {
        "id": "fastmail-dkim-cnames-exactly-right",
        "severity": "pass",
        "title": "All three DKIM CNAMEs are exactly right",
        "detail": "fm1, fm2, fm3 each point at their computed target under dkim.fmhosted.com with exact.example in the middle, so whichever selector Fastmail signs with, the key resolves."
      },
      {
        "id": "spf-spf-record-found",
        "severity": "pass",
        "title": "SPF: SPF record found",
        "detail": "exact.example publishes \"v=spf1 include:spf.messagingengine.com ?all\", using 1 of the 10 DNS lookups RFC 7208 §4.6.4 allows."
      },
      {
        "id": "dkim-dkim-record-found",
        "severity": "pass",
        "title": "DKIM: DKIM key published at selector \"fm1\"",
        "detail": "fm1._domainkey.exact.example publishes a rsa key."
      },
      {
        "id": "dmarc-dmarc-record-found",
        "severity": "pass",
        "title": "DMARC: DMARC record found",
        "detail": "_dmarc.exact.example publishes \"v=DMARC1; p=reject; rua=mailto:[email protected]\". A receiver that honours this rejects failing mail outright."
      }
    ],
    "parts": [
      {
        "kind": "table",
        "title": "Every value Fastmail documents, against what is published",
        "columns": [
          "Record",
          "Fastmail documents",
          "Published",
          "Result"
        ],
        "rows": [
          [
            "MX, priority 10",
            "in1-smtp.messagingengine.com",
            "in1-smtp.messagingengine.com",
            "exactly right"
          ],
          [
            "MX, priority 20",
            "in2-smtp.messagingengine.com",
            "in2-smtp.messagingengine.com",
            "exactly right"
          ],
          [
            "TXT (SPF)",
            "include:spf.messagingengine.com",
            "v=spf1 include:spf.messagingengine.com ?all",
            "exactly right"
          ],
          [
            "CNAME, fm1._domainkey",
            "fm1.exact.example.dkim.fmhosted.com",
            "fm1.exact.example.dkim.fmhosted.com",
            "exactly right"
          ],
          [
            "CNAME, fm2._domainkey",
            "fm2.exact.example.dkim.fmhosted.com",
            "fm2.exact.example.dkim.fmhosted.com",
            "exactly right"
          ],
          [
            "CNAME, fm3._domainkey",
            "fm3.exact.example.dkim.fmhosted.com",
            "fm3.exact.example.dkim.fmhosted.com",
            "exactly right"
          ]
        ],
        "mono": [
          1,
          2
        ],
        "proseColumns": [
          2
        ],
        "note": "The three DKIM targets are built from the domain itself, which is what lets each row be compared exactly instead of merely checked for existence."
      }
    ],
    "lookups": [
      {
        "label": "MX for exact.example",
        "value": "Cloudflare: 2 records"
      },
      {
        "label": "CNAME for fm1._domainkey.exact.example",
        "value": "Cloudflare: 1 records"
      },
      {
        "label": "CNAME for fm2._domainkey.exact.example",
        "value": "Cloudflare: 1 records"
      },
      {
        "label": "CNAME for fm3._domainkey.exact.example",
        "value": "Cloudflare: 1 records"
      },
      {
        "label": "TXT for exact.example",
        "value": "Cloudflare: 1 record"
      },
      {
        "label": "TXT for spf.messagingengine.com",
        "value": "Cloudflare: 1 record"
      },
      {
        "label": "TXT for fm1._domainkey.exact.example",
        "value": "Cloudflare: 1 record"
      },
      {
        "label": "TXT for _dmarc.exact.example",
        "value": "Cloudflare: 1 record"
      }
    ],
    "limits": [
      "Public DNS is all this reads. Whether the domain has been added to a Fastmail account and verified there is only visible inside that account, so six exactly-right records are not proof that mail is flowing.",
      "Which of the three selectors Fastmail is signing with at this moment cannot be seen from outside either, which is why all three are compared rather than just the one in use.",
      "Each CNAME is compared as the resolver returned it. A DNS host that answers a CNAME query with something else of its own making is reported as what it gave, not as what you typed into its panel."
    ]
  }
}

This example uses a name RFC 2606 reserves for documentation, ending in .example, .test, .invalid or .localhost. None of them is a real domain, and nobody can register one.

Resell mailbox licences for the domains you just checked, under your own brand.

Get started

Company names and logos are trademarks of their owners, shown only to identify each service.