p_header.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package backends
  2. import (
  3. "github.com/flashmob/go-guerrilla/envelope"
  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. Service.AddInitializer(Initialize(func(backendConfig BackendConfig) error {
  34. configType := BaseConfig(&HeaderConfig{})
  35. bcfg, err := Service.ExtractConfig(backendConfig, configType)
  36. if err != nil {
  37. return err
  38. }
  39. config = bcfg.(*HeaderConfig)
  40. return nil
  41. }))
  42. return func(c Processor) Processor {
  43. return ProcessorFunc(func(e *envelope.Envelope) (BackendResult, error) {
  44. to := strings.TrimSpace(e.RcptTo[0].User) + "@" + config.PrimaryHost
  45. hash := "unknown"
  46. if len(e.Hashes) > 0 {
  47. hash = e.Hashes[0]
  48. }
  49. var addHead string
  50. addHead += "Delivered-To: " + to + "\n"
  51. addHead += "Received: from " + e.Helo + " (" + e.Helo + " [" + e.RemoteAddress + "])\n"
  52. if len(e.RcptTo) > 0 {
  53. addHead += " by " + e.RcptTo[0].Host + " with SMTP id " + hash + "@" + e.RcptTo[0].Host + ";\n"
  54. }
  55. addHead += " " + time.Now().Format(time.RFC1123Z) + "\n"
  56. // save the result
  57. e.DeliveryHeader = addHead
  58. // next processor
  59. return c.Process(e)
  60. })
  61. }
  62. }