Sending Emails in Go: A Comprehensive Guide

Using the smtp Package

The smtp package is part of the Go standard library, making it easy to get started. To use it, you’ll need to import the following packages:

import (
    "crypto/tls"
    "fmt"
    "log"
    "net/smtp"
)

Next, declare variables for the email’s content:

var (
    from     = "[email protected]"
    password = "your-password"
    to       = "[email protected]"
    host     = "smtp.gmail.com"
    port     = 587
    subject  = "Test Email"
    body     = "This is a test email sent using Go."
)

Create a map to combine the email’s data:

headerMap := map[string]string{
    "From":    from,
    "To":      to,
    "Subject": subject,
}

Use the PlainAuth method to authenticate the email:

auth := smtp.PlainAuth("", from, password, host)

Set up the TLS configuration and dial a connection:

tlsConfig := &tls.Config{ServerName: host}
conn, err := tls.Dial("tcp", fmt.Sprintf("%s:%d", host, port), tlsConfig)
if err!= nil {
    log.Fatal(err)
}

Create a client instance and authenticate:

client, err := smtp.NewClient(conn, host)
if err!= nil {
    log.Fatal(err)
}
if err := client.Auth(auth); err!= nil {
    log.Fatal(err)
}

Finally, write the email to the client and close the connection:

writer, err := client.Data()
if err!= nil {
    log.Fatal(err)
}
_, err = writer.Write([]byte(body))
if err!= nil {
    log.Fatal(err)
}
err = writer.Close()
if err!= nil {
    log.Fatal(err)
}
err = client.Quit()
if err!= nil {
    log.Fatal(err)
}

Using the email Package

The email package is a third-party library that provides a simpler way to send emails. To use it, install the package using the following command:

go get github.com/jordan-wright/email

Import the package:

import (
    "github.com/jordan-wright/email"
    "fmt"
    "log"
)

Declare variables for the email’s content:

var (
    from     = "[email protected]"
    password = "your-password"
    to       = "[email protected]"
    host     = "smtp.gmail.com"
    port     = 587
    subject  = "Test Email"
    body     = "This is a test email sent using Go."
)

Create an email instance:

e := email.NewEmail()
e.From = from
e.To = []string{to}
e.Subject = subject
e.Text = []byte(body)

Send the email:

err := e.Send(fmt.Sprintf("%s:%d", host, port), smtp.PlainAuth("", from, password, host))
if err!= nil {
    log.Fatal(err)
}

Comparison

Package Pros Cons
smtp Built-in, customizable Complex, requires manual authentication
email Simple, easy to use Third-party dependency, less customizable

Choose the smtp package if you need more control over the email sending process or want to avoid third-party dependencies. Choose the email package if you want a simple and easy-to-use solution for sending emails.

Leave a Reply