s_header.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package backends
  2. import (
  3. "github.com/flashmob/go-guerrilla/mail"
  4. "io"
  5. "strings"
  6. "time"
  7. )
  8. func init() {
  9. streamers["header"] = func() StreamDecorator {
  10. return *StreamHeader()
  11. }
  12. }
  13. type streamHeader struct {
  14. addHead []byte
  15. w io.Writer
  16. i int
  17. }
  18. func newStreamHeader(w io.Writer) *streamHeader {
  19. sc := new(streamHeader)
  20. sc.w = w
  21. return sc
  22. }
  23. func (sh *streamHeader) addHeader(e *mail.Envelope, config HeaderConfig) {
  24. to := strings.TrimSpace(e.RcptTo[0].User) + "@" + config.PrimaryHost
  25. hash := "unknown"
  26. if len(e.Hashes) > 0 {
  27. hash = e.Hashes[0]
  28. }
  29. var addHead string
  30. addHead += "Delivered-To: " + to + "\n"
  31. addHead += "Received: from " + e.Helo + " (" + e.Helo + " [" + e.RemoteIP + "])\n"
  32. if len(e.RcptTo) > 0 {
  33. addHead += " by " + e.RcptTo[0].Host + " with SMTP id " + hash + "@" + e.RcptTo[0].Host + ";\n"
  34. }
  35. addHead += " " + time.Now().Format(time.RFC1123Z) + "\n"
  36. sh.addHead = []byte(addHead)
  37. }
  38. func (sh *streamHeader) Write(p []byte) (n int, err error) {
  39. if sh.i < len(sh.addHead) {
  40. for {
  41. if N, err := sh.w.Write(sh.addHead[sh.i:]); err != nil {
  42. return N, err
  43. } else {
  44. sh.i += N
  45. if sh.i >= len(sh.addHead) {
  46. break
  47. }
  48. }
  49. }
  50. }
  51. return sh.w.Write(p)
  52. }
  53. func StreamHeader() *StreamDecorator {
  54. sd := &StreamDecorator{}
  55. sd.p =
  56. func(sp StreamProcessor) StreamProcessor {
  57. var dc *streamHeader
  58. x := 1 + 5
  59. _ = x
  60. sd.Open = func(e *mail.Envelope) error {
  61. dc = newStreamHeader(sp)
  62. hc := HeaderConfig{"sharklasers.com"}
  63. dc.addHeader(e, hc)
  64. return nil
  65. }
  66. return StreamProcessWith(func(p []byte) (int, error) {
  67. return sp.Write(p)
  68. })
  69. }
  70. /*
  71. func(sp StreamProcessor) StreamProcessor {
  72. var dc *streamHeader
  73. sd.Open = func(e *mail.Envelope) error {
  74. dc = newStreamHeader(sp)
  75. hc := HeaderConfig{"sharklasers.com"}
  76. dc.addHeader(e, hc)
  77. return nil
  78. }
  79. return StreamProcessWith(dc.Write)
  80. }
  81. */
  82. return sd
  83. }