You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dkim.go 1.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // Copyright (c) 2020 Shivaram Lingamneni
  2. // released under the MIT license
  3. package email
  4. import (
  5. "errors"
  6. dkim "github.com/toorop/go-dkim"
  7. "os"
  8. )
  9. var (
  10. ErrMissingFields = errors.New("DKIM config is missing fields")
  11. )
  12. type DKIMConfig struct {
  13. Domain string
  14. Selector string
  15. KeyFile string `yaml:"key-file"`
  16. keyBytes []byte
  17. }
  18. func (dkim *DKIMConfig) Postprocess() (err error) {
  19. if dkim.Domain != "" {
  20. if dkim.Selector == "" || dkim.KeyFile == "" {
  21. return ErrMissingFields
  22. }
  23. dkim.keyBytes, err = os.ReadFile(dkim.KeyFile)
  24. if err != nil {
  25. return err
  26. }
  27. }
  28. return nil
  29. }
  30. var defaultOptions = dkim.SigOptions{
  31. Version: 1,
  32. Canonicalization: "relaxed/relaxed",
  33. Algo: "rsa-sha256",
  34. Headers: []string{"from", "to", "subject", "message-id", "date"},
  35. BodyLength: 0,
  36. QueryMethods: []string{"dns/txt"},
  37. AddSignatureTimestamp: true,
  38. SignatureExpireIn: 0,
  39. }
  40. func DKIMSign(message []byte, dkimConfig DKIMConfig) (result []byte, err error) {
  41. options := defaultOptions
  42. options.PrivateKey = dkimConfig.keyBytes
  43. options.Domain = dkimConfig.Domain
  44. options.Selector = dkimConfig.Selector
  45. err = dkim.Sign(&message, options)
  46. return message, err
  47. }