Introduzione a Gomail

Gomail è un pacchetto semplice ed efficiente per inviare email in Golang. È stato ampiamente testato e documentato.

Gomail può inviare email solo utilizzando server SMTP. Tuttavia, l'API è flessibile e può facilmente implementare metodi come l'utilizzo di Postfix locale, API, ecc., per inviare email.

Utilizza gopkg.in per il controllo delle versioni, quindi non ci saranno cambiamenti incompatibili all'interno di ciascuna versione.

Richiede l'uso di Go 1.2 o una versione successiva. In Go 1.5, le dipendenze esterne non verranno utilizzate.

Caratteristiche di Gomail

Gomail supporta le seguenti funzionalità:

  • Allegati
  • Immagini inline
  • Modelli HTML e di testo
  • Codifica automatica dei caratteri speciali
  • SSL e TLS
  • Invio di email multiple utilizzando la stessa connessione SMTP

Installazione

go get gopkg.in/gomail.v2

Esempio

m := gomail.NewMessage()
m.SetHeader("From", "[email protected]")
m.SetHeader("To", "[email protected]", "[email protected]")
m.SetAddressHeader("Cc", "[email protected]", "Dan")
m.SetHeader("Subject", "Ciao!")
m.SetBody("text/html", "Ciao <b>Bob</b> e <i>Cora</i>!")
m.Attach("/home/Alex/lolcat.jpg")

d := gomail.NewDialer("smtp.example.com", 587, "utente", "123456")

// Invia un'email a Bob, Cora e Dan.
if err := d.DialAndSend(m); err != nil {
    panic(err)
}

Esempio (Daemon)

Un demone che ascolta un canale e invia tutti i messaggi ricevuti.

ch := make(chan *gomail.Message)

go func() {
    d := gomail.NewDialer("smtp.example.com", 587, "utente", "123456")

    var s gomail.SendCloser
    var err error
    open := false
    for {
        select {
        case m, ok := <-ch:
            if !ok {
                return
            }
            if !open {
                if s, err = d.Dial(); err != nil {
                    panic(err)
                }
                open = true
            }
            if err := gomail.Send(s, m); err != nil {
                log.Print(err)
            }
        // Chiudi la connessione al server SMTP se nessuna email è stata inviata negli ultimi 30 secondi.
        case <-time.After(30 * time.Second):
            if open {
                if err := s.Close(); err != nil {
                    panic(err)
                }
                open = false
            }
        }
    }
}()

// Invia email utilizzando questo canale nel tuo programma.

// Chiudi il canale per interrompere il demone delle email.
close(ch)

Esempio (Iscrizione Email)

Inviare in modo efficace iscrizioni email personalizzate a un gruppo di destinatari.

// Elenco dei destinatari.
var list []struct {
    Nome    string
    Indirizzo string
}

d := gomail.NewDialer("smtp.example.com", 587, "utente", "123456")
s, err := d.Dial()
if err != nil {
    panic(err)
}

m := gomail.NewMessage()
for _, r := range list {
    m.SetHeader("From", "[email protected]")
    m.SetAddressHeader("To", r.Indirizzo, r.Nome)
    m.SetHeader("Subject", "Newsletter #1")
    m.SetBody("text/html", fmt.Sprintf("Ciao %s!", r.Nome))

    if err := gomail.Send(s, m); err != nil {
        log.Printf("Impossibile inviare email a %q: %v", r.Indirizzo, err)
    }
    m.Reset()
}

Esempio (Nessuna autenticazione)

Invia email utilizzando un server SMTP locale.

m := gomail.NewMessage()
m.SetHeader("From", "[email protected]")
m.SetHeader("To", "[email protected]")
m.SetHeader("Subject", "Ciao!")
m.SetBody("text/plain", "Ciao!")

d := gomail.Dialer{Host: "localhost", Port: 587}
if err := d.DialAndSend(m); err != nil {
    panic(err)
}

Esempio (No SMTP)

Invia email usando API o postfix.

m := gomail.NewMessage()
m.SetHeader("From", "[email protected]")
m.SetHeader("To", "[email protected]")
m.SetHeader("Subject", "Ciao!")
m.SetBody("text/plain", "Ciao!")

s := gomail.SendFunc(func(from string, to []string, msg io.WriterTo) error {
    // Implementa la tua funzione di invio email chiamando un'API o eseguendo postfix, ecc.
    fmt.Println("Da:", from)
    fmt.Println("A:", to)
    return nil
})

if err := gomail.Send(s, m); err != nil {
    panic(err)
}

Domande frequenti

x509: certificato firmato da un'autorità sconosciuta

Se riscontri questo errore, significa che il client che esegue Gomail considera il certificato utilizzato dal server SMTP come non valido. Come soluzione temporanea, puoi evitare la convalida della catena di certificati del server e dell'hostname utilizzando SetTLSConfig:

package main

import (
	"crypto/tls"
	
	"gopkg.in/gomail.v2"
)

func main() {
	d := gomail.NewDialer("smtp.example.com", 587, "utente", "123456")
	d.TLSConfig = &tls.Config{InsecureSkipVerify: true}

    // Usa d per inviare email.
}

Tuttavia, si prega di notare che ciò è insicuro e non dovrebbe essere utilizzato in un ambiente di produzione.