Spam Mitigation Technologies

I guess I’ve been out of the email management scene for awhile now; I’m totally behind on DKIM and DMARC. I was introduced to these two technolgies by way of an article posted to ISC Diary by Johannes Ullrich titled "How to send mass e-mail the right way".

Sender Policy Framework

SPF makes use of DNS records which define which servers are authorized to send email for a given domain. This DNS record should enumerate each server which is allowed to send email on behalf of that domain. After the list of servers, the final part of the record should include a ~all or, preferably, a -all. The former is a called a “softfail” i.e. the receiving server should treat emails from non-listed servers with suspicion. The latter is a hard fail which indicates that emails should not be accepted if they do not come from a listed server.

The -all is important. This is what helps to prevent your inbox from being flooded with spam, or even worse, phishing emails that allege to come from your bank, etc. If your email server rejects spoofed emails, you have no opportunity to click on them and their malicious badness.

DomainKeys Identified Mail

DKIM is a method for servers (not users) to digitally sign emails so that they can be validated by recipient servers.

Header Details

  • v = Version of this specification that applies to the signature record
  • a = Algorithm used to generate the signature
  • c = Type of message canonicalization used. Can be simple or relaxed
  • d = Domain sending the email
  • s = Name of the selector
  • h = header field names
  • bh = Body Hash. The hash of the canonicalized body part
  • b = The signature data

Manual DNS Query

dig <selector>._domainkey.<domain>.<tld> txt

Domain-based Message Authentication, Reporting and Conformance

DMARC is the mechanism that, among other things, determines how email should be treated based on the SPF and DKIM evaluations. This again relies on DNS records; the sending domain publishes a record with instructions on how email purported to be sent from that domain should be treated. The receiving email server queries these instructions upon receiving an email and acts accordingly, potentially even sending a report back to the origin domain.

Coincidentally, I recently upgraded my mail server and it now includes DKIM support. After reading the ISC Diary article, I decided to take a closer look at DKIM and get my server configured to use it. In a general sense, it’s similar to SPF in that it’s a mechanism utilized at the server level to determine if a given email came from a legitimate source. Like SPF, DKIM is (partially) implemented by way of DNS records. However, unlike SPF, DKIM inserts a header in the email when it’s being sent to include the domain’s public key. The recipient server will then compare the received public key to the sender’s DNS records and pass or fail the email accordingly, inserting those results into the header as it’s delivered. If you take a look at some emails in your inbox, you may find this information in the full hearders. For instance, an email sent from a Yahoo account has this in the headers:


Which resulted in my server adding the following header after verifying the public key:

Authentication-Results: dkim=pass (1024-bit key); domainkeys=pass (1024-bit key)

Because of email’s distributed nature, adoption by ISPs and vendors is key. According to, DMARC —and therefore likely DKIM as well— is supported for over 3 billion email users with big names like Facebook, Gmail, and Outlook on board.

Unfortunately, while my email server supports DKIM, it does not yet have DMARC support. Until that’s added, I’ve created filters that tag emails that fail DKIM verification, marks them as read, and files them into my "junk" folder.

DNS Record Anatomy

  • v = Protocol version
    • (required)
  • p = Policy for domain
    • (required)
    • Can be none, quarantine, or reject
  • pct = Percent of messages subjected to filtering
  • rua = Reporting URI of aggregate reports
  • aspf = Alignment mode for SPF (optional). Can be “s” for strict, or “r” for relaxed e.g. aspf=s

See for more tags.

v=DMARC1 p=reject pct=100 asfp=s