mirror of
https://github.com/decke/smtprelay.git
synced 2025-12-25 07:43:06 -07:00
Merge pull request #52 from Coronon/master
add: basic smtpd configuration options
This commit is contained in:
48
config.go
48
config.go
@@ -6,6 +6,7 @@ import (
|
|||||||
"net/smtp"
|
"net/smtp"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/vharitonsky/iniflags"
|
"github.com/vharitonsky/iniflags"
|
||||||
@@ -27,6 +28,15 @@ var (
|
|||||||
localCert = flag.String("local_cert", "", "SSL certificate for STARTTLS/TLS")
|
localCert = flag.String("local_cert", "", "SSL certificate for STARTTLS/TLS")
|
||||||
localKey = flag.String("local_key", "", "SSL private key for STARTTLS/TLS")
|
localKey = flag.String("local_key", "", "SSL private key for STARTTLS/TLS")
|
||||||
localForceTLS = flag.Bool("local_forcetls", false, "Force STARTTLS (needs local_cert and local_key)")
|
localForceTLS = flag.Bool("local_forcetls", false, "Force STARTTLS (needs local_cert and local_key)")
|
||||||
|
readTimeoutStr = flag.String("read_timeout", "60s", "Socket timeout for read operations")
|
||||||
|
readTimeout time.Duration
|
||||||
|
writeTimeoutStr = flag.String("write_timeout", "60s", "Socket timeout for write operations")
|
||||||
|
writeTimeout time.Duration
|
||||||
|
dataTimeoutStr = flag.String("data_timeout", "5m", "Socket timeout for DATA command")
|
||||||
|
dataTimeout time.Duration
|
||||||
|
maxConnections = flag.Int("max_connections", 100, "Max concurrent connections, use -1 to disable")
|
||||||
|
maxMessageSize = flag.Int("max_message_size", 10240000, "Max message size in bytes")
|
||||||
|
maxRecipients = flag.Int("max_recipients", 100, "Max RCPT TO calls for each envelope")
|
||||||
allowedNetsStr = flag.String("allowed_nets", "127.0.0.0/8 ::1/128", "Networks allowed to send mails")
|
allowedNetsStr = flag.String("allowed_nets", "127.0.0.0/8 ::1/128", "Networks allowed to send mails")
|
||||||
allowedNets = []*net.IPNet{}
|
allowedNets = []*net.IPNet{}
|
||||||
allowedSenderStr = flag.String("allowed_sender", "", "Regular expression for valid FROM EMail addresses")
|
allowedSenderStr = flag.String("allowed_sender", "", "Regular expression for valid FROM EMail addresses")
|
||||||
@@ -168,6 +178,43 @@ func setupListeners() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setupTimeouts() {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
readTimeout, err = time.ParseDuration(*readTimeoutStr)
|
||||||
|
if err != nil {
|
||||||
|
log.WithField("read_timeout", *readTimeoutStr).
|
||||||
|
WithError(err).
|
||||||
|
Fatal("read_timeout duration string invalid")
|
||||||
|
}
|
||||||
|
if readTimeout.Seconds() < 1 {
|
||||||
|
log.WithField("read_timeout", *readTimeoutStr).
|
||||||
|
Fatal("read_timeout less than one second")
|
||||||
|
}
|
||||||
|
|
||||||
|
writeTimeout, err = time.ParseDuration(*writeTimeoutStr)
|
||||||
|
if err != nil {
|
||||||
|
log.WithField("write_timeout", *writeTimeoutStr).
|
||||||
|
WithError(err).
|
||||||
|
Fatal("write_timeout duration string invalid")
|
||||||
|
}
|
||||||
|
if writeTimeout.Seconds() < 1 {
|
||||||
|
log.WithField("write_timeout", *writeTimeoutStr).
|
||||||
|
Fatal("write_timeout less than one second")
|
||||||
|
}
|
||||||
|
|
||||||
|
dataTimeout, err = time.ParseDuration(*dataTimeoutStr)
|
||||||
|
if err != nil {
|
||||||
|
log.WithField("data_timeout", *dataTimeoutStr).
|
||||||
|
WithError(err).
|
||||||
|
Fatal("data_timeout duration string invalid")
|
||||||
|
}
|
||||||
|
if dataTimeout.Seconds() < 1 {
|
||||||
|
log.WithField("data_timeout", *dataTimeoutStr).
|
||||||
|
Fatal("data_timeout less than one second")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func ConfigLoad() {
|
func ConfigLoad() {
|
||||||
iniflags.Parse()
|
iniflags.Parse()
|
||||||
|
|
||||||
@@ -182,4 +229,5 @@ func ConfigLoad() {
|
|||||||
setupAllowedPatterns()
|
setupAllowedPatterns()
|
||||||
setupRemoteAuth()
|
setupRemoteAuth()
|
||||||
setupListeners()
|
setupListeners()
|
||||||
|
setupTimeouts()
|
||||||
}
|
}
|
||||||
|
|||||||
6
main.go
6
main.go
@@ -320,6 +320,12 @@ func main() {
|
|||||||
server := &smtpd.Server{
|
server := &smtpd.Server{
|
||||||
Hostname: *hostName,
|
Hostname: *hostName,
|
||||||
WelcomeMessage: *welcomeMsg,
|
WelcomeMessage: *welcomeMsg,
|
||||||
|
ReadTimeout: readTimeout,
|
||||||
|
WriteTimeout: writeTimeout,
|
||||||
|
DataTimeout: dataTimeout,
|
||||||
|
MaxConnections: *maxConnections,
|
||||||
|
MaxMessageSize: *maxMessageSize,
|
||||||
|
MaxRecipients: *maxRecipients,
|
||||||
ConnectionChecker: connectionChecker,
|
ConnectionChecker: connectionChecker,
|
||||||
SenderChecker: senderChecker,
|
SenderChecker: senderChecker,
|
||||||
RecipientChecker: recipientChecker,
|
RecipientChecker: recipientChecker,
|
||||||
|
|||||||
@@ -30,6 +30,33 @@
|
|||||||
; accepting mails from client.
|
; accepting mails from client.
|
||||||
;local_forcetls = false
|
;local_forcetls = false
|
||||||
|
|
||||||
|
; Socket timeout for read operations
|
||||||
|
; Duration string as sequence of decimal numbers,
|
||||||
|
; each with optional fraction and a unit suffix.
|
||||||
|
; Valid time units are "ns", "us", "ms", "s", "m", "h".
|
||||||
|
;read_timeout = 60s
|
||||||
|
|
||||||
|
; Socket timeout for write operations
|
||||||
|
; Duration string as sequence of decimal numbers,
|
||||||
|
; each with optional fraction and a unit suffix.
|
||||||
|
; Valid time units are "ns", "us", "ms", "s", "m", "h".
|
||||||
|
;write_timeout = 60s
|
||||||
|
|
||||||
|
; Socket timeout for DATA command
|
||||||
|
; Duration string as sequence of decimal numbers,
|
||||||
|
; each with optional fraction and a unit suffix.
|
||||||
|
; Valid time units are "ns", "us", "ms", "s", "m", "h".
|
||||||
|
;data_timeout = 5m
|
||||||
|
|
||||||
|
; Max concurrent connections, use -1 to disable
|
||||||
|
;max_connections = 100
|
||||||
|
|
||||||
|
; Max message size in bytes
|
||||||
|
;max_message_size = 10240000
|
||||||
|
|
||||||
|
; Max RCPT TO calls for each envelope
|
||||||
|
;max_recipients = 100
|
||||||
|
|
||||||
; Networks that are allowed to send mails to us
|
; Networks that are allowed to send mails to us
|
||||||
; Defaults to localhost. If set to "", then any address is allowed.
|
; Defaults to localhost. If set to "", then any address is allowed.
|
||||||
;allowed_nets = 127.0.0.0/8 ::1/128
|
;allowed_nets = 127.0.0.0/8 ::1/128
|
||||||
@@ -83,4 +110,4 @@
|
|||||||
;remote_sender =
|
;remote_sender =
|
||||||
|
|
||||||
; Pipe messages to external command
|
; Pipe messages to external command
|
||||||
;command = /usr/local/bin/script
|
;command = /usr/local/bin/script
|
||||||
|
|||||||
Reference in New Issue
Block a user