From 08f79e2e0fc6720959d8769135496f6eb5a50b2f Mon Sep 17 00:00:00 2001 From: Blallo Date: Fri, 22 May 2020 16:10:21 +0200 Subject: [PATCH] Add the possibility to send attachments --- config.go | 34 +++++++++++++++++++++++++--------- mail.go | 4 ++++ main.go | 29 ++++++++++++++++++++++++++++- 3 files changed, 57 insertions(+), 10 deletions(-) diff --git a/config.go b/config.go index ee342f5..3a2d7fc 100644 --- a/config.go +++ b/config.go @@ -3,6 +3,7 @@ package main import ( "errors" "fmt" + "os" toml "github.com/pelletier/go-toml" ) @@ -33,18 +34,19 @@ func (s ServerConfig) String() string { } type Config struct { - Server *ServerConfig `toml:server,omitempty` - From string `toml:from,omitempty` - To []string `toml:to,omitempty` - Cc []string `toml:cc,omitempty` - Bcc []string `toml:bcc,omitempty` - Subject string `toml:subject,omitempty` - Text string `toml:text,omitempty` + Server *ServerConfig `toml:server,omitempty` + From string `toml:from,omitempty` + To []string `toml:to,omitempty` + Cc []string `toml:cc,omitempty` + Bcc []string `toml:bcc,omitempty` + Subject string `toml:subject,omitempty` + Text string `toml:text,omitempty` + Attachments []string `toml:attachments,omitempty` } func (c Config) String() string { - return fmt.Sprintf( - "From: %s\nTo: %s\nCc: %s\nBcc: %s\nSubject: %s\nText:\n%s\nServer:\n%s", + msg := fmt.Sprintf( + "From: %s\nTo: %s\nCc: %s\nBcc: %s\nSubject: %s\nText:\n%s\nServer:\n%s\n", c.From, c.To, c.Cc, @@ -53,6 +55,11 @@ func (c Config) String() string { c.Text, c.Server, ) + msg += "Attachments:" + for _, attachment := range c.Attachments { + msg += fmt.Sprintf(" - %s\n", attachment) + } + return msg } func NewConfig() *Config { @@ -118,6 +125,15 @@ func (c *Config) Validate() error { msg += fmt.Sprintf("%s: pass a value either via command line (-%s) or in configuration file section (%s)\n", v.Param, v.CmdFlag, v.ConfFlag) } } + } + if len(c.Attachments) > 0 { + for _, file := range c.Attachments { + if _, err := os.Lstat(file); err != nil { + msg += fmt.Sprintf("Error with attachment: %s -> %s\n", file, err) + } + } + } + if msg != "" { return errors.New(msg) } return nil diff --git a/mail.go b/mail.go index d237a43..1a6b880 100644 --- a/mail.go +++ b/mail.go @@ -19,6 +19,10 @@ func formatMessage(config *Config) *mail.Message { } m.SetHeader("Subject", config.Subject) m.SetBody("text/plain", config.Text) + for _, attachment := range config.Attachments { + Debug.F("Attacching: %s", attachment) + m.Attach(attachment) + } Debug.F("Message to deliver:\n%s", m) return m diff --git a/main.go b/main.go index b6b6e76..dd2c971 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "bufio" + "errors" "flag" "fmt" "os" @@ -12,6 +13,27 @@ import ( var noVersion = "dev" var version string +type attachmentList []string + +func (a *attachmentList) String() string { + var str string + for _, attachment := range *a { + str += fmt.Sprintf("%s\n", attachment) + } + return str +} + +func (a *attachmentList) Set(file string) error { + if _, err := os.Lstat(file); err != nil { + return err + } + if file == "" { + return errors.New("no file provided") + } + *a = append(*a, file) + return nil +} + func readFromConsole(result chan string) { var text, line string var err error @@ -73,6 +95,7 @@ func main() { var encryption, dbg, versionFlag, interactive bool var serverPortAux int var serverPort int64 + var attachments attachmentList flag.BoolVar(&versionFlag, "version", false, "Prints the version and exits") flag.StringVar(&configPath, "conf", "", "Path to a config file (defaults to /etc/sendmail.toml)") @@ -89,6 +112,7 @@ func main() { flag.StringVar(&bcc, "bcc", "", "Comma-separated list of blind carbon-copy recipient(s)") flag.StringVar(&from, "from", "", "Sender of the mail (used as default account user to log in on the SMTP server)") flag.StringVar(&subject, "sub", "", "Subject of the mail") + flag.Var(&attachments, "attach", "Attachment to the mail (may be repeated)") flag.Parse() LogInit(dbg) @@ -136,7 +160,8 @@ parameters: password: %s to: %s from: %s - subject: %s`, + subject: %s + attachments: %s`, configPath, dbg, serverAddress, @@ -147,6 +172,7 @@ parameters: to, from, subject, + attachments, ) config := initializeConfig(configPath, section) @@ -161,6 +187,7 @@ parameters: config.Merge("Bcc", toList(bcc)) config.Merge("Subject", subject) config.Merge("Text", text) + config.Merge("Attachments", attachments) Debug.F("---\nPre-validation config\n%s", config) err = config.Validate()