@@ -3,14 +3,15 @@ package smtp
33import (
44 "crypto/tls"
55 "fmt"
6- "github.com/containrrr/shoutrrr/pkg/format"
76 "io"
87 "math/rand"
98 "net"
109 "net/smtp"
1110 "net/url"
11+ "os"
1212 "time"
1313
14+ "github.com/containrrr/shoutrrr/pkg/format"
1415 "github.com/containrrr/shoutrrr/pkg/services/standard"
1516 "github.com/containrrr/shoutrrr/pkg/types"
1617)
@@ -64,16 +65,16 @@ func (service *Service) Initialize(configURL *url.URL, logger types.StdLogger) e
6465
6566// Send a notification message to e-mail recipients
6667func (service * Service ) Send (message string , params * types.Params ) error {
67- client , err := getClientConnection (service .config )
68- if err != nil {
69- return fail (FailGetSMTPClient , err )
70- }
71-
7268 config := service .config .Clone ()
7369 if err := service .propKeyResolver .UpdateConfigFromParams (& config , params ); err != nil {
7470 return fail (FailApplySendParams , err )
7571 }
7672
73+ client , err := getClientConnection (service .config )
74+ if err != nil {
75+ return fail (FailGetSMTPClient , err )
76+ }
77+
7778 return service .doSend (client , message , & config )
7879}
7980
@@ -106,6 +107,12 @@ func getClientConnection(config *Config) (*smtp.Client, error) {
106107
107108func (service * Service ) doSend (client * smtp.Client , message string , config * Config ) failure {
108109
110+ clientHost := service .resolveClientHost (config )
111+
112+ if err := client .Hello (clientHost ); err != nil {
113+ return fail (FailHandshake , err )
114+ }
115+
109116 if config .UseHTML {
110117 service .multipartBoundary = fmt .Sprintf ("%x" , rand .Int63 ())
111118 }
@@ -149,6 +156,20 @@ func (service *Service) doSend(client *smtp.Client, message string, config *Conf
149156 return nil
150157}
151158
159+ func (service * Service ) resolveClientHost (config * Config ) string {
160+ if config .ClientHost != "auto" {
161+ return config .ClientHost
162+ }
163+
164+ hostname , err := os .Hostname ()
165+ if err != nil {
166+ service .Logf ("Failed to get hostname, falling back to localhost: %v" , err )
167+ return "localhost"
168+ }
169+
170+ return hostname
171+ }
172+
152173func (service * Service ) getAuth (config * Config ) (smtp.Auth , failure ) {
153174
154175 switch config .Auth {
@@ -183,7 +204,7 @@ func (service *Service) sendToRecipient(client *smtp.Client, toAddress string, c
183204 }
184205
185206 if err := writeHeaders (wc , service .getHeaders (toAddress , config .Subject )); err != nil {
186- return fail ( FailWriteHeaders , err )
207+ return err
187208 }
188209
189210 var ferr failure
@@ -256,7 +277,7 @@ func (service *Service) writeMessagePart(wc io.WriteCloser, message string, temp
256277 return fail (FailMessageTemplate , err )
257278 }
258279 } else {
259- if _ , err := fmt .Fprintf (wc , message ); err != nil {
280+ if _ , err := fmt .Fprint (wc , message ); err != nil {
260281 return fail (FailMessageRaw , err )
261282 }
262283 }
@@ -282,13 +303,16 @@ func writeMultipartHeader(wc io.WriteCloser, boundary string, contentType string
282303 return nil
283304}
284305
285- func writeHeaders (wc io.WriteCloser , headers map [string ]string ) error {
306+ func writeHeaders (wc io.WriteCloser , headers map [string ]string ) failure {
286307 for key , val := range headers {
287308 if _ , err := fmt .Fprintf (wc , "%s: %s\n " , key , val ); err != nil {
288- return err
309+ return fail ( FailWriteHeaders , err )
289310 }
290311 }
291312
292313 _ , err := fmt .Fprintln (wc )
293- return err
314+ if err != nil {
315+ return fail (FailWriteHeaders , err )
316+ }
317+ return nil
294318}
0 commit comments