sendmail

package module
v0.0.0-...-60bd89b Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 28, 2025 License: MIT Imports: 16 Imported by: 0

README

go-sendmail

Summary

go-sendmail is a wrapper to mail service libraries.

Overview

Each mail service requires registration, which includes configuring the domain's DNS for the specific service using a combination of CNAME & TXT additions.

Some of the services also require a knowledge of who is allowed to send emails from the domain, which helps restrict access.

Restricting the use of a domain in the 'from' email clause makes sense because libraries are generally intended to be part of an automated process, rather than originating from multiple users within a domain.

Features
  • sendmail interface: Common interface to all mailclients
  • Cache: Reuses the client instance across the application
  • MessageBuilder: Provide a builder pattern to build messasges
  • stopwatch: Auto stopwatch each message posted
  • Log override: Provides logging override. The default logging is slog
Wrappers provided for
Install
go get github.com/malcolm-davis/go-sendmail
Usage
Basic
package main

import (
    "log/slog"
    "os"
    "time"

    "github.com/malcolm-davis/go-sendmail"
)

func main() {
    // Create a new stopwatch and start it
    send, err := sendmail.NewSendGrid(os.Getenv("SENDGRID_API_KEY"))
    if(err!=nil) {
        slog.Error("Error connecting to sendgrid service", err)
    }

    respnse, err := send.SendMail("From User", "test@example.com" "To User", "to@example.com")  "Sending with Twilio SendGrid is Fun",
         "and easy to do anywhere, even with Go", "<strong>and easy to do anywhere, even with Go</strong>") 
    if(err!=nil) {
        slog.Error("Error sending message", err)
    }
}
Message Builder
package main

import (
    "log/slog"
    "os"
    "time"

    "github.com/malcolm-davis/go-sendmail"
)

func main() {
    fmt.Println("Starting mailjet example")
    fmt.Println("Make sure to set MAILJET_APIKEY and MAILJET_SECRETKEY environment variables")
    send, err := sendmail.NewMailJetMailManager(os.Getenv("MAILJET_API_KEY"), os.Getenv("MAILJET_SECRET_KEY"))
    if err != nil {
        slog.Error("Error connecting to mailjet service", "error", err)
        return
    }

    messageBuilder := sendmail.NewEmailMessage()

    // Note: the from email address requires authentication in MailJet
    messageBuilder.FromEmail("do-not-reply", "do-not-reply@example.dev")
    messageBuilder.AddRecipient("name", "user@example.com")
    messageBuilder.AddRecipient("name 2", "user2@example.com")
    messageBuilder.Subject("contact us email")
    messageBuilder.PlainTextContent("Test mailjet")
    messageBuilder.HtmlContent("<strong>and easy to do anywhere, even with Go</strong>")

    message, err := messageBuilder.Build()
    if err != nil {
        slog.Error("Error building message", "error", err)
        return
    }
    response, err := send.SendMessage(message)
    if err != nil {
        slog.Error("Error sending message", "error", err)
        return
    }

    // if the response is successful, print the status code 200
    // however, if the from email address is not a verified domain in mailjet, a 200 will be returned, but no mail delivery will occur
    fmt.Println("response.StatusCode", response.StatusCode)
}
smtp2go
package main

import (
    "fmt"
    "log/slog"
    "os"

    "github.com/malcolm-davis/go-sendmail"
)

func main() {
    fmt.Println("Starting smtp2go example")
    fmt.Println("Make sure to set SMTP2GO_API_KEY")
    send, err := sendmail.NewSmtp2go()
    if err != nil {
        slog.Error("Error connecting to smtp2go service", "error", err)
        return
    }

    messageBuilder := sendmail.NewEmailMessage()

    // Note: the from email address requires authentication in Smtp2go
    messageBuilder.FromEmail("do-not-reply", "do-not-reply@example.com")
    messageBuilder.AddRecipient("user", "user@example.com")
    messageBuilder.Subject("contact us email")
    messageBuilder.PlainTextContent("Test smtp2go")
    messageBuilder.HtmlContent("<strong>and easy to do anywhere, even with Go</strong>")

    message, err := messageBuilder.Build()
    if err != nil {
        slog.Error("Error building message", "error", err)
        return
    }
    response, err := send.SendMessage(message)
    if err != nil {
        slog.Error("Error sending message", "error", err)
        return
    }

    // if the response is successful, print the status code 200
    // however, if the from email address is not a verified domain in mailjet, a 200 will be returned, but no mail delivery will occur
    fmt.Println("response.StatusCode", response.StatusCode)

}
Message Builder
package main

import (
    "log/slog"
    "os"
    "time"

    "github.com/malcolm-davis/go-sendmail"
)

func main() {
    fmt.Println("Starting mailjet example")
    fmt.Println("Make sure to set MAILJET_APIKEY and MAILJET_SECRETKEY environment variables")
    send, err := sendmail.NewMailJet(os.Getenv("MAILJET_API_KEY"), os.Getenv("MAILJET_SECRET_KEY"))
    if err != nil {
        slog.Error("Error connecting to mailjet service", "error", err)
        return
    }

    messageBuilder := sendmail.NewEmailMessage()

    // Note: the from email address requires authentication in MailJet
    messageBuilder.FromEmail("do-not-reply", "do-not-reply@example.dev")
    messageBuilder.AddRecipient("name", "user@example.com")
    messageBuilder.AddRecipient("name 2", "user2@example.com")
    messageBuilder.Subject("contact us email")
    messageBuilder.PlainTextContent("Test mailjet")
    messageBuilder.HtmlContent("<strong>and easy to do anywhere, even with Go</strong>")

    message, err := messageBuilder.Build()
    if err != nil {
        slog.Error("Error building message", "error", err)
        return
    }
    response, err := send.SendMessage(message)
    if err != nil {
        slog.Error("Error sending message", "error", err)
        return
    }

    // if the response is successful, print the status code 200
    // however, if the from email address is not a verified domain in mailjet, a 200 will be returned, but no mail delivery will occur
    fmt.Println("response.StatusCode", response.StatusCode)
}
MailTrap with image and multiple recipients
import (
    "fmt"
    "log/slog"
    "os"

    "github.com/malcolm-davis/go-sendmail"
)

func main() {
    fmt.Println("Make sure you have set the MAILTRAP_API_KEY in an environment variable")

    // Create a new sendmail manager and init
    send, err := sendmail.NewMailTrap(os.Getenv("MAILTRAP_API_KEY"))
    if err != nil {
        slog.Error("Error connecting to sendgrid service", "error", err)
        return
    }

    // Message builder example
    messageBuilder := sendmail.NewEmailMessage()
    messageBuilder.FromEmail("do-not-reply", "do-not-reply@example.dev")
    messageBuilder.AddRecipient("Use ", "user_1@example.com")
    messageBuilder.AddRecipient("User 2", "user_2@example.com")
    messageBuilder.Subject("Transactional email from mailtrap")
    messageBuilder.PlainTextContent("Test go-sendemail mailtrap feature")
    messageBuilder.AddAttachment("image/png", "test.png",
        "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAD1JREFUOI1jYKAQMJKhJxKJvZyJUhewEKEG2ZJ/5BjwF4mN4WWKvUCTMPiPxCYYS4PDCyQ5meouGAYGUAwAmxIFIoTEH0QAAAAASUVORK5CYII=")

    message, err := messageBuilder.Build()
    if err != nil {
        slog.Error("Error building message", "error", err)
        return
    }

    response, err := send.SendMessage(message)
    if err != nil {
        slog.Error("Error sending message", "error", err)
        return
    }
    fmt.Println("response.StatusCode", response.StatusCode)
}

Documentation

Overview

Wrapper to MailerSend Go Library https://github.com/MailerSend/MailerSend-apiv3-go

Wrapper to MailJet Go Library https://github.com/mailjet/mailjet-apiv3-go

There is no golang API provided for mailtrap

Wrapper to SendGrid's Go Library https://github.com/sendgrid/sendgrid-go

Wrapper to Smtp2go Go Library https://github.com/Smtp2go/Smtp2go-apiv3-go

Index

Constants

This section is empty.

Variables

View Source
var ErrMissingFrom = errors.New("sendmail: missing 'from' email address")
View Source
var ErrMissingRecipients = errors.New("sendmail: missing recipient(s) address")
View Source
var ErrMissingSubject = errors.New("sendmail: missing subject")

Functions

This section is empty.

Types

type Attachment

type Attachment struct {
	ContentType   string `json:"type,omitempty"`
	Filename      string `json:"filename,omitempty"`
	Base64Content string `json:"content,omitempty"`
	Disposition   string `json:"disposition,omitempty"`
}

type Email

type Email struct {
	Name    string `json:"name,omitempty"`
	Address string `json:"email,omitempty"`
}

Email holds email name and address info

type MailJetConfig

type MailJetConfig struct {
	APIKey    string
	SecretKey string
}

SendMailConfig holds the API key for MailJet

type MailJetMailManager

type MailJetMailManager struct {
	APIKey    string
	SecretKey string

	// User defined logger function.
	Logger func(string, ...interface{})
	// contains filtered or unexported fields
}

SendMailManager provides functionality to send emails via MailJet

func NewMailJet

func NewMailJet(apiKey string, secretKey string) (*MailJetMailManager, error)

func (*MailJetMailManager) SendMail

func (mj *MailJetMailManager) SendMail(fromName, fromEmail, toName, toEmail, subject, plainTextContent, htmlContent string) (response *Response, err error)

func (*MailJetMailManager) SendMessage

func (mj *MailJetMailManager) SendMessage(message *Message) (response *Response, err error)

type MailTrap

type MailTrap struct {
	// contains filtered or unexported fields
}

MailTrapConfig provides functionality to send emails via mailtrap https://mailtrap.io/blog/golang-send-email/#Send-emails-in-Go-using-email-API

func NewMailTrap

func NewMailTrap(mailTrapKey string) (*MailTrap, error)

func (*MailTrap) SendMail

func (ms *MailTrap) SendMail(fromName, fromEmail, toName, toEmail, subject, plainTextContent, htmlContent string) (response *Response, err error)

func (*MailTrap) SendMessage

func (ms *MailTrap) SendMessage(message *Message) (response *Response, err error)

type MailerSend

type MailerSend struct {

	// override logging using user defined logger function.
	Logger func(string, ...interface{})
	// contains filtered or unexported fields
}

func NewMailerSend

func NewMailerSend(apiToken string) (*MailerSend, error)

func (*MailerSend) SendMail

func (ms *MailerSend) SendMail(fromName, fromEmail, toName, toEmail, subject, plainTextContent, htmlContent string) (response *Response, err error)

func (*MailerSend) SendMessage

func (ms *MailerSend) SendMessage(message *Message) (response *Response, err error)

type Message

type Message struct {
	FromEmail        *Email        `json:"from,omitempty"`
	Recipients       []*Email      `json:"to,omitempty"`
	Subject          string        `json:"subject,omitempty"`
	PlainTextContent string        `json:"text,omitempty"`
	HtmlContent      string        `json:"html,omitempty"`
	Attachments      []*Attachment `json:"attachments,omitempty"`
}

func (*Message) Validate

func (m *Message) Validate() error

type MessageBuilder

type MessageBuilder interface {
	FromEmail(name, address string) MessageBuilder
	AddRecipient(name, address string) MessageBuilder
	Subject(subject string) MessageBuilder
	PlainTextContent(plainTextContent string) MessageBuilder
	HtmlContent(htmlContent string) MessageBuilder
	AddAttachment(contentType, filename, base64Content string, disposition_optional ...string) MessageBuilder
	Build() (*Message, error)
}

func NewEmailMessage

func NewEmailMessage() MessageBuilder

type Response

type Response struct {
	StatusCode int                 // e.g. 200
	Body       string              // e.g. {"result: success"}
	Headers    map[string][]string // e.g. map[X-Ratelimit-Limit:[600]]
}

Response holds the response from an API call.

type SendMail

type SendMail interface {
	// send mail is intended for a single recipient
	SendMail(fromName, fromEmail, toName, toEmail, subject, plainTextContent, htmlContent string) (response *Response, err error)

	// SendMessage allows for more complex email scenarios, including sending emails to multiple recipients and attachments
	SendMessage(message *Message) (response *Response, err error)
}

type Smtp2goMail

type Smtp2goMail struct {
	APIToken string

	// User defined logger function.
	Logger func(string, ...interface{})
}

SendMailManager provides functionality to send emails via Smtp2go

func NewSmtp2go

func NewSmtp2go(smtp2goKey string) (*Smtp2goMail, error)

func (*Smtp2goMail) SendMail

func (ms *Smtp2goMail) SendMail(fromName, fromEmail, toName, toEmail, subject, plainTextContent, htmlContent string) (response *Response, err error)

func (*Smtp2goMail) SendMessage

func (ms *Smtp2goMail) SendMessage(message *Message) (response *Response, err error)

type TrilloSendMail

type TrilloSendMail struct {
	APIKey string

	// User defined logger function.
	Logger func(string, ...interface{})
	// contains filtered or unexported fields
}

SendMailManager provides functionality to send emails via SendGrid

func NewSendGrid

func NewSendGrid(apiKey string) (*TrilloSendMail, error)

NewSendGrid creates a new instance of TrilloSendMail

func (*TrilloSendMail) SendMail

func (t *TrilloSendMail) SendMail(fromName, fromEmail, toName, toEmail, subject, plainTextContent, htmlContent string) (response *Response, err error)

func (*TrilloSendMail) SendMessage

func (t *TrilloSendMail) SendMessage(message *Message) (response *Response, err error)

Directories

Path Synopsis
examples
basic command
mailtrap-demo command
messagebuilder command
overridelog command
smtp2go command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL