The following steps show how to send mail with Go using the standard smtp package. To test I used MailJet as the mail server but you can also use Mandrill or SendGrid.
First let’s setup MailJet as the mail server. Then write the Go code and send a test email.
MailJet Setup
After creating your free MailJet account, you should make sure you complete the 2 steps below (under Account Settings):

- Add a Sender Domain or Address
- Setup SPF/DKIM Authentication
Personally, I found validating an entire domain very convenient. That way I can use the domain for all my projects mail sending requirements. For example:
project-1@mydomain.com
project-2@mydomain.com
…
project-n@mydomain.com
But you don’t have to use a custom domain if you don’t want to. You can add a single sender email address from which the mail will be sent from.
Next, you need to setup an API key and Secret – these will be the username and password in Go code. You can set the API key and Secret under Account Settings:

Go Code
Please make sure you specify the following constants and variables with your own:
- username, password: These are your API key and secret
- host, port: the port should be 587, you can find your host under your account settings:

- from: the email address from which mail will be sent from. I presume you have set this in the steps above under MailJet account settings: Add a Sender Domain or Address, Setup SPF/DKIM Authentication.
- to: you can specify any address that you own for testing. The test email will be sent to this address. I specified my own personal email address which you should replace with your own.
Type the following code in your favorite editor, then run the code in a terminal: go run main.go
package main
import (
"fmt"
"log"
"net/smtp"
"time"
)
func main() {
const (
username = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // your 32 digit API key
password = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // your 32 digit secret
host = "XXX.mailjet.com" // your MailJet host
port = "587" // recommended port for TLS
from = "FROM-EMAIL@YOUR-VALID-DOMAIN.COM" // your validated domain
addr = host + ":" + port
)
to := []string{
"TO-RECIPIENT-EMAIL@DOMAIN.COM",
}
subject := "Test mail using Go with MailJet"
message := fmt.Sprintf(`Subject:%s
Hi,
This is a test message sent with Go and MailJet.
Thanks!
Sent on %v`, subject, time.Now())
auth := smtp.PlainAuth("", username, password, host)
err := smtp.SendMail(addr, auth, from, to, []byte(message))
if err != nil {
log.Println("send mail:", err)
return
}
fmt.Println("mail sent successfully")
}
If you configured everything correctly and ran the code, you should receive an email like the one shown in the screenshot below. I received my test email at my personal Gmail address. My from address was: “test-project@dovetail.one”


Here is a video of the code in action where I configure the code, run it and receive a test mail.