smtp_server_test.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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_MultipartNoBody(t *testing.T) {
  35. email := `MIME-Version: 1.0
  36. Date: Tue, 28 Dec 2021 01:33:34 +0100
  37. Message-ID: <CAAvm7ABCDsi9vsuu0WTRXzZQBC8dXrDOLT8iCWdqrsmg@mail.gmail.com>
  38. Subject: This email has a subject but no body
  39. From: Phil <phil@example.com>
  40. To: ntfy-emailtest@ntfy.sh
  41. Content-Type: multipart/alternative; boundary="000000000000bcf4a405d429f8d4"
  42. --000000000000bcf4a405d429f8d4
  43. Content-Type: text/plain; charset="UTF-8"
  44. --000000000000bcf4a405d429f8d4
  45. Content-Type: text/html; charset="UTF-8"
  46. <div dir="ltr"><br></div>
  47. --000000000000bcf4a405d429f8d4--`
  48. _, backend := newTestBackend(t, func(m *message) error {
  49. require.Equal(t, "emailtest", m.Topic)
  50. require.Equal(t, "", m.Title) // We flipped message and body
  51. require.Equal(t, "This email has a subject but no body", m.Message)
  52. return nil
  53. })
  54. session, _ := backend.AnonymousLogin(nil)
  55. require.Nil(t, session.Mail("phil@example.com", smtp.MailOptions{}))
  56. require.Nil(t, session.Rcpt("ntfy-emailtest@ntfy.sh"))
  57. require.Nil(t, session.Data(strings.NewReader(email)))
  58. }
  59. func TestSmtpBackend_Plaintext(t *testing.T) {
  60. email := `Date: Tue, 28 Dec 2021 00:30:10 +0100
  61. Message-ID: <CAAvm79YP0C=Rt1N=KWmSUBB87KK2rRChmdzKqF1vCwMEUiVzLQ@mail.gmail.com>
  62. Subject: and one more
  63. From: Phil <phil@example.com>
  64. To: mytopic@ntfy.sh
  65. Content-Type: text/plain; charset="UTF-8"
  66. what's up
  67. `
  68. conf, backend := newTestBackend(t, func(m *message) error {
  69. require.Equal(t, "mytopic", m.Topic)
  70. require.Equal(t, "and one more", m.Title)
  71. require.Equal(t, "what's up\n", m.Message)
  72. return nil
  73. })
  74. conf.SMTPServerAddrPrefix = ""
  75. session, _ := backend.AnonymousLogin(nil)
  76. require.Nil(t, session.Mail("phil@example.com", smtp.MailOptions{}))
  77. require.Nil(t, session.Rcpt("mytopic@ntfy.sh"))
  78. require.Nil(t, session.Data(strings.NewReader(email)))
  79. }
  80. func TestSmtpBackend_Plaintext_EncodedSubject(t *testing.T) {
  81. email := `Date: Tue, 28 Dec 2021 00:30:10 +0100
  82. Subject: =?UTF-8?B?VGhyZWUgc2FudGFzIPCfjoXwn46F8J+OhQ==?=
  83. From: Phil <phil@example.com>
  84. To: ntfy-mytopic@ntfy.sh
  85. Content-Type: text/plain; charset="UTF-8"
  86. what's up
  87. `
  88. _, backend := newTestBackend(t, func(m *message) error {
  89. require.Equal(t, "Three santas 🎅🎅🎅", m.Title)
  90. return nil
  91. })
  92. session, _ := backend.AnonymousLogin(nil)
  93. require.Nil(t, session.Mail("phil@example.com", smtp.MailOptions{}))
  94. require.Nil(t, session.Rcpt("ntfy-mytopic@ntfy.sh"))
  95. require.Nil(t, session.Data(strings.NewReader(email)))
  96. }
  97. func TestSmtpBackend_Plaintext_TooLongTruncate(t *testing.T) {
  98. email := `Date: Tue, 28 Dec 2021 00:30:10 +0100
  99. Message-ID: <CAAvm79YP0C=Rt1N=KWmSUBB87KK2rRChmdzKqF1vCwMEUiVzLQ@mail.gmail.com>
  100. Subject: and one more
  101. From: Phil <phil@example.com>
  102. To: mytopic@ntfy.sh
  103. Content-Type: text/plain; charset="UTF-8"
  104. you know this is a string.
  105. it's a long string.
  106. it's supposed to be longer than the max message length
  107. which is 512 bytes,
  108. which some people say is too short
  109. but it kinda makes sense when you look at what it looks like one a phone
  110. heck this wasn't even half of it so far.
  111. so i'm gonna fill the rest of this with AAAAAAAAAAAAAAAAAAAAAAAAAAA
  112. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  113. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
  114. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  115. and with BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
  116. BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
  117. BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
  118. that should do it
  119. `
  120. conf, backend := newTestBackend(t, func(m *message) error {
  121. expected := `you know this is a string.
  122. it's a long string.
  123. it's supposed to be longer than the max message length
  124. which is 512 bytes,
  125. which some people say is too short
  126. but it kinda makes sense when you look at what it looks like one a phone
  127. heck this wasn't even half of it so far.
  128. so i'm gonna fill the rest of this with AAAAAAAAAAAAAAAAAAAAAAAAAAA
  129. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  130. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
  131. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  132. and with `
  133. require.Equal(t, expected, m.Message)
  134. return nil
  135. })
  136. conf.SMTPServerAddrPrefix = ""
  137. session, _ := backend.AnonymousLogin(nil)
  138. require.Nil(t, session.Mail("phil@example.com", smtp.MailOptions{}))
  139. require.Nil(t, session.Rcpt("mytopic@ntfy.sh"))
  140. require.Nil(t, session.Data(strings.NewReader(email)))
  141. }
  142. func TestSmtpBackend_Unsupported(t *testing.T) {
  143. email := `Date: Tue, 28 Dec 2021 00:30:10 +0100
  144. Message-ID: <CAAvm79YP0C=Rt1N=KWmSUBB87KK2rRChmdzKqF1vCwMEUiVzLQ@mail.gmail.com>
  145. Subject: and one more
  146. From: Phil <phil@example.com>
  147. To: mytopic@ntfy.sh
  148. Content-Type: text/SOMETHINGELSE
  149. what's up
  150. `
  151. conf, backend := newTestBackend(t, func(m *message) error {
  152. return nil
  153. })
  154. conf.SMTPServerAddrPrefix = ""
  155. session, _ := backend.Login(nil, "user", "pass")
  156. require.Nil(t, session.Mail("phil@example.com", smtp.MailOptions{}))
  157. require.Nil(t, session.Rcpt("mytopic@ntfy.sh"))
  158. require.Equal(t, errUnsupportedContentType, session.Data(strings.NewReader(email)))
  159. }
  160. func newTestBackend(t *testing.T, sub subscriber) (*Config, *smtpBackend) {
  161. conf := newTestConfig(t)
  162. conf.SMTPServerListen = ":25"
  163. conf.SMTPServerDomain = "ntfy.sh"
  164. conf.SMTPServerAddrPrefix = "ntfy-"
  165. backend := newMailBackend(conf, sub)
  166. return conf, backend
  167. }