Blame view
email.go
2.74 KB
bca3975fd email |
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 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 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
package webutility // TODO(markO): test test test test test (and open source?) import ( "crypto/tls" "errors" "fmt" "net/smtp" "strings" ) type EmailConfig struct { ServerName string Identity string Username string Password string Host string Port int } 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, } } 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, } } func SendEmail(email *Email, conf *EmailConfig) error { if email == nil { return errors.New("no email to send") } if conf == nil { // use (some?) default settings conf = NewEmailConfig("", "marko.tikvic@to-net.rs", "quantumleap010", "mail.to-net.rs", 25) } c, err := smtp.Dial(conf.ServerName) if err != nil { return err } 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() } 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()) } |