First Commit
This commit is contained in:
commit
a76f6bfb0c
13 changed files with 452 additions and 0 deletions
8
.idea/.gitignore
vendored
Normal file
8
.idea/.gitignore
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
9
.idea/mail-reminder.iml
Normal file
9
.idea/mail-reminder.iml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="Go" enabled="true" />
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/mail-reminder.iml" filepath="$PROJECT_DIR$/.idea/mail-reminder.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
30
Dockerfile
Normal file
30
Dockerfile
Normal file
|
@ -0,0 +1,30 @@
|
|||
# syntax=docker/dockerfile:1
|
||||
|
||||
# Build the application from source
|
||||
FROM golang:1.21.4 AS build-stage
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY go.mod go.sum ./
|
||||
RUN go mod download
|
||||
|
||||
COPY *.go ./
|
||||
|
||||
RUN CGO_ENABLED=0 GOOS=linux go build -o /docker-mail-reminder
|
||||
|
||||
# Run the tests in the container
|
||||
FROM build-stage AS run-test-stage
|
||||
RUN go test -v ./...
|
||||
|
||||
# Deploy the application binary into a lean image
|
||||
FROM gcr.io/distroless/base-debian11 AS build-release-stage
|
||||
|
||||
WORKDIR /
|
||||
|
||||
COPY --from=build-stage /docker-mail-reminder /docker-mail-reminder
|
||||
|
||||
#EXPOSE 8080
|
||||
|
||||
USER nonroot:nonroot
|
||||
|
||||
ENTRYPOINT ["/docker-mail-reminder"]
|
58
README.md
Normal file
58
README.md
Normal file
|
@ -0,0 +1,58 @@
|
|||
# Your Go Application
|
||||
|
||||
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.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before you begin, ensure you have the following installed:
|
||||
|
||||
- [Docker](https://docs.docker.com/get-docker/)
|
||||
- [Docker Compose](https://docs.docker.com/compose/install/)
|
||||
|
||||
## Getting Started
|
||||
|
||||
1. **Clone the repository:**
|
||||
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
```
|
||||
|
||||
2. **Create an environment variables file:**
|
||||
|
||||
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
|
||||
ICS_DIR=/path/to/ics/files
|
||||
```
|
||||
|
||||
Customize the values according to your application.
|
||||
|
||||
3. **Build and run the Docker container:**
|
||||
|
||||
```bash
|
||||
docker-compose up --build
|
||||
```
|
||||
|
||||
This command uses Docker Compose to build and run the container, loading environment variables from the `.env` file.
|
||||
|
||||
4. **Access your application:**
|
||||
|
||||
Open your web browser and go to [http://localhost:8080](http://localhost:8080).
|
||||
|
||||
## Customizing the Docker Image
|
||||
|
||||
- If your application uses additional environment variables, add them to the `.env` file.
|
||||
- Customize the Dockerfile or docker-compose.yml if needed.
|
||||
|
||||
## Contributing
|
||||
|
||||
If you'd like to contribute, please fork the repository and create a pull request. Feel free to open an issue if you encounter any problems or have suggestions.
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
3
cron-job.sh
Normal file
3
cron-job.sh
Normal file
|
@ -0,0 +1,3 @@
|
|||
#!/bin/sh
|
||||
echo "0 6 * * * /usr/local/bin/docker-compose -f /opt/containers/mail-reminder/docker-compose.yml up --build --exit-code-from go-app" > /etc/crontabs/root
|
||||
crond -f -l 8
|
15
docker-compose.yml
Normal file
15
docker-compose.yml
Normal file
|
@ -0,0 +1,15 @@
|
|||
version: '3'
|
||||
|
||||
services:
|
||||
go-app:
|
||||
build:
|
||||
context: .
|
||||
env_file: .env
|
||||
volumes:
|
||||
- /opt/containers/mailu/dav/collection-root:/dav:ro
|
||||
|
||||
cron:
|
||||
image: alpine:latest
|
||||
volumes:
|
||||
- ./cron-job.sh:/etc/periodic/daily/cron-job
|
||||
command: ["crond", "-f", "-d", "8"]
|
16
go.mod
Normal file
16
go.mod
Normal file
|
@ -0,0 +1,16 @@
|
|||
module mail-reminder
|
||||
|
||||
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
|
||||
)
|
27
go.sum
Normal file
27
go.sum
Normal file
|
@ -0,0 +1,27 @@
|
|||
github.com/ChannelMeter/iso8601duration v0.0.0-20150204201828-8da3af7a2a61 h1:N5Vqww5QISEHsWHOWDEx4PzdIay3Cg0Jp7zItq2ZAro=
|
||||
github.com/ChannelMeter/iso8601duration v0.0.0-20150204201828-8da3af7a2a61/go.mod h1:GnKXcK+7DYNy/8w2Ex//Uql4IgfaU82Cd5rWKb7ah00=
|
||||
github.com/apognu/gocal v0.9.0 h1:2lGdZprjYs9A6l1RTEmapmpE1PiDbXNX8bUVqZt3vm4=
|
||||
github.com/apognu/gocal v0.9.0/go.mod h1:ZOJfNOqpz8aasi3uqzDu+eWTT6VuEa/TvQWiYYWlb80=
|
||||
github.com/channelmeter/iso8601duration v0.0.0-20150204201828-8da3af7a2a61 h1:o64h9XF42kVEUuhuer2ehqrlX8rZmvQSU0+Vpj1rF6Q=
|
||||
github.com/channelmeter/iso8601duration v0.0.0-20150204201828-8da3af7a2a61/go.mod h1:Rp8e0DCtEKwXFOC6JPJQVTz8tuGoGvw6Xfexggh/ed0=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
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=
|
49
ics/subdir/test.ics
Normal file
49
ics/subdir/test.ics
Normal file
|
@ -0,0 +1,49 @@
|
|||
BEGIN:VCALENDAR
|
||||
VERSION:2.0
|
||||
PRODID:-//ical.marudot.com//iCal Event Maker
|
||||
CALSCALE:GREGORIAN
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Europe/Berlin
|
||||
LAST-MODIFIED:20230407T050750Z
|
||||
TZURL:https://www.tzurl.org/zoneinfo-outlook/Europe/Berlin
|
||||
X-LIC-LOCATION:Europe/Berlin
|
||||
BEGIN:DAYLIGHT
|
||||
TZNAME:CEST
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0200
|
||||
DTSTART:19700329T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZNAME:CET
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0100
|
||||
DTSTART:19701025T030000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
BEGIN:VEVENT
|
||||
DTSTAMP:20231123T113949Z
|
||||
UID:1700739536627-74911@ical.marudot.com
|
||||
DTSTART;TZID=Europe/Berlin:20231123T120000
|
||||
DTEND;TZID=Europe/Berlin:20231123T120000
|
||||
SUMMARY:test1
|
||||
DESCRIPTION:test1
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
DTSTAMP:20231123T113949Z
|
||||
UID:1700739551336-72964@ical.marudot.com
|
||||
DTSTART;TZID=Europe/Berlin:20231123T120000
|
||||
DTEND;TZID=Europe/Berlin:20231124T120000
|
||||
SUMMARY:test2
|
||||
DESCRIPTION:test2
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
DTSTAMP:20231123T113949Z
|
||||
UID:1700739565150-71554@ical.marudot.com
|
||||
DTSTART;TZID=Europe/Berlin:20231124T120000
|
||||
DTEND;TZID=Europe/Berlin:20231125T120000
|
||||
SUMMARY:test3
|
||||
DESCRIPTION:test3
|
||||
END:VEVENT
|
||||
END:VCALENDAR
|
49
ics/test.ics
Normal file
49
ics/test.ics
Normal file
|
@ -0,0 +1,49 @@
|
|||
BEGIN:VCALENDAR
|
||||
VERSION:2.0
|
||||
PRODID:-//ical.marudot.com//iCal Event Maker
|
||||
CALSCALE:GREGORIAN
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Europe/Berlin
|
||||
LAST-MODIFIED:20230407T050750Z
|
||||
TZURL:https://www.tzurl.org/zoneinfo-outlook/Europe/Berlin
|
||||
X-LIC-LOCATION:Europe/Berlin
|
||||
BEGIN:DAYLIGHT
|
||||
TZNAME:CEST
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0200
|
||||
DTSTART:19700329T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZNAME:CET
|
||||
TZOFFSETFROM:+0200
|
||||
TZOFFSETTO:+0100
|
||||
DTSTART:19701025T030000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
BEGIN:VEVENT
|
||||
DTSTAMP:20231123T113949Z
|
||||
UID:1700739536627-74911@ical.marudot.com
|
||||
DTSTART;TZID=Europe/Berlin:20231123T120000
|
||||
DTEND;TZID=Europe/Berlin:20231123T120000
|
||||
SUMMARY:test1
|
||||
DESCRIPTION:test1
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
DTSTAMP:20231123T113949Z
|
||||
UID:1700739551336-72964@ical.marudot.com
|
||||
DTSTART;TZID=Europe/Berlin:20231123T120000
|
||||
DTEND;TZID=Europe/Berlin:20231124T120000
|
||||
SUMMARY:test2
|
||||
DESCRIPTION:test2
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
DTSTAMP:20231123T113949Z
|
||||
UID:1700739565150-71554@ical.marudot.com
|
||||
DTSTART;TZID=Europe/Berlin:20231124T120000
|
||||
DTEND;TZID=Europe/Berlin:20231125T120000
|
||||
SUMMARY:test3
|
||||
DESCRIPTION:test3
|
||||
END:VEVENT
|
||||
END:VCALENDAR
|
174
main.go
Normal file
174
main.go
Normal file
|
@ -0,0 +1,174 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"github.com/apognu/gocal"
|
||||
log "github.com/sirupsen/logrus"
|
||||
gomail "gopkg.in/mail.v2"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
fromString string
|
||||
toAddresses []string
|
||||
passwordString string
|
||||
hostString string
|
||||
hostPortString int
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Configure logrus
|
||||
log.SetFormatter(&log.TextFormatter{})
|
||||
log.SetOutput(os.Stdout)
|
||||
log.SetLevel(log.InfoLevel)
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
// Get the current working directory
|
||||
dir, err := os.Getwd()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
log.Infof("Current Working Directory is = %s", dir)
|
||||
|
||||
// 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")
|
||||
}
|
||||
|
||||
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)
|
||||
listFilesForFolder(folder)
|
||||
}
|
||||
}
|
||||
|
||||
func listFilesForFolder(folder string) {
|
||||
// Öffne das Verzeichnis
|
||||
dir, err := os.Open(folder)
|
||||
if err != nil {
|
||||
log.Fatal("Fehler beim Öffnen des Ordners:", err)
|
||||
return
|
||||
}
|
||||
defer dir.Close()
|
||||
|
||||
// Lies alle Dateien im Verzeichnis
|
||||
dateien, err := dir.Readdir(0)
|
||||
if err != nil {
|
||||
log.Fatal("Fehler beim Lesen des Verzeichnisses:", err)
|
||||
return
|
||||
}
|
||||
|
||||
// Durchlaufe die Liste der Dateien und gebe ihre Namen aus
|
||||
for _, datei := range dateien {
|
||||
// Überprüfe, ob es sich um ein Verzeichnis handelt. Wenn ja, ignoriere es.
|
||||
if datei.IsDir() {
|
||||
continue
|
||||
}
|
||||
|
||||
// Hier kannst du die Dateinamen ausgeben oder damit arbeiten.
|
||||
log.Println(datei.Name())
|
||||
|
||||
getNotifications(folder + "/" + datei.Name())
|
||||
}
|
||||
}
|
||||
|
||||
func getNotifications(file string) {
|
||||
f, err := os.Open(file)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
var tzMapping = map[string]string{
|
||||
"My Super Zone": "Europe/Berlin",
|
||||
}
|
||||
|
||||
gocal.SetTZMapper(func(s string) (*time.Location, error) {
|
||||
if tzid, ok := tzMapping[s]; ok {
|
||||
return time.LoadLocation(tzid)
|
||||
}
|
||||
return nil, fmt.Errorf("")
|
||||
})
|
||||
|
||||
start, end := truncateToDay(time.Now()), truncateToDay(time.Now()).Add(24*60*time.Minute)
|
||||
|
||||
c := gocal.NewParser(f)
|
||||
c.Start, c.End = &start, &end
|
||||
c.Parse()
|
||||
|
||||
for _, e := range c.Events {
|
||||
log.Infof("%s on %s", e.Summary, e.Start)
|
||||
|
||||
messageSubject := fmt.Sprintf("Es existiert für heute ein neuer Kalendereintrag Namens: %s", e.Summary)
|
||||
log.Println(messageSubject)
|
||||
messageText := fmt.Sprintf("Der Termin beginnt heute um: %s und endet um: %s.", e.Start, e.End)
|
||||
if len(e.Location) != 0 {
|
||||
messageText += fmt.Sprintf("\n\nEr findet in %s statt.", e.Location)
|
||||
}
|
||||
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"
|
||||
|
||||
for _, toAddress := range toAddresses {
|
||||
sendMail(messageSubject, messageText, toAddress)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
|
||||
// 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)
|
||||
}
|
||||
log.Infof("Email Message Sent Successfully")
|
||||
}
|
Loading…
Reference in a new issue