Skip to content

Instantly share code, notes, and snippets.

@gustavohenrique
Last active May 22, 2019 17:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gustavohenrique/063e9b3d246cc3dbdc70d2a4917aed8f to your computer and use it in GitHub Desktop.
Save gustavohenrique/063e9b3d246cc3dbdc70d2a4917aed8f to your computer and use it in GitHub Desktop.
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)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment