2021-11-08 13:32:02 +00:00
|
|
|
// This package contains code to mock an SMTP server and test mail sending.
|
|
|
|
|
|
|
|
package mocksmtp
|
|
|
|
|
|
|
|
import (
|
2021-11-08 15:27:33 +00:00
|
|
|
"log"
|
2021-11-08 13:32:02 +00:00
|
|
|
"net"
|
|
|
|
"strconv"
|
|
|
|
|
2021-11-08 15:27:33 +00:00
|
|
|
"github.com/emersion/go-smtp"
|
|
|
|
)
|
2021-11-08 13:32:02 +00:00
|
|
|
|
2021-11-08 15:27:33 +00:00
|
|
|
// 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) {
|
2021-11-08 13:32:02 +00:00
|
|
|
|
|
|
|
// Start server on random port
|
|
|
|
mockSmtpServer, err := net.Listen("tcp", "127.0.0.1:0")
|
|
|
|
if err != nil {
|
2021-11-08 15:27:33 +00:00
|
|
|
return 0, nil, nil, err
|
2021-11-08 13:32:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Get port from listener
|
|
|
|
_, portStr, err := net.SplitHostPort(mockSmtpServer.Addr().String())
|
|
|
|
if err != nil {
|
2021-11-08 15:27:33 +00:00
|
|
|
return 0, nil, nil, err
|
2021-11-08 13:32:02 +00:00
|
|
|
}
|
|
|
|
port, err = strconv.Atoi(portStr)
|
|
|
|
if err != nil {
|
2021-11-08 15:27:33 +00:00
|
|
|
return 0, nil, nil, err
|
2021-11-08 13:32:02 +00:00
|
|
|
}
|
|
|
|
|
2021-11-08 15:27:33 +00:00
|
|
|
// Define received values
|
|
|
|
receivedValues = &ReceivedValues{}
|
2021-11-08 13:32:02 +00:00
|
|
|
|
2021-11-08 15:27:33 +00:00
|
|
|
// Init SMTP server
|
|
|
|
s := smtp.NewServer(&backend{
|
|
|
|
values: receivedValues,
|
|
|
|
})
|
|
|
|
s.Addr = mockSmtpServer.Addr().String()
|
|
|
|
s.Domain = "127.0.0.1"
|
|
|
|
s.AllowInsecureAuth = true
|
2021-11-08 13:32:02 +00:00
|
|
|
|
2021-11-08 15:27:33 +00:00
|
|
|
// Start SMTP server
|
|
|
|
go func() {
|
|
|
|
if err := s.Serve(mockSmtpServer); err != nil {
|
|
|
|
log.Fatal(err)
|
2021-11-08 13:32:02 +00:00
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
2021-11-08 15:27:33 +00:00
|
|
|
// Create cancel function
|
|
|
|
cancelFunc = func() {
|
|
|
|
_ = s.Close()
|
2021-11-08 13:32:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Return port and function
|
2021-11-08 15:27:33 +00:00
|
|
|
return port, receivedValues, cancelFunc, nil
|
|
|
|
|
2021-11-08 13:32:02 +00:00
|
|
|
}
|