mirror of
https://github.com/binwiederhier/ntfy.git
synced 2024-11-22 19:33:27 +01:00
Support emails without Content-Type, closes #265
This commit is contained in:
parent
35a691a1bc
commit
2abd6a57ee
3 changed files with 61 additions and 23 deletions
|
@ -2,6 +2,16 @@
|
||||||
Binaries for all releases can be found on the GitHub releases pages for the [ntfy server](https://github.com/binwiederhier/ntfy/releases)
|
Binaries for all releases can be found on the GitHub releases pages for the [ntfy server](https://github.com/binwiederhier/ntfy/releases)
|
||||||
and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/releases).
|
and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/releases).
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
## ntfy server v1.24.0 (UNRELEASED)
|
||||||
|
|
||||||
|
**Bugs:**
|
||||||
|
|
||||||
|
* Support emails without `Content-Type` ([#265](https://github.com/binwiederhier/ntfy/issues/265), thanks to [@dmbonsall](https://github.com/dmbonsall))
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
## ntfy server v1.23.0
|
## ntfy server v1.23.0
|
||||||
Released May 21, 2022
|
Released May 21, 2022
|
||||||
|
|
||||||
|
|
|
@ -159,37 +159,47 @@ func (s *smtpSession) withFailCount(fn func() error) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func readMailBody(msg *mail.Message) (string, error) {
|
func readMailBody(msg *mail.Message) (string, error) {
|
||||||
|
if msg.Header.Get("Content-Type") == "" {
|
||||||
|
return readPlainTextMailBody(msg)
|
||||||
|
}
|
||||||
contentType, params, err := mime.ParseMediaType(msg.Header.Get("Content-Type"))
|
contentType, params, err := mime.ParseMediaType(msg.Header.Get("Content-Type"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
if contentType == "text/plain" {
|
if contentType == "text/plain" {
|
||||||
body, err := io.ReadAll(msg.Body)
|
return readPlainTextMailBody(msg)
|
||||||
|
} else if strings.HasPrefix(contentType, "multipart/") {
|
||||||
|
return readMultipartMailBody(msg, params)
|
||||||
|
}
|
||||||
|
return "", errUnsupportedContentType
|
||||||
|
}
|
||||||
|
|
||||||
|
func readPlainTextMailBody(msg *mail.Message) (string, error) {
|
||||||
|
body, err := io.ReadAll(msg.Body)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return string(body), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func readMultipartMailBody(msg *mail.Message, params map[string]string) (string, error) {
|
||||||
|
mr := multipart.NewReader(msg.Body, params["boundary"])
|
||||||
|
for {
|
||||||
|
part, err := mr.NextPart()
|
||||||
|
if err != nil { // may be io.EOF
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
partContentType, _, err := mime.ParseMediaType(part.Header.Get("Content-Type"))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if partContentType != "text/plain" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
body, err := io.ReadAll(part)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return string(body), nil
|
return string(body), nil
|
||||||
}
|
}
|
||||||
if strings.HasPrefix(contentType, "multipart/") {
|
|
||||||
mr := multipart.NewReader(msg.Body, params["boundary"])
|
|
||||||
for {
|
|
||||||
part, err := mr.NextPart()
|
|
||||||
if err != nil { // may be io.EOF
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
partContentType, _, err := mime.ParseMediaType(part.Header.Get("Content-Type"))
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
if partContentType != "text/plain" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
body, err := io.ReadAll(part)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return string(body), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "", errUnsupportedContentType
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,6 +94,24 @@ what's up
|
||||||
require.Nil(t, session.Data(strings.NewReader(email)))
|
require.Nil(t, session.Data(strings.NewReader(email)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSmtpBackend_Plaintext_No_ContentType(t *testing.T) {
|
||||||
|
email := `Subject: Very short mail
|
||||||
|
|
||||||
|
what's up
|
||||||
|
`
|
||||||
|
conf, backend := newTestBackend(t, func(m *message) error {
|
||||||
|
require.Equal(t, "mytopic", m.Topic)
|
||||||
|
require.Equal(t, "Very short mail", m.Title)
|
||||||
|
require.Equal(t, "what's up", m.Message)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
conf.SMTPServerAddrPrefix = ""
|
||||||
|
session, _ := backend.AnonymousLogin(nil)
|
||||||
|
require.Nil(t, session.Mail("phil@example.com", smtp.MailOptions{}))
|
||||||
|
require.Nil(t, session.Rcpt("mytopic@ntfy.sh"))
|
||||||
|
require.Nil(t, session.Data(strings.NewReader(email)))
|
||||||
|
}
|
||||||
|
|
||||||
func TestSmtpBackend_Plaintext_EncodedSubject(t *testing.T) {
|
func TestSmtpBackend_Plaintext_EncodedSubject(t *testing.T) {
|
||||||
email := `Date: Tue, 28 Dec 2021 00:30:10 +0100
|
email := `Date: Tue, 28 Dec 2021 00:30:10 +0100
|
||||||
Subject: =?UTF-8?B?VGhyZWUgc2FudGFzIPCfjoXwn46F8J+OhQ==?=
|
Subject: =?UTF-8?B?VGhyZWUgc2FudGFzIPCfjoXwn46F8J+OhQ==?=
|
||||||
|
|
Loading…
Reference in a new issue