SPF, DKIM, and DMARC aren’t just about "authenticating" your emails; they’re the actual gatekeepers that decide if your mail server’s outgoing messages get accepted by the recipient’s server, or tossed into the spam abyss.

Let’s see this in action. Imagine a simple outgoing email from sender@example.com to recipient@gmail.com.

  1. DNS Lookup for SPF: recipient@gmail.com’s mail server, upon receiving the email, queries DNS for example.com’s SPF record. It looks for a TXT record like v=spf1 include:_spf.google.com ~all. This record tells Gmail which IP addresses are authorized to send email for example.com.
  2. DKIM Signature Verification: The email itself contains a DKIM signature. This is a cryptographic hash of the email’s headers and body, signed with a private key. The recipient server looks up the corresponding public key in example.com’s DNS (usually a TXT record like selector._domainkey.example.com). If the signature verifies using the public key, it proves the email hasn’t been tampered with in transit and originated from a server that controls the private key associated with that selector.
  3. DMARC Policy Application: recipient@gmail.com then checks example.com’s DMARC record (a TXT record at _dmarc.example.com, e.g., v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com). This record tells Gmail what to do if the SPF and/or DKIM checks fail (or pass but don’t align). p=quarantine means "if it fails authentication, send it to spam."

Here’s the breakdown of what each piece does and how they work together:

Sender Policy Framework (SPF): SPF is a DNS record that lists the IP addresses or hostnames authorized to send mail on behalf of your domain. It’s essentially a whitelist of your mail servers.

  • What it solves: Prevents spoofing where attackers send emails from your domain using their own servers.
  • How it works: When a receiving mail server gets an email claiming to be from your domain, it checks the IP address of the sending server against your domain’s SPF record in DNS. If the IP isn’t listed, the email might be rejected or marked as spam.
  • Example DNS Record:
    example.com.   3600  IN  TXT  "v=spf1 ip4:192.168.1.10 include:_spf.google.com ~all"
    
    This record states: "Email from example.com is authorized if sent from IP 192.168.1.10 or from any IP authorized by Google’s SPF record (_spf.google.com). All other IPs should be treated with a soft fail (~all)."
  • Common Pitfalls & Fixes:
    • Too many lookups: SPF has a limit of 10 DNS lookups. If your record uses too many include mechanisms, it can fail.
      • Diagnosis: dig example.com TXT and count the lookups in the SPF record. Use tools like MXToolbox’s SPF record checker.
      • Fix: Consolidate include statements if possible. For example, if you use multiple Google services, include:_spf.google.com covers most. If you have many individual IPs, consider setting them up behind a single IP that is listed, or use a dedicated SPF management service.
    • Incorrect IP addresses: Listing the wrong sending IP.
      • Diagnosis: Check the sending IP of your mail server (e.g., in your mail server logs or by sending a test email to yourself and checking the headers).
      • Fix: Update the ip4: or ip6: mechanism in your SPF record with the correct IP address.
    • Missing ~all or -all: If you don’t specify what to do with unauthorized IPs, the record is invalid.
      • Fix: Add ~all (soft fail, recommended to start) or -all (hard fail, more aggressive) at the end of your SPF record.

DomainKeys Identified Mail (DKIM): DKIM adds a digital signature to outgoing emails. This signature is generated using a private key held by the sender and can be verified by anyone using the corresponding public key published in the sender’s DNS.

  • What it solves: Verifies that the email was actually sent by your domain and hasn’t been altered in transit. It’s a cryptographic proof.
  • How it works: Your mail server signs outgoing emails with a private key. A public key is published in your DNS. Recipient servers use this public key to verify the signature.
  • Example DNS Record:
    selector1._domainkey.example.com.  3600  IN  TXT  "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."
    
    This record contains the public key for the DKIM signature associated with selector1 for example.com.
  • Common Pitfalls & Fixes:
    • Missing or invalid public key: The DNS record is not published or contains an incorrect key.
      • Diagnosis: Use dig selector1._domainkey.example.com TXT to retrieve the public key. Then, use an online DKIM checker to verify if the key is valid and matches your signing configuration.
      • Fix: Ensure your mail server or email service provider has generated a DKIM key pair and correctly published the public key in DNS. Regenerate and re-publish if necessary.
    • Incorrect selector: The selector in your DNS record doesn’t match the selector used by your mail server to sign emails.
      • Diagnosis: Check your mail server’s DKIM configuration for the selector it’s using. Compare it with the name of the TXT record in DNS.
      • Fix: Update the DNS TXT record name to use the correct selector, or update your mail server’s configuration to use the existing selector.
    • Signing entire body/headers: Some configurations might exclude critical headers (like From:) from the signature.
      • Diagnosis: Examine the DKIM-Signature header in a sent email. The h= tag lists signed headers. Ensure the From: header is included.
      • Fix: Configure your mail server to sign the From: header and any other essential headers.

Domain-based Message Authentication, Reporting & Conformance (DMARC): DMARC builds upon SPF and DKIM. It tells receiving servers what to do if SPF or DKIM checks fail and provides reporting back to the domain owner.

  • What it solves: Provides a policy for handling emails that fail SPF/DKIM and offers visibility into email authentication results, helping to detect phishing and spoofing.
  • How it works: You publish a DMARC record in DNS. This record specifies a policy (none, quarantine, reject) and where to send aggregate reports (RUA) and forensic reports (RUF). It also requires that the domain in the From: header aligns with the domain that passed SPF or DKIM.
  • Example DNS Record:
    _dmarc.example.com.  3600  IN  TXT  "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com; fo=1;"
    
    This record means: "Use DMARC version 1. If authentication fails, quarantine the email (p=quarantine). Send aggregate reports to dmarc-reports@example.com. Generate forensic reports for any failure (fo=1)."
  • Common Pitfalls & Fixes:
    • Alignment issues: SPF or DKIM may pass, but the domain used in the From: header doesn’t match the domain validated by SPF/DKIM. For example, an email from malicious.com might pass SPF for example.com (if example.com includes malicious.com in its SPF) but the From: header is sender@example.com. DMARC alignment would fail.
      • Diagnosis: Analyze DMARC reports. They will explicitly state alignment failures.
      • Fix: Ensure your SPF and DKIM records are configured to align with your From: domain. For SPF, this often means using redirect= or include= mechanisms that point to your primary domain’s SPF. For DKIM, ensure the selector used is for your primary domain.
    • No reporting configured: If you don’t have rua or ruf set up, you won’t get feedback.
      • Diagnosis: Lack of DMARC reports.
      • Fix: Add a rua=mailto:your-email@example.com tag to your DMARC record to receive aggregate reports.
    • Too strict a policy (p=reject or p=quarantine) too soon: Implementing a strict policy before your SPF/DKIM are perfectly configured can block legitimate mail.
      • Diagnosis: Legitimate emails are being rejected or sent to spam.
      • Fix: Start with p=none (monitor mode) to collect reports. Gradually move to p=quarantine as you confirm all legitimate mail is passing authentication, and finally to p=reject if desired.

The most critical aspect that people often overlook is the alignment requirement of DMARC. SPF alignment means the domain in the Return-Path (or MAIL FROM) header matches the domain in the From: header. DKIM alignment means the d= tag in the DKIM signature matches the domain in the From: header. If your email service provider uses its own domain in the Return-Path (common with many marketing platforms), your SPF will pass for their domain, not yours, causing a DMARC SPF alignment failure unless you’ve set up custom return paths.

Once SPF, DKIM, and DMARC are correctly configured and aligned, the next challenge is managing the ongoing flow of DMARC reports and ensuring your IP reputation remains strong.

Want structured learning?

Take the full Smtp course →