Blame view
email.go
2.76 KB
bca3975fd email |
1 2 3 4 5 6 7 8 9 10 11 |
package webutility // TODO(markO): test test test test test (and open source?) import ( "crypto/tls" "errors" "fmt" "net/smtp" "strings" ) |
bca3975fd email |
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
type Email struct { To []string From string Subject string Body string } func NewEmail(to []string, from, subject, body string) *Email { return &Email{ To: to, From: from, Subject: subject, Body: body, } } |
2cff4b70c refactored email:... |
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 |
func (e *Email) String() string { var str strings.Builder str.WriteString("From:" + e.From + "\r ") str.WriteString("To:") for i, _ := range e.To { if i > 0 { str.WriteString(",") } str.WriteString(e.To[i]) } str.WriteString("\r ") str.WriteString("Subject:" + e.Subject + "\r ") // body str.WriteString("\r " + e.Body + "\r ") return str.String() } func (e *Email) Bytes() []byte { return []byte(e.String()) } |
bca3975fd email |
57 58 59 |
func SendEmail(email *Email, conf *EmailConfig) error { if email == nil { return errors.New("no email to send") |
bca3975fd email |
60 61 62 |
} if conf == nil { |
2cff4b70c refactored email:... |
63 |
return errors.New("email configuration not provided") |
bca3975fd email |
64 65 66 67 68 69 |
} c, err := smtp.Dial(conf.ServerName) if err != nil { return err } |
bca3975fd email |
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
defer c.Close() // not sure if this is needed //if err = c.Hello(conf.ServerName); err != nil { // return err //} if ok, _ := c.Extension("STARTTLS"); ok { // disable stupid tls check for self-signed certificates config := &tls.Config{ ServerName: conf.ServerName, InsecureSkipVerify: true, } // for golang testing //if testHookStartTLS != nil { // testHookStartTLS(config) //} if err = c.StartTLS(config); err != nil { return err } } /* // don't know what to do with this if a != nil && c.ext != nil { if _, ok := c.ext["AUTH"]; !ok { return errors.New("smtp: server doesn't support AUTH") } if err = c.Auth(a); err != nil { return err } } */ // Set up authentication information. auth := smtp.PlainAuth(conf.Identity, conf.Username, conf.Password, conf.Host) if err = c.Auth(auth); err != nil { return err } if err = c.Mail(email.From); err != nil { return err } for _, addr := range email.To { if err = c.Rcpt(addr); err != nil { return err } } w, err := c.Data() if err != nil { return err } _, err = w.Write(email.Bytes()) if err != nil { return err } err = w.Close() if err != nil { return err } return c.Quit() } |
2cff4b70c refactored email:... |
137 |
type EmailConfig struct { |
ab548c502 added Valid() to ... |
138 139 140 141 142 143 |
ServerName string `json:"-"` Identity string `json:"-"` Username string `json:"username"` Password string `json:"password"` Host string `json:"host"` Port int `json:"port"` |
bca3975fd email |
144 |
} |
2cff4b70c refactored email:... |
145 146 147 148 149 150 151 152 153 |
func NewEmailConfig(ident, uname, pword, host string, port int) *EmailConfig { return &EmailConfig{ ServerName: host + fmt.Sprintf(":%d", port), Identity: ident, Username: uname, Password: pword, Host: host, Port: port, } |
bca3975fd email |
154 |
} |