email_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package email
  2. import (
  3. "io"
  4. "mime"
  5. "net/mail"
  6. "strings"
  7. "testing"
  8. )
  9. func TestBuildMessageIsRFC5322(t *testing.T) {
  10. raw := buildMessage("[email protected]", "3x-ui", []string{"[email protected]", "[email protected]"}, "Тест", "<b>hi</b>")
  11. msg, err := mail.ReadMessage(strings.NewReader(string(raw)))
  12. if err != nil {
  13. t.Fatalf("message does not parse as RFC 5322: %v", err)
  14. }
  15. from, err := mail.ParseAddress(msg.Header.Get("From"))
  16. if err != nil {
  17. t.Fatalf("From header does not parse: %v", err)
  18. }
  19. if from.Name != "3x-ui" || from.Address != "[email protected]" {
  20. t.Errorf("From = %q <%q>, want name %q addr %q", from.Name, from.Address, "3x-ui", "[email protected]")
  21. }
  22. if _, err := msg.Header.Date(); err != nil {
  23. t.Errorf("Date header missing or unparseable: %v", err)
  24. }
  25. id := msg.Header.Get("Message-ID")
  26. if !strings.HasPrefix(id, "<") || !strings.HasSuffix(id, "@example.com>") {
  27. t.Errorf("Message-ID = %q, want <[email protected]>", id)
  28. }
  29. subject, err := (&mime.WordDecoder{}).DecodeHeader(msg.Header.Get("Subject"))
  30. if err != nil {
  31. t.Fatalf("Subject does not decode: %v", err)
  32. }
  33. if subject != "Тест" {
  34. t.Errorf("Subject = %q, want %q", subject, "Тест")
  35. }
  36. body, _ := io.ReadAll(msg.Body)
  37. if string(body) != "<b>hi</b>" {
  38. t.Errorf("body = %q, want %q", body, "<b>hi</b>")
  39. }
  40. }
  41. func TestBuildMessageFromWithoutName(t *testing.T) {
  42. raw := buildMessage("[email protected]", "", []string{"[email protected]"}, "s", "b")
  43. msg, err := mail.ReadMessage(strings.NewReader(string(raw)))
  44. if err != nil {
  45. t.Fatalf("parse: %v", err)
  46. }
  47. from, err := mail.ParseAddress(msg.Header.Get("From"))
  48. if err != nil {
  49. t.Fatalf("From header does not parse: %v", err)
  50. }
  51. if from.Name != "" || from.Address != "[email protected]" {
  52. t.Errorf("From = %q <%q>, want bare addr", from.Name, from.Address)
  53. }
  54. }
  55. func TestBuildMessageStripsHeaderInjection(t *testing.T) {
  56. raw := buildMessage(
  57. "[email protected]\r\nBcc: [email protected]",
  58. "Name\r\nX-Evil: 1",
  59. []string{"[email protected]"}, "s", "b",
  60. )
  61. msg, err := mail.ReadMessage(strings.NewReader(string(raw)))
  62. if err != nil {
  63. t.Fatalf("parse: %v", err)
  64. }
  65. if got := msg.Header.Get("Bcc"); got != "" {
  66. t.Errorf("injected Bcc header leaked: %q", got)
  67. }
  68. if got := msg.Header.Get("X-Evil"); got != "" {
  69. t.Errorf("injected X-Evil header leaked: %q", got)
  70. }
  71. }