2
0
forked from drew/smtprelay

Allow config to have multiple remotes.

This will enable development teams to test emails from
a system like mailcatcher while also having the email
delivered to the indented mailbox.
This commit is contained in:
Mark Gardner
2022-02-25 07:37:12 -06:00
parent 4f1148d77b
commit 4221919689
8 changed files with 239 additions and 112 deletions

63
main.go
View File

@@ -161,11 +161,10 @@ func mailHandler(peer smtpd.Peer, env smtpd.Envelope) error {
"from": env.Sender,
"to": env.Recipients,
"peer": peerIP,
"host": *remoteHost,
"uuid": generateUUID(),
})
if *remoteHost == "" && *command == "" {
if *remotesStr == "" && *command == "" {
logger.Warning("no remote_host or command set; discarding mail")
return nil
}
@@ -192,50 +191,40 @@ func mailHandler(peer smtpd.Peer, env smtpd.Envelope) error {
cmdLogger.Info("pipe command successful: " + stdout.String())
}
if *remoteHost == "" {
return nil
}
for _, remote := range remotes {
logger = logger.WithField("host", remote.Addr)
logger.Info("delivering mail from peer using smarthost")
logger.Info("delivering mail from peer using smarthost")
err := SendMail(
remote,
env.Sender,
env.Recipients,
env.Data,
)
if err != nil {
var smtpError smtpd.Error
var sender string
switch err := err.(type) {
case *textproto.Error:
smtpError = smtpd.Error{Code: err.Code, Message: err.Msg}
if *remoteSender == "" {
sender = env.Sender
} else {
sender = *remoteSender
}
logger.WithFields(logrus.Fields{
"err_code": err.Code,
"err_msg": err.Msg,
}).Error("delivery failed")
default:
smtpError = smtpd.Error{Code: 554, Message: "Forwarding failed"}
err := SendMail(
*remoteHost,
remoteAuth,
sender,
env.Recipients,
env.Data,
)
if err != nil {
var smtpError smtpd.Error
logger.WithError(err).
Error("delivery failed")
}
switch err.(type) {
case *textproto.Error:
err := err.(*textproto.Error)
smtpError = smtpd.Error{Code: err.Code, Message: err.Msg}
logger.WithFields(logrus.Fields{
"err_code": err.Code,
"err_msg": err.Msg,
}).Error("delivery failed")
default:
smtpError = smtpd.Error{Code: 554, Message: "Forwarding failed"}
logger.WithError(err).
Error("delivery failed")
return smtpError
}
return smtpError
logger.Debug("delivery successful")
}
logger.Debug("delivery successful")
return nil
}