postfix and golang - sending emails

A quick list of steps to get a server up and running with postfix and a go script to send emails.

Install postscript #

sudo apt-get install postscript

Select ‘local copy’ as the configuration and accept the defaults.

Configure postscript #

vim /etc/postfix/main.cf

Change the bottom from

inet_interfaces = loopback-only
default_transport = error
relay_transport = error
inet_protocols = all

to

inet_interfaces = all
inet_protocols = all

A go script to send emails #

package main

import (
    "fmt"
    "net/mail"
    "net/smtp"
    "strings"
)

var host = "127.0.0.1"
var port = "25"
var username = ""
var password = ""
var auth = smtp.PlainAuth("", username, password, host)
var addr = host + ":" + port

func main() {
    fromName := "Fred"
    fromEmail := "fred@example.com"
    toNames := []string{"Ted"}
    toEmails := []string{"ted@example.com"}
    subject := "This is the subject of your email"
    body := "This is the body of your email"
    // Build RFC-2822 email
    toAddresses := []string{}
    for i, _ := range toEmails {
        to := mail.Address{toNames[i], toEmails[i]}
        toAddresses = append(toAddresses, to.String())
    }
    toHeader := strings.Join(toAddresses, ", ")
    from := mail.Address{fromName, fromEmail}
    fromHeader := from.String()
    subjectHeader := subject
    header := make(map[string]string)
    header["To"] = toHeader
    header["From"] = fromHeader
    header["Subject"] = subjectHeader
    header["Content-Type"] = `text/html; charset="UTF-8"`
    msg := ""
    for k, v := range header {
        msg += fmt.Sprintf("%s: %s\r\n", k, v)
    }
    msg += "\r\n" + body
    bMsg := []byte(msg)
    // Send using local postfix service
    c, err := smtp.Dial(addr)
    if err != nil {
        return
    }
    defer c.Close()
    if err = c.Mail(fromHeader); err != nil {
        return
    }
    for _, addr := range toEmails {
        if err = c.Rcpt(addr); err != nil {
            return
        }
    }
    w, err := c.Data()
    if err != nil {
        return
    }
    _, err = w.Write(bMsg)
    if err != nil {
        return
    }
    err = w.Close()
    if err != nil {
        return
    }
    err = c.Quit()
    // Or alternatively, send with remote service like Amazon SES
    // err = smtp.SendMail(addr, auth, fromEmail, toEmails, bMsg)
    // Handle response from local postfix or remote service
    if err != nil {
        return
    }
}
 
43
Kudos
 
43
Kudos

Now read this

GUI as an adjective

I’m lucky to currently be working in an office with no other programmers and only graphic designers. I’m used to working with other software developers, which I enjoy because we have a lot of crossover in our day-to-day work. But working... Continue →