105 lines
2.5 KiB
Go
105 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
|
|
cfg "mailsrv/config"
|
|
srv "mailsrv/services"
|
|
|
|
"github.com/go-kit/kit/log"
|
|
"github.com/go-kit/kit/log/level"
|
|
ini "gopkg.in/ini.v1"
|
|
)
|
|
|
|
const (
|
|
DefaultOutboxPath string = "outbox"
|
|
)
|
|
|
|
// simply collects binary arguments
|
|
func GetConfigPath() (string, error) {
|
|
switch len(os.Args) {
|
|
case 1:
|
|
return "", errors.New("mailsrv must have .ini config file as first parameter")
|
|
case 2:
|
|
return os.Args[1], nil
|
|
default:
|
|
return "", errors.New("mailsrv must only have one parameter: .ini path file")
|
|
}
|
|
}
|
|
|
|
func LoadIni() (*ini.File, error) {
|
|
configPath, err := GetConfigPath()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("unable to get the .ini config path err=%v", err)
|
|
}
|
|
|
|
ini, err := ini.Load(configPath)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("unable to load the .ini config path err=%v", err)
|
|
}
|
|
|
|
return ini, nil
|
|
}
|
|
|
|
// 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, fmt.Errorf("failed to load the SMTP configuration err=%v", err)
|
|
}
|
|
|
|
return config, nil
|
|
}
|
|
|
|
// 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, 0750); err != nil && !os.IsExist(err) {
|
|
return "", err
|
|
}
|
|
|
|
return outboxPath, nil
|
|
}
|
|
|
|
func main() {
|
|
var logger log.Logger
|
|
logger = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
|
|
logger = log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller, "service", "mailsrv")
|
|
|
|
iniFile, err := LoadIni()
|
|
if err != nil {
|
|
level.Error(logger).Log("msg", "unable to load the .ini configuration file", "err", err)
|
|
return
|
|
}
|
|
|
|
config, err := LoadSMTPConfig(iniFile)
|
|
if err != nil {
|
|
level.Error(logger).Log("msg", "unable to load the SMTP configuration", "err", err)
|
|
return
|
|
}
|
|
|
|
outboxPath, err := GetOutboxPath(iniFile)
|
|
if err != nil {
|
|
level.Error(logger).Log("msg", "unable to retrieve outputbox path", "err", err)
|
|
return
|
|
}
|
|
|
|
sender := srv.NewSender(logger, config, outboxPath)
|
|
sender.Run()
|
|
}
|