summaryrefslogtreecommitdiff
path: root/mailing/smtp_mailer.go
diff options
context:
space:
mode:
Diffstat (limited to 'mailing/smtp_mailer.go')
-rw-r--r--mailing/smtp_mailer.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/mailing/smtp_mailer.go b/mailing/smtp_mailer.go
new file mode 100644
index 0000000..2a90173
--- /dev/null
+++ b/mailing/smtp_mailer.go
@@ -0,0 +1,60 @@
+package mailing
+
+import (
+ "errors"
+ "github.com/kch42/simpleconf"
+ "net/smtp"
+)
+
+// SMTPMailer is a Mailer implementation that sends mail via an smtp server.
+type SMTPMailer struct {
+ Host string // Host is the expected hostname of the server
+ Addr string // Addr is the address of the server
+ UseCRAMMD5 bool
+ Username string
+ Password string
+}
+
+func (sm SMTPMailer) Mail(to, from string, msg []byte) error {
+ var auth smtp.Auth
+ if sm.UseCRAMMD5 {
+ auth = smtp.CRAMMD5Auth(sm.Username, sm.Password)
+ } else {
+ auth = smtp.PlainAuth("", sm.Username, sm.Password, sm.Host)
+ }
+
+ return smtp.SendMail(sm.Addr, auth, from, []string{to}, msg)
+}
+
+// SMTPMailerCreator creates an SMTPMailer using configuration values in the [mail] section.
+//
+// addr - The address of the smtp server (go notation)
+// user - Username
+// passwd - Password
+// crammd5 - Should CRAMMD5 (on) or PLAIN (off) be used?
+// host - The expected hostname of the mailserver (can be left out, if crammd5 is on)
+//
+func SMTPMailerCreator(conf simpleconf.Config) (Mailer, error) {
+ rv := SMTPMailer{}
+ var err error
+
+ if rv.Addr, err = conf.GetString("mail", "addr"); err != nil {
+ return rv, errors.New("Missing [mail] addr config")
+ }
+ if rv.UseCRAMMD5, err = conf.GetBool("mail", "crammd5"); err != nil {
+ return rv, errors.New("Missing [mail] crammd5 config")
+ }
+ if rv.Username, err = conf.GetString("mail", "user"); err != nil {
+ return rv, errors.New("Missing [mail] user config")
+ }
+ if rv.Password, err = conf.GetString("mail", "passwd"); err != nil {
+ return rv, errors.New("Missing [mail] passwd config")
+ }
+ if !rv.UseCRAMMD5 {
+ if rv.Host, err = conf.GetString("mail", "host"); err != nil {
+ return rv, errors.New("Missing [mail] host config")
+ }
+ }
+
+ return rv, nil
+}