SPF Record Explained: Understanding “v=spf1 include:_spf.google.com ~all” for Email Authentication


2 views

The DNS TXT record v=spf1 include:_spf.google.com ~all is a crucial component for email authentication. Let's break it down:

  • v=spf1: Declares this as an SPF version 1 record
  • include:_spf.google.com: Authorizes Google's mail servers to send on your domain's behalf
  • ~all: Soft-fails any other sending sources not explicitly listed

Here's how this SPF record might look in a zone file:

example.com. IN TXT "v=spf1 include:_spf.google.com ~all"

For domains using multiple email services, you might see:

example.com. IN TXT "v=spf1 include:_spf.google.com include:servers.mcsv.net ~all"

Avoid exceeding the 10 DNS lookup limit in SPF by carefully managing your includes:

# Problematic example (too many lookups):
v=spf1 include:_spf.google.com include:spf.protection.outlook.com include:mailgun.org include:spf.mandrillapp.com ~all

# Better approach (consolidate when possible):
v=spf1 include:_spf.google.com include:spf.protection.outlook.com ~all

Use dig to verify your record:

dig TXT example.com +short

Or test with online tools like MXToolbox's SPF checker.

For stricter policies, you might use "-all" instead of "~all":

v=spf1 include:_spf.google.com -all

Remember to update your SPF record whenever changing email providers or adding new sending services.


When examining the SPF record v=spf1 include:_spf.google.com ~all, we're looking at a fundamental email authentication mechanism. Let's dissect each component:

v=spf1               # SPF version 1
include:_spf.google.com  # Authorizes Google's mail servers
~all                 # Soft-fail for all other sources

Here's how you would implement this in various DNS management systems:

BIND Zone File Example:

example.com. IN TXT "v=spf1 include:_spf.google.com ~all"

AWS Route53 CLI Example:

aws route53 change-resource-record-sets --hosted-zone-id Z1PA6795UKMFR9 \
--change-batch '{"Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"example.com","Type":"TXT","TTL":300,"ResourceRecords":[{"Value":"\"v=spf1 include:_spf.google.com ~all\""}]}}]}'

The ~all modifier is particularly important:

  • -all = Hard fail (strict policy)
  • ~all = Soft fail (recommended for initial implementation)
  • ?all = Neutral (testing phase)

Watch out for these frequent issues:

# Bad practice - multiple SPF records
example.com. IN TXT "v=spf1 include:spf.protection.outlook.com"
example.com. IN TXT "v=spf1 include:_spf.google.com"

# Correct approach - single combined record
example.com. IN TXT "v=spf1 include:spf.protection.outlook.com include:_spf.google.com ~all"

Use these tools for verification:

  • MXToolbox SPF Checker
  • Google Admin Toolbox
  • Kitterman SPF Testing Tool

For more complex email infrastructures:

# Multiple authorized senders with IP ranges
v=spf1 ip4:192.0.2.0/24 ip6:2001:db8::/32 include:_spf.google.com include:servers.mcsv.net ~all

# With explicit mail server references
v=spf1 a mx include:_spf.google.com ?all

# For cloud-based email forwarding
v=spf1 include:_spf.google.com include:spf.mandrillapp.com -all

Remember that SPF should be combined with DKIM and DMARC for comprehensive protection. Here's how these records might look together:

# DMARC record
_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com"

# DKIM record (selector may vary)
selector._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."