mailsrv/main.go

90 lines
2.1 KiB
Go

package main
import (
"io/fs"
"os"
cfg "mailsrv/config"
srv "mailsrv/services"
"github.com/alecthomas/kingpin/v2"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
ini "gopkg.in/ini.v1"
)
const (
DefaultOutboxPath string = "outbox"
DefaultPermissions fs.FileMode = 0750
)
var iniPath = kingpin.Arg("ini", ".ini file path").Required().String()
func LoadIni(iniPath string) (*ini.File, error) {
iniFile, err := ini.Load(iniPath)
if err != nil {
return nil, err
}
return iniFile, nil
}
// LoadSMTPConfig collects mandatory SMTP parameters to send an e-mail from the `.ini` file
func LoadSMTPConfig(iniFile *ini.File) (cfg.SMTPConfig, error) {
var config cfg.SMTPConfig
section := iniFile.Section("server")
config, err := cfg.NewSMTPConfig(
section.Key("username").String(),
section.Key("password").String(),
section.Key("url").String(),
section.Key("port").String(),
)
if err != nil {
return config, err
}
return config, nil
}
// GetOutBoxPath tries to get the outbox path from the `.ini` file and creates the directory
// if the path does not exist, create a default one: `outbox` next to the binary
func GetOutboxPath(iniFile *ini.File) (string, error) {
outboxPath := iniFile.Section("service").Key("outbox_path").String()
if outboxPath == "" {
outboxPath = DefaultOutboxPath
}
if err := os.MkdirAll(outboxPath, DefaultPermissions); err != nil && !os.IsExist(err) {
return "", err
}
return outboxPath, nil
}
func main() {
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
log.Logger = log.With().Caller().Logger().Output(zerolog.ConsoleWriter{Out: os.Stderr})
kingpin.Parse()
iniFile, err := LoadIni(*iniPath)
if err != nil {
log.Fatal().AnErr("err", err).Msg("unable to load the .ini configuration file")
}
config, err := LoadSMTPConfig(iniFile)
if err != nil {
log.Fatal().AnErr("err", err).Msg("unable to load the SMTP configuration")
}
outboxPath, err := GetOutboxPath(iniFile)
if err != nil {
log.Fatal().AnErr("err", err).Msg("unable to retrieve outputbox path")
return
}
sender := srv.NewSender(config, outboxPath)
sender.Run()
}