package core
import (
"errors"
"fmt"
"net/smtp"
"strings"
"time"
)
var notifiers = map [ string ] AbstractNotifier {
"email" : EmailNotifier { } ,
}
type AbstractNotifier interface {
New ( config interface { } ) ( AbstractNotifier , error )
ComposeNotification ( box * Box , checks [ ] CheckResult ) Notification
Submit ( notification Notification ) error
}
type Notification struct {
body string
subject string
}
type EmailNotifier struct {
Recipients [ ] string
FromAddress string
}
func ( n EmailNotifier ) New ( config interface { } ) ( AbstractNotifier , error ) {
res , ok := config . ( EmailNotifier )
if ! ok || res . Recipients == nil || res . FromAddress == "" {
return nil , errors . New ( "Invalid EmailNotifier options" )
}
return EmailNotifier {
Recipients : res . Recipients ,
FromAddress : res . FromAddress ,
} , nil
}
func ( n EmailNotifier ) ComposeNotification ( box * Box , checks [ ] CheckResult ) Notification {
resultTexts := [ ] string { }
for _ , check := range checks {
resultTexts = append ( resultTexts , check . String ( ) )
}
return Notification {
subject : fmt . Sprintf ( "Issues with your box \"%s\" on opensensemap.org!" , box . Name ) ,
body : fmt . Sprintf ( "A check at %s identified the following issue(s) with your box %s:\n\n%s\n\nYou may visit https://opensensemap.org/explore/%s for more details.\n\n--\nSent automatically by osem_notify (https://github.com/noerw/osem_notify)" ,
time . Now ( ) . Round ( time . Minute ) , box . Name , strings . Join ( resultTexts , "\n" ) , box . Id ) ,
}
}
func ( n EmailNotifier ) Submit ( notification Notification ) error {
// Set up authentication information. TODO: load from config
auth := smtp . PlainAuth (
"" ,
"USERNAME" ,
"PASSWORD" ,
"SERVER" ,
)
fromAddress := "EXAMPLE@EXAMPLE.COM"
from := fmt . Sprintf ( "openSenseMap Notifier <%s>" , fromAddress )
body := fmt . Sprintf ( "From: %s\nSubject: %s\nContent-Type: text/plain; charset=\"utf-8\"\n\n%s" , from , notification . subject , notification . body )
// Connect to the server, authenticate, set the sender and recipient,
// and send the email all in one step.
err := smtp . SendMail (
"smtp.gmx.de:25" ,
auth ,
fromAddress ,
n . Recipients ,
[ ] byte ( body ) ,
)
return err
}