GoBlog/pkgs/mocksmtp/mocksmtp.go

65 lines
1.4 KiB
Go

// This package contains code to mock an SMTP server and test mail sending.
package mocksmtp
import (
"log"
"net"
"strconv"
"github.com/emersion/go-smtp"
)
// Start a mock SMTP server on a random port
//
// Returns:
// port: the port the server is listening on,
// receivedValues: struct to read the received values like username, password, data,
// cancelFunc: function to stop the server,
// err: something went wrong
func StartMockSMTPServer() (port int, receivedValues *ReceivedValues, cancelFunc func(), err error) {
// Start server on random port
mockSmtpServer, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
return 0, nil, nil, err
}
// Get port from listener
_, portStr, err := net.SplitHostPort(mockSmtpServer.Addr().String())
if err != nil {
return 0, nil, nil, err
}
port, err = strconv.Atoi(portStr)
if err != nil {
return 0, nil, nil, err
}
// Define received values
receivedValues = &ReceivedValues{}
// Init SMTP server
s := smtp.NewServer(&backend{
values: receivedValues,
})
s.Addr = mockSmtpServer.Addr().String()
s.Domain = "127.0.0.1"
s.AllowInsecureAuth = true
// Start SMTP server
go func() {
if err := s.Serve(mockSmtpServer); err != nil {
log.Fatal(err)
}
}()
// Create cancel function
cancelFunc = func() {
_ = s.Close()
}
// Return port and function
return port, receivedValues, cancelFunc, nil
}