diff --git a/Dockerfile b/Dockerfile index bdebb2f..8777515 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ RUN go mod download COPY *.go ./ -RUN CGO_ENABLED=0 GOOS=linux go build -o /docker-mail-reminder +RUN CGO_ENABLED=0 GOOS=linux go build -o /main # Run the tests in the container FROM build-stage AS run-test-stage @@ -21,10 +21,10 @@ FROM gcr.io/distroless/base-debian11 AS build-release-stage WORKDIR / -COPY --from=build-stage /docker-mail-reminder /docker-mail-reminder +COPY --from=build-stage /main /main #EXPOSE 8080 USER nonroot:nonroot -ENTRYPOINT ["/docker-mail-reminder"] +ENTRYPOINT ["/main"] diff --git a/README.md b/README.md index 6aaca08..890189a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Your Go Application +# GO ical ntfy reminder -This is a simple Go application that does iCalendar files (.ics) analyzes and sends notifications by email based on the events in these iCalendar files. +This is a simple Go application that does iCalendar files (.ics) analyzes and sends notifications by ntfy based on the events in these iCalendar files. ## Prerequisites @@ -14,7 +14,7 @@ Before you begin, ensure you have the following installed: 1. **Clone the repository:** ```bash - git clone + git clone https://code.brothertec.eu/simono41/go-ical-ntfy-reminder.git ``` 2. **Create an environment variables file:** @@ -22,11 +22,9 @@ Before you begin, ensure you have the following installed: Create a file named `.env` in your project directory. Fill this file with the required environment variables: ```env - FROM_EMAIL=user@example.com TO_EMAIL=recipient@example.com - EMAIL_PASSWORD=your_password - SMTP_HOST=smtp.example.com - SMTP_PORT=587 + NTFY_AUTH=echo "Basic $(echo -n 'testuser:fakepassword' | base64)" + NTFY_HOST=https://ntfy.sh/alerts ICS_DIR=/path/to/ics/files ``` diff --git a/go.mod b/go.mod index f1237ba..fc7e732 100644 --- a/go.mod +++ b/go.mod @@ -5,12 +5,10 @@ go 1.21 require ( github.com/apognu/gocal v0.9.0 github.com/sirupsen/logrus v1.9.3 - gopkg.in/mail.v2 v2.3.1 ) require ( github.com/ChannelMeter/iso8601duration v0.0.0-20150204201828-8da3af7a2a61 // indirect golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect - gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/yaml.v3 v3.0.0 // indirect ) diff --git a/go.sum b/go.sum index 5205731..3cec2e2 100644 --- a/go.sum +++ b/go.sum @@ -17,11 +17,7 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= -gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk= -gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index 1e1d178..5135b22 100644 --- a/main.go +++ b/main.go @@ -1,23 +1,19 @@ package main import ( - "crypto/tls" "fmt" "github.com/apognu/gocal" log "github.com/sirupsen/logrus" - gomail "gopkg.in/mail.v2" + "net/http" "os" - "strconv" "strings" "time" ) var ( - fromString string - toAddresses []string - passwordString string - hostString string - hostPortString int + toAddresses []string + authString string + hostString string ) func main() { @@ -28,22 +24,10 @@ func main() { log.Info("Hello World!") - // Initialisiere err mit einem Fehlerwert - var err error - // Read environment variables - fromString = os.Getenv("FROM_EMAIL") toAddresses = strings.Split(os.Getenv("TO_EMAIL"), ",") - passwordString = os.Getenv("EMAIL_PASSWORD") - hostString = os.Getenv("SMTP_HOST") - hostPortString, err = strconv.Atoi(os.Getenv("SMTP_PORT")) - - // Überprüfung auf Fehler - if err != nil { - fmt.Println("Fehler bei der Umwandlung. Verwende Standardwert 587.") - // Setze einen Standardwert, zum Beispiel 0 - hostPortString = 587 - } + authString = os.Getenv("NTFY_AUTH") + hostString = os.Getenv("NTFY_HOST") // Get the current working directory dir, err := os.Getwd() @@ -54,13 +38,13 @@ func main() { // Read and split multiple folders folderList := os.Getenv("ICS_DIR") - if folderList == "" || fromString == "" || len(toAddresses) == 0 || passwordString == "" || hostString == "" { - log.Fatal("Es fehlen noch einige Parameter!!!\nICS_DIR, FROM_EMAIL, TO_EMAIL, EMAIL_PASSWORD, SMTP_HOST") + if folderList == "" || len(toAddresses) == 0 || authString == "" || hostString == "" { + log.Fatal("Es fehlen noch einige Parameter!!!\nICS_DIR, TO_EMAIL, NTFY_AUTH, NTFY_HOST") } folders := strings.Split(folderList, ",") for _, folder := range folders { - log.Infof("folder: %s from: %s to: %s password: %s host: %s", folder, fromString, toAddresses, passwordString, hostString) + log.Infof("folder: %s to: %s password: %s host: %s", folder, toAddresses, authString, hostString) listFilesForFolder(folder) } } @@ -131,10 +115,10 @@ func getNotifications(file string) { if len(e.Description) != 0 { messageText += fmt.Sprintf("\n\nFolgende Notiz existiert in diesen Eintrag: \n%s", e.Description) } - messageText += "\n\n This email is a service from mail-reminder Version 1.0 written in Golang. \n Delivered by Simon Rieger" + messageText += "\n\n This message is a service from go-ical-ntfy-reminder Version 1.0 written in Golang. \n Delivered by Simon Rieger" for _, toAddress := range toAddresses { - sendMail(messageSubject, messageText, toAddress) + sendMessage(messageSubject, messageText, toAddress) } } } @@ -143,32 +127,20 @@ func truncateToDay(t time.Time) time.Time { return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) } -func sendMail(messageSubject string, messageText string, toAddress string) { - m := gomail.NewMessage() +func sendMessage(messageSubject string, messageText string, toAddress string) { - // Set E-Mail sender - m.SetHeader("From", fromString) - - // Set E-Mail receivers - m.SetHeader("To", toAddress) - - // Set E-Mail subject - m.SetHeader("Subject", messageSubject) - - // Set E-Mail body. You can set plain text or html with text/html - m.SetBody("text/plain", messageText) - - // Settings for SMTP server - d := gomail.NewDialer(hostString, hostPortString, fromString, passwordString) - - // This is only needed when SSL/TLS certificate is not valid on server. - // In production this should be set to false. - d.TLSConfig = &tls.Config{InsecureSkipVerify: true} - - // Now send E-Mail - if err := d.DialAndSend(m); err != nil { - log.Fatal(err) - panic(err) + req, _ := http.NewRequest("POST", hostString, + strings.NewReader(messageText)) + req.Header.Set("Title", messageSubject) + req.Header.Set("Authorization", "Basic "+authString) + req.Header.Set("Email", toAddress) + req.Header.Set("Tags", "date,octopus") + req.Header.Set("Priority", "high") + do, err := http.DefaultClient.Do(req) + if err != nil { + log.Fatal("Ntfy Message not Sent Successfully, Error: " + err.Error()) + return } - log.Infof("Email Message Sent Successfully") + + log.Infof("Ntfy Message Sent Successfully, Status: " + do.Status) }