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

Block Size, the history of choosing 1MB

The bitcoin block size is 1MB. Why was this number chosen? The reasoning of the past may have application to the reasoning in the present and future. Original Code # The block size is defined in code by MAX_BLOCK_SIZE and is 1000000... Continue →