# README
go-msgauth
A Go library to authenticate e-mails:
- Create and verify DKIM signatures
- Create and parse Authentication-Results header fields
- Fetch DMARC records
DKIM 
Sign
r := strings.NewReader(mailString)
options := &dkim.SignOptions{
Domain: "example.org",
Selector: "brisbane",
Signer: privateKey,
}
var b bytes.Buffer
if err := dkim.Sign(&b, r, options); err != nil {
log.Fatal(err)
}
Verify
r := strings.NewReader(mailString)
verifications, err := dkim.Verify(r)
if err != nil {
log.Fatal(err)
}
for _, v := range verifications {
if v.Err == nil {
log.Println("Valid signature for:", v.Domain)
} else {
log.Println("Invalid signature for:", v.Domain, v.Err)
}
}
FAQ
Why can't I verify a mail.Message
directly? A mail.Message
header is
already parsed, and whitespace characters (especially continuation lines) are
removed. Thus, the signature computed from the parsed header is not the same as
the one computed from the raw header.
How can I publish my public key? You have to add a TXT record to your DNS zone. See RFC 6376 appendix C.
Authentication-Results 
// Format
results := []authres.Result{
&authres.SPFResult{Value: authres.ResultPass, From: "example.net"},
&authres.AuthResult{Value: authres.ResultPass, Auth: "[email protected]"},
}
s := authres.Format("example.com", results)
log.Println(s)
// Parse
identifier, results, err := authres.Parse(s)
if err != nil {
log.Fatal(err)
}
log.Println(identifier, results)
DMARC 
See the GoDoc page.
License
MIT
# Packages
Package authres parses and formats Authentication-Results
Authentication-Results header fields are standardized in RFC 7601.
No description provided by the author
Package dkim creates and verifies DKIM signatures, as specified in RFC 6376.
Package dmarc implements DMARC as specified in RFC 7489.