Il protocollo Simple Mail Transfer Protocol (SMTP) è fondamentale per l'invio di email. Implementare un server SMTP personalizzato può essere utile per comprendere meglio come funziona il protocollo e per sviluppare applicazioni su misura. In questo articolo, esploreremo come creare un server SMTP di base utilizzando il linguaggio di programmazione Go.
Go fornisce una libreria standard ricca di funzionalità, ma per un server SMTP, useremo una libreria esterna chiamata go-smtp, che semplifica la gestione di un server SMTP.
go get github.com/emersion/go-smtp
Inizia importando i pacchetti standard di Go e la libreria go-smtp:
package main
import (
"fmt"
"log"
"net"
"github.com/emersion/go-smtp"
)
Il gestore (handler) è una struttura che implementa l'interfaccia smtp.Backend. Questo è il punto in cui si definisce come gestire i messaggi ricevuti.
type EmailHandler struct {}
func (e *EmailHandler) Login(state *smtp.ConnectionState, username, password string) (smtp.Session, error) {
return nil, smtp.ErrAuthUnsupported
}
func (e *EmailHandler) AnonymousLogin(state *smtp.ConnectionState) (smtp.Session, error) {
return &Session{}, nil
}
// Implementazione della sessione SMTP
type Session struct {}
func (s *Session) Mail(from string, opts smtp.MailOptions) error {
log.Printf("Email ricevuta da: %s", from)
return nil
}
func (s *Session) Rcpt(to string) error {
log.Printf("Destinatario: %s", to)
return nil
}
func (s *Session) Data(r io.Reader) error {
buf := new(bytes.Buffer)
buf.ReadFrom(r)
log.Printf("Contenuto email: %s", buf.String())
return nil
}
func (s *Session) Reset() {}
func (s *Session) Logout() error { return nil }
func (e *EmailHandler) NewSession(state *smtp.ConnectionState) (smtp.Session, error) {
return &Session{}, nil
}
Una volta definito il gestore, possiamo configurare e avviare il server SMTP.
func main() {
handler := &EmailHandler{}
// Configura il server
server := smtp.NewServer(handler)
server.Addr = ":2525"
server.Domain = "localhost"
server.AllowInsecureAuth = true
// Avvia il server
log.Printf("Avvio del server SMTP sulla porta %s", server.Addr)
if err := server.ListenAndServe(); err != nil {
log.Fatal(err)
}
}
Conclusione
Abbiamo creato un server SMTP di base con Go, che può ricevere email e gestire mittenti e destinatari. Questo server è una base su cui è possibile costruire funzionalità più avanzate, come l’autenticazione, il supporto TLS o l’integrazione con un sistema di archiviazione. Approfondire il funzionamento del protocollo SMTP e la libreria go-smtp ti permetterà di realizzare soluzioni personalizzate per le tue esigenze.