s_header.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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 StreamHeader() *StreamDecorator {
  39. sd := &StreamDecorator{}
  40. sd.p =
  41. func(sp StreamProcessor) StreamProcessor {
  42. var sh *streamHeader
  43. sd.Open = func(e *mail.Envelope) error {
  44. sh = newStreamHeader(sp)
  45. hc := HeaderConfig{"sharklasers.com"}
  46. sh.addHeader(e, hc)
  47. return nil
  48. }
  49. return StreamProcessWith(func(p []byte) (int, error) {
  50. if sh.i < len(sh.addHead) {
  51. for {
  52. if N, err := sh.w.Write(sh.addHead[sh.i:]); err != nil {
  53. return N, err
  54. } else {
  55. sh.i += N
  56. if sh.i >= len(sh.addHead) {
  57. break
  58. }
  59. }
  60. }
  61. }
  62. return sp.Write(p)
  63. })
  64. }
  65. return sd
  66. }