forked from zemirco/email
/
email.go
68 lines (58 loc) · 1.61 KB
/
email.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
// Package email makes email sending simple.
//
// mail := Mail{
// From: "mirco.zeiss@gmail.com",
// To: "john@wayne.com",
// Subject: "Hey John",
// HTML: "<h1>Good job!</h1>",
// }
// err := mail.Send("smtp.amazonaws.com", 587, "user", "password")
// if err != nil {
// panic(err)
// }
package email
import (
"bytes"
"fmt"
"net/mail"
"net/smtp"
"net/textproto"
)
type Mail struct {
From string
To string
Subject string
HTML string
}
// Send does what it is supposed to do.
func (m *Mail) Send(host string, port int, user, pass string) error {
// validate from address
from, err := mail.ParseAddress(m.From)
if err != nil {
return err
}
// validate to address
to, err := mail.ParseAddress(m.To)
if err != nil {
return err
}
// set headers for html email
header := textproto.MIMEHeader{}
header.Set(textproto.CanonicalMIMEHeaderKey("from"), from.Address)
header.Set(textproto.CanonicalMIMEHeaderKey("to"), to.Address)
header.Set(textproto.CanonicalMIMEHeaderKey("content-type"), "text/html; charset=UTF-8")
header.Set(textproto.CanonicalMIMEHeaderKey("mime-version"), "1.0")
header.Set(textproto.CanonicalMIMEHeaderKey("subject"), m.Subject)
// init empty message
var buffer bytes.Buffer
// write header
for key, value := range header {
buffer.WriteString(fmt.Sprintf("%s: %s\r\n", key, value[0]))
}
// write body
buffer.WriteString(fmt.Sprintf("\r\n%s", m.HTML))
// send email
addr := fmt.Sprintf("%s:%d", host, port)
auth := smtp.PlainAuth("", user, pass, host)
return smtp.SendMail(addr, auth, from.Address, []string{to.Address}, buffer.Bytes())
}