p_header.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package backends
  2. import (
  3. "github.com/flashmob/go-guerrilla/mail"
  4. "strings"
  5. "time"
  6. )
  7. type HeaderConfig struct {
  8. PrimaryHost string `json:"primary_mail_host"`
  9. }
  10. // ----------------------------------------------------------------------------------
  11. // Processor Name: header
  12. // ----------------------------------------------------------------------------------
  13. // Description : Adds delivery information headers to e.DeliveryHeader
  14. // ----------------------------------------------------------------------------------
  15. // Config Options: none
  16. // --------------:-------------------------------------------------------------------
  17. // Input : e.Helo
  18. // : e.RemoteAddress
  19. // : e.RcptTo
  20. // : e.Hashes
  21. // ----------------------------------------------------------------------------------
  22. // Output : Sets e.DeliveryHeader with additional delivery info
  23. // ----------------------------------------------------------------------------------
  24. func init() {
  25. processors["header"] = func() Decorator {
  26. return Header()
  27. }
  28. }
  29. // Generate the MTA delivery header
  30. // Sets e.DeliveryHeader part of the envelope with the generated header
  31. func Header() Decorator {
  32. var config *HeaderConfig
  33. Svc.AddInitializer(InitializeWith(func(backendConfig BackendConfig) error {
  34. configType := BaseConfig(&HeaderConfig{})
  35. bcfg, err := Svc.ExtractConfig(backendConfig, configType)
  36. if err != nil {
  37. return err
  38. }
  39. config = bcfg.(*HeaderConfig)
  40. return nil
  41. }))
  42. return func(p Processor) Processor {
  43. return ProcessWith(func(e *mail.Envelope, task SelectTask) (Result, error) {
  44. if task == TaskSaveMail {
  45. to := strings.TrimSpace(e.RcptTo[0].User) + "@" + config.PrimaryHost
  46. hash := "unknown"
  47. if len(e.Hashes) > 0 {
  48. hash = e.Hashes[0]
  49. }
  50. var addHead string
  51. addHead += "Delivered-To: " + to + "\n"
  52. addHead += "Received: from " + e.Helo + " (" + e.Helo + " [" + e.RemoteIP + "])\n"
  53. if len(e.RcptTo) > 0 {
  54. addHead += " by " + e.RcptTo[0].Host + " with SMTP id " + hash + "@" + e.RcptTo[0].Host + ";\n"
  55. }
  56. addHead += " " + time.Now().Format(time.RFC1123Z) + "\n"
  57. // save the result
  58. e.DeliveryHeader = addHead
  59. // next processor
  60. return p.Process(e, task)
  61. } else {
  62. return p.Process(e, task)
  63. }
  64. })
  65. }
  66. }