/
smtp.go
78 lines (69 loc) · 1.41 KB
/
smtp.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package pmail
import (
"crypto/tls"
"fmt"
"io"
"net/smtp"
)
// RelaySender sends emails to a relaying server
type RelaySender struct {
Host string
Port int
Auth smtp.Auth
TLSConfig *tls.Config
RequireTLS bool
}
func NewDialer(host string, port int, username, password string) *RelaySender {
return &RelaySender{Host: host, Port: port, Auth: smtp.PlainAuth("", username, password, host)}
}
// Send connects to the relay server and sends the email
func (r *RelaySender) Send(from string, to []string, msg io.WriterTo) error {
cl, err := smtp.Dial(fmt.Sprintf("%s:%d", r.Host, r.Port))
if err != nil {
return err
}
defer cl.Close()
if stls, _ := cl.Extension("STARTTLS"); stls {
tlscfg := &tls.Config{ServerName: r.Host}
if r.TLSConfig != nil {
tlscfg = r.TLSConfig
}
err = cl.StartTLS(tlscfg)
if err != nil {
return err
}
} else if r.RequireTLS {
return fmt.Errorf("cannot send email: configuration requires TLS but server %s does not support it", r.Host)
}
if r.Auth != nil {
err = cl.Auth(r.Auth)
if err != nil {
return err
}
}
err = cl.Mail(from)
if err != nil {
return err
}
for _, t := range to {
err = cl.Rcpt(t)
if err != nil {
return err
}
}
// send data
wr, err := cl.Data()
if err != nil {
return err
}
_, err = msg.WriteTo(wr)
if err != nil {
return err
}
err = wr.Close()
if err != nil {
return err
}
cl.Quit()
return nil
}