How to Send Emails in Go Using the Net/SMTP Package

Rate this post
How to Send Emails in Go Using the Net/SMTP Package

You may often need to send emails to many accounts for authentication and other reasons.

The SMTP protocol provides standards for email communication between mail servers and mail transfer agents, while the IMAP protocol is used for email reception.

The net/smtp package in Go includes functionality for email-related operations outlined by the RFC, as well as 8BITMIME, AUTH, and STARTTLS extensions.

This project’s code is published in a GitHub repository and is free to use under the MIT license.

How to Send Emails in Go Using the Net/SMTP Package

You do not need to install any additional packages since the net/smtp package is part of the Go standard library. Before you can use the package, you must first import it.

import (

Import the log package to record errors to the console, as well as the crypto/tls package to build a secure connection.

After importing the net/smtp package, create a SendMail() method to send the email and call it from the main function.

func main() {
func SendMail() string {


The code that sends the email to recipients would be included in the SendMail() method.

How Sending Emails Work

The SMTP protocol specifies the parameters that must be included in every email. These factors include the sender and recipient email addresses, the port over which the email is transmitted, the host server, and the message.

The above-mentioned criteria are critical for sending emails.

This guide will teach you how to send Yahoo emails. However, the procedure is the same regardless of which Mail Server Provider (MSP) you choose.

Because you’re using Yahoo Mail, sign in to your account, go to Account Info, and then select the Account Security option. Then create a password for the app. You’ll need to name the app, and Yahoo Mail will generate a password for it, which you can use in your code along with your email address.

  5 Tips for Writing Long Emails That Recipients Can Read

In the SendMail() method, you’ll declare three variables: one for the text of your email, one for your email password, and one for the email address to whom you’re sending messages.

from := ""
password := "aSecurePasswordHere"
to := ""

If you want to transmit the pieces to numerous receivers, you may use a slice and loop across them.

Getting and Setting the Email Host and Port

The SMTP protocol identifies the email sender by using the host and port numbers. This is where your MSP can help. You must be aware of the host and port numbers that your MSP enables you to utilize.

If you use public email services like as Gmail, Yahoo, or Outlook, see this page for a list of MSP hosts and port numbers. Google has disabled “less secure applications” for Gmail; if you use Gmail, you may wish to encrypt your application.

As soon like you get the port number and host address, assign them to variables as follows:

host := ""
port := "465"

The host and port numbers shown above are from Yahoo Mail and should be used with ordinary accounts. The server is located at, and you may send emails using port 465.

Declaring the Contents of the Email

The next step is to define the email’s contents as variables. The message is made up of the topic and the body.

subject := "Hey, I'm Just Checking On You."
body := "Hope you're doing okay! How are you doing today. "

The topic variable is the email’s subject, and the body variable is the email’s content.

You’ll need to create a string map to represent the email’s headers.

headers := make(map[string]string)
headers["From"] = from
headers["To"] = to
headers["Subject"] = subject
message := ""
for k, v := range headers {
message += fmt.Sprintf("%s: %s\r", k, v)
message += "\r" + body

First, as seen above, you build a map of string keys and values and set the headers of your address, the recipient’s address, and the topic. A message variable is defined using a range for-loop on the headers map to hold the headers and the message using string formatting.

  Don't Fall for This Craigslist Email Recovery Scam!

Authenticating the Email

To validate the source, the email must be authenticated. The smtp package includes support for email authentication through PlainAuth. The PlainAuth function accepts as arguments the identity, sender’s email, password, and host and returns an Auth object that will be used to send the email.

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

The identification is your username, which may be left blank, as seen above.

Creating a Connection for the Email

Some email services require you to transmit the email over a connection. In this post, we’ll establish a TCP connection to the server while using TLS.

tlsConfig := &tls.Config{
InsecureSkipVerify: true,
ServerName: host,

You created a TLS configuration in the preceding code by accessing the Config struct, where InsecureSkipVerify was set to true and the server name was put to the host variable.

You must use the tls package’s Dial function to establish a TCP connection. The dial technique requires the connection type (TCP), server address, and TLS connection parameters.

connection, err := tls.Dial("tcp", serverAddress, tlsConfig) err != nil {

You built a TCP connection and handled problems in the preceding code; you’ll have instantiated a new smtp package using the net/smtp package’s NewClient function. The NewClient method accepts a connection and a host.

smtpClient, err := smtp.NewClient(connection, host)
if err != nil {

You must now configure the settings of the smtpClient and handle problems once you have generated a smtp client instance.

if err = smtpClient.Auth(authenticate); err != nil {
if err = smtpClient.Mail(from); err != nil {
if err = smtpClient.Rcpt(headers["To"]); err != nil {

You supplied the authentication, sender address, and recipient address arguments to their appropriate functions in the preceding example and handled problems.

  How to Change Your Email Address on Instagram

Finally, you must write to the connection instance, which you can accomplish by establishing a writer using your smtp client instance’s Data function.

writer, err := smtpClient.Data()
if err != nil {
_, err = writer.Write([]byte(message))
if err != nil {

After constructing a writer, you use the Write method to write a byte slice of the message, as seen above.

err = writer.Close()
if err != nil {
err = smtpClient.Quit()
if err != nil {
return "Successful, the mail was sent!"

Using the aforementioned code, close the writer and terminate the smtp client connection instance. As illustrated above, the SendMail() method provides a success message.

When you run the SendMail() method in the main function, the success message should be reported to your console and the email should be delivered to your recipient.

There’s More to the Net Package

The net package includes various packages for network-related functionality, including the smtp package. TCP and HTTP packages may also be used for networking development.

If you are not a backend developer, you may find the net/smtp package daunting. There are also additional options for delivering emails rapidly and with fewer lines of code. You may utilize email marketing businesses like SendGrid, Twilio, and MailChimp, as well as newsletter providers like Substack and Revue, to send emails to a large number of people with ease.

You are looking for information, articles, knowledge about the topic How to Send Emails in Go Using the Net/SMTP Package on internet, you do not find the information you need! Here are the best content compiled and compiled by the team, along with other related topics such as: Email.

Similar Posts