view pkg/misc/mail.go @ 5415:4ad68ab239b7 marking-single-beam

Factored creation of default class breaks in SR import to be reused with markings, too.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 07 Jul 2021 12:01:28 +0200
parents dcd5692a2889
children 1222b777f51f
line wrap: on
line source

// This is Free Software under GNU Affero General Public License v >= 3.0
// without warranty, see README.md and license for details.
//
// SPDX-License-Identifier: AGPL-3.0-or-later
// License-Filename: LICENSES/AGPL-3.0.txt
//
// Copyright (C) 2018 by via donau
//   – Österreichische Wasserstraßen-Gesellschaft mbH
// Software engineering by Intevation GmbH
//
// Author(s):
//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>

package misc

import (
	"io"

	gomail "gopkg.in/gomail.v2"

	"gemma.intevation.de/gemma/pkg/config"
)

type EmailReceiver struct {
	Name    string
	Address string
}

type EmailAttachment struct {
	Name    string
	Content []byte
}

// SendMail sends an email to a given address with a given subject
// and body.
// The credentials to contact the SMPT server are taken from the
// configuration.
func SendMail(address, subject, body string) error {
	m := gomail.NewMessage()
	m.SetHeader("From", config.MailFrom())
	m.SetHeader("To", address)
	m.SetHeader("Subject", subject)
	m.SetBody("text/plain", body)

	d := gomail.Dialer{
		Host:      config.MailHost(),
		Port:      int(config.MailPort()),
		Username:  config.MailUser(),
		Password:  config.MailPassword(),
		LocalName: config.MailHelo(),
		SSL:       config.MailPort() == 465,
	}

	return d.DialAndSend(m)
}

func SendMailToAll(
	receivers []EmailReceiver,
	subject string,
	body func(EmailReceiver) (string, error),
	attachments []EmailAttachment,
	errorHandler func(EmailReceiver, error) error,
) error {

	d := gomail.Dialer{
		Host:      config.MailHost(),
		Port:      int(config.MailPort()),
		Username:  config.MailUser(),
		Password:  config.MailPassword(),
		LocalName: config.MailHelo(),
		SSL:       config.MailPort() == 465,
	}

	s, err := d.Dial()
	if err != nil {
		return err
	}
	defer s.Close()

	m := gomail.NewMessage()
	for _, r := range receivers {
		m.SetHeader("From", config.MailFrom())
		m.SetAddressHeader("To", r.Address, r.Name)
		m.SetHeader("Subject", subject)
		b, err := body(r)
		if err != nil {
			return err
		}
		m.SetBody("text/plain", b)
		for _, at := range attachments {
			content := at.Content
			m.Attach(at.Name, gomail.SetCopyFunc(func(w io.Writer) error {
				_, err := w.Write(content)
				return err
			}))
		}

		if err := gomail.Send(s, m); err != nil {
			if err = errorHandler(r, err); err != nil {
				return err
			}
		}
		m.Reset()
	}
	return nil
}