Skip to content

Instantly share code, notes, and snippets.

@guinso
Created October 9, 2017 01:10
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save guinso/4b9476ef5293c83840488938a171e885 to your computer and use it in GitHub Desktop.
Save guinso/4b9476ef5293c83840488938a171e885 to your computer and use it in GitHub Desktop.
Simple SMTP sample
package main
import (
"crypto/tls"
"fmt"
"log"
"net/smtp"
"strings"
)
//https://hackernoon.com/golang-sendmail-sending-mail-through-net-smtp-package-5cadbe2670e0
func main() {
var (
serverAddr = "smtp.gmail.com"
password = "your-password"
emailAddr = "your-email@gmail.com"
portNumber = 465
tos = []string{
"friendA@yahoo.com",
"friendB@hotmail.com",
}
cc = []string{
"friendC@yandex.com",
}
)
log.Println("======= Test Gmail client =========")
log.Println("NOTE: user need to turn on 'less secure apps' options")
log.Println("URL: https://myaccount.google.com/lesssecureapps\n\r")
tlsConfig := tls.Config{
ServerName: serverAddr,
InsecureSkipVerify: true,
}
log.Println("Establish TLS connection")
conn, connErr := tls.Dial("tcp", fmt.Sprintf("%s:%d", serverAddr, portNumber), &tlsConfig)
if connErr != nil {
log.Panic(connErr)
}
defer conn.Close()
log.Println("create new email client")
client, clientErr := smtp.NewClient(conn, serverAddr)
if clientErr != nil {
log.Panic(clientErr)
}
defer client.Close()
log.Println("setup authenticate credential")
auth := smtp.PlainAuth("", emailAddr, password, serverAddr)
if err := client.Auth(auth); err != nil {
log.Panic(err)
}
log.Println("Start write mail content")
log.Println("Set 'FROM'")
if err := client.Mail(emailAddr); err != nil {
log.Panic(err)
}
log.Println("Set 'TO(s)'")
for _, to := range tos {
if err := client.Rcpt(to); err != nil {
log.Panic(err)
}
}
writer, writerErr := client.Data()
if writerErr != nil {
log.Panic(writerErr)
}
//basic email headers
sampleMsg := fmt.Sprintf("From: %s\r\n", emailAddr)
sampleMsg += fmt.Sprintf("To: %s\r\n", strings.Join(tos, ";"))
if len(cc) > 0 {
sampleMsg += fmt.Sprintf("Cc: %s\r\n", strings.Join(cc, ";"))
}
sampleMsg += fmt.Sprintf("Subject: %s\r\n", "Golang example send mail in HTML format")
//enable HTML format message
sampleMsg += "Mime-Version: 1.0\r\n"
sampleMsg += "Content-Type: text/html; charset=\"utf-8\""
sampleMsg += "Content-Transfer-Encoding: 7bit"
//email message
sampleMsg += fmt.Sprintf("\r\n%s", "<html><body><h1>Hi There</h1>"+
"<p>this is sample email sent via golang program</p></body></html>")
log.Println("Write content into client writter I/O")
if _, err := writer.Write([]byte(sampleMsg)); err != nil {
log.Panic(err)
}
if closeErr := writer.Close(); closeErr != nil {
log.Panic(closeErr)
}
client.Quit()
log.Print("done.")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment