smtp_server_test.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package server
  2. import (
  3. "github.com/emersion/go-smtp"
  4. "github.com/stretchr/testify/require"
  5. "strings"
  6. "testing"
  7. )
  8. func TestSmtpBackend_Multipart(t *testing.T) {
  9. email := `MIME-Version: 1.0
  10. Date: Tue, 28 Dec 2021 00:30:10 +0100
  11. Message-ID: <CAAvm79YP0C=Rt1N=KWmSUBB87KK2rRChmdzKqF1vCwMEUiVzLQ@mail.gmail.com>
  12. Subject: and one more
  13. From: Phil <phil@example.com>
  14. To: ntfy-mytopic@ntfy.sh
  15. Content-Type: multipart/alternative; boundary="000000000000f3320b05d42915c9"
  16. --000000000000f3320b05d42915c9
  17. Content-Type: text/plain; charset="UTF-8"
  18. what's up
  19. --000000000000f3320b05d42915c9
  20. Content-Type: text/html; charset="UTF-8"
  21. <div dir="ltr">what&#39;s up<br clear="all"><div><br></div></div>
  22. --000000000000f3320b05d42915c9--`
  23. _, backend := newTestBackend(t, func(m *message) error {
  24. require.Equal(t, "mytopic", m.Topic)
  25. require.Equal(t, "and one more", m.Title)
  26. require.Equal(t, "what's up\n", m.Message)
  27. return nil
  28. })
  29. session, _ := backend.AnonymousLogin(nil)
  30. require.Nil(t, session.Mail("phil@example.com", smtp.MailOptions{}))
  31. require.Nil(t, session.Rcpt("ntfy-mytopic@ntfy.sh"))
  32. require.Nil(t, session.Data(strings.NewReader(email)))
  33. }
  34. func TestSmtpBackend_Plaintext(t *testing.T) {
  35. email := `Date: Tue, 28 Dec 2021 00:30:10 +0100
  36. Message-ID: <CAAvm79YP0C=Rt1N=KWmSUBB87KK2rRChmdzKqF1vCwMEUiVzLQ@mail.gmail.com>
  37. Subject: and one more
  38. From: Phil <phil@example.com>
  39. To: mytopic@ntfy.sh
  40. Content-Type: text/plain; charset="UTF-8"
  41. what's up
  42. `
  43. conf, backend := newTestBackend(t, func(m *message) error {
  44. require.Equal(t, "mytopic", m.Topic)
  45. require.Equal(t, "and one more", m.Title)
  46. require.Equal(t, "what's up\n", m.Message)
  47. return nil
  48. })
  49. conf.SMTPServerAddrPrefix = ""
  50. session, _ := backend.AnonymousLogin(nil)
  51. require.Nil(t, session.Mail("phil@example.com", smtp.MailOptions{}))
  52. require.Nil(t, session.Rcpt("mytopic@ntfy.sh"))
  53. require.Nil(t, session.Data(strings.NewReader(email)))
  54. }
  55. func TestSmtpBackend_Plaintext_EncodedSubject(t *testing.T) {
  56. email := `Date: Tue, 28 Dec 2021 00:30:10 +0100
  57. Subject: =?UTF-8?B?VGhyZWUgc2FudGFzIPCfjoXwn46F8J+OhQ==?=
  58. From: Phil <phil@example.com>
  59. To: ntfy-mytopic@ntfy.sh
  60. Content-Type: text/plain; charset="UTF-8"
  61. what's up
  62. `
  63. _, backend := newTestBackend(t, func(m *message) error {
  64. require.Equal(t, "Three santas 🎅🎅🎅", m.Title)
  65. return nil
  66. })
  67. session, _ := backend.AnonymousLogin(nil)
  68. require.Nil(t, session.Mail("phil@example.com", smtp.MailOptions{}))
  69. require.Nil(t, session.Rcpt("ntfy-mytopic@ntfy.sh"))
  70. require.Nil(t, session.Data(strings.NewReader(email)))
  71. }
  72. func TestSmtpBackend_Plaintext_TooLongTruncate(t *testing.T) {
  73. email := `Date: Tue, 28 Dec 2021 00:30:10 +0100
  74. Message-ID: <CAAvm79YP0C=Rt1N=KWmSUBB87KK2rRChmdzKqF1vCwMEUiVzLQ@mail.gmail.com>
  75. Subject: and one more
  76. From: Phil <phil@example.com>
  77. To: mytopic@ntfy.sh
  78. Content-Type: text/plain; charset="UTF-8"
  79. you know this is a string.
  80. it's a long string.
  81. it's supposed to be longer than the max message length
  82. which is 512 bytes,
  83. which some people say is too short
  84. but it kinda makes sense when you look at what it looks like one a phone
  85. heck this wasn't even half of it so far.
  86. so i'm gonna fill the rest of this with AAAAAAAAAAAAAAAAAAAAAAAAAAA
  87. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  88. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
  89. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  90. and with BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
  91. BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
  92. BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
  93. that should do it
  94. `
  95. conf, backend := newTestBackend(t, func(m *message) error {
  96. expected := `you know this is a string.
  97. it's a long string.
  98. it's supposed to be longer than the max message length
  99. which is 512 bytes,
  100. which some people say is too short
  101. but it kinda makes sense when you look at what it looks like one a phone
  102. heck this wasn't even half of it so far.
  103. so i'm gonna fill the rest of this with AAAAAAAAAAAAAAAAAAAAAAAAAAA
  104. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  105. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
  106. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  107. and with `
  108. require.Equal(t, expected, m.Message)
  109. return nil
  110. })
  111. conf.SMTPServerAddrPrefix = ""
  112. session, _ := backend.AnonymousLogin(nil)
  113. require.Nil(t, session.Mail("phil@example.com", smtp.MailOptions{}))
  114. require.Nil(t, session.Rcpt("mytopic@ntfy.sh"))
  115. require.Nil(t, session.Data(strings.NewReader(email)))
  116. }
  117. func TestSmtpBackend_Unsupported(t *testing.T) {
  118. email := `Date: Tue, 28 Dec 2021 00:30:10 +0100
  119. Message-ID: <CAAvm79YP0C=Rt1N=KWmSUBB87KK2rRChmdzKqF1vCwMEUiVzLQ@mail.gmail.com>
  120. Subject: and one more
  121. From: Phil <phil@example.com>
  122. To: mytopic@ntfy.sh
  123. Content-Type: text/SOMETHINGELSE
  124. what's up
  125. `
  126. conf, backend := newTestBackend(t, func(m *message) error {
  127. return nil
  128. })
  129. conf.SMTPServerAddrPrefix = ""
  130. session, _ := backend.Login(nil, "user", "pass")
  131. require.Nil(t, session.Mail("phil@example.com", smtp.MailOptions{}))
  132. require.Nil(t, session.Rcpt("mytopic@ntfy.sh"))
  133. require.Equal(t, errUnsupportedContentType, session.Data(strings.NewReader(email)))
  134. }
  135. func newTestBackend(t *testing.T, sub subscriber) (*Config, *smtpBackend) {
  136. conf := newTestConfig(t)
  137. conf.SMTPServerListen = ":25"
  138. conf.SMTPServerDomain = "ntfy.sh"
  139. conf.SMTPServerAddrPrefix = "ntfy-"
  140. backend := newMailBackend(conf, sub)
  141. return conf, backend
  142. }