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" ) // GetConfigPath 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 } // 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, fmt.Errorf("failed to load the SMTP configuration err=%v", 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, 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() }