package mail
import (
"bytes"
"crypto/tls"
"fmt"
"log"
"mime/quotedprintable"
"net/smtp"
)
const (
host = "email-smtp.us-east-1.amazonaws.com"
port = ":465"
)
type Sender struct {
User string
Password string
From string
}
func NewSender(User, Password string) Sender {
sender := Sender{}
sender.User = User
sender.Password = Password
sender.From = "noreply@empresa.com"
return sender
}
func (sender Sender) SendMail(dest string, subject, bodyMessage string) {
tlsconfig := &tls.Config{
InsecureSkipVerify: true,
ServerName: host,
}
servername := host + port
conn, err := tls.Dial("tcp", servername, tlsconfig)
if err != nil {
log.Printf("Error connecting to mail server. %s", err)
return
}
c, err := smtp.NewClient(conn, host)
if err != nil {
log.Printf("Error creating mail client. %s", err)
return
}
auth := smtp.PlainAuth("", sender.User, sender.Password, host)
if err = c.Auth(auth); err != nil {
log.Printf("Error on mail authentication. %s", err)
return
}
if err = c.Mail(sender.From); err != nil {
log.Printf("Error in From. %s", err)
return
}
if err = c.Rcpt(dest); err != nil {
log.Printf("Error in To %s %s.", dest, err)
return
}
w, err := c.Data()
if err != nil {
log.Printf("Error in Data. %s", err)
return
}
_, err = w.Write([]byte(bodyMessage))
if err != nil {
log.Printf("Error writing data. %s", err)
return
}
err = w.Close()
if err != nil {
log.Printf("Error closing. %s", err)
return
}
c.Quit()
log.Printf("Email enviado com sucesso! %s", subject)
}
func (sender Sender) WriteEmail(to string, contentType, subject, bodyMessage string) string {
header := make(map[string]string)
header["From"] = sender.From
header["To"] = to
header["Subject"] = subject
header["MIME-Version"] = "1.0"
header["Content-Type"] = fmt.Sprintf("%s; charset=\"utf-8\"", contentType)
header["Content-Transfer-Encoding"] = "quoted-printable"
header["Content-Disposition"] = "inline"
message := ""
for key, value := range header {
message += fmt.Sprintf("%s: %s\r\n", key, value)
}
var encodedMessage bytes.Buffer
finalMessage := quotedprintable.NewWriter(&encodedMessage)
finalMessage.Write([]byte(bodyMessage))
finalMessage.Close()
message += "\r\n" + encodedMessage.String()
return message
}
func (sender *Sender) WriteHTMLEmail(to string, subject, bodyMessage string) string {
return sender.WriteEmail(to, "text/html", subject, bodyMessage)
}
func (sender *Sender) WritePlainEmail(to string, subject, bodyMessage string) string {
return sender.WriteEmail(to, "text/plain", subject, bodyMessage)
}
Como usar:
func createEmailMessage() string {
template := `
<!DOCTYPE HTML PULBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html"; charset=UTF-8">
<style type="text/css">
p {
font-family: Arial;
font-size: 14pt;
}
</style>
</head>
<body>
<p><strong>Cliente: %s</strong><br></p>
</body>
</html>`
return fmt.Sprintf(template, "teste")
}
func SendMail() {
to := "cliente@empresa.com"
subject := "[info] it is not spam"
message := createEmailMessage()
sender := mail.NewSender()
bodyMessage := sender.WriteHTMLEmail(to, subject, message)
sender.SendMail(to, subject, bodyMessage)
}