1
0
mirror of https://github.com/mainflux/mainflux.git synced 2025-04-27 13:48:49 +08:00
Ivan Milošević d2153a8846
[NOISSUE] - Improve errors package (#1086)
* Init commit - implement errors package on things service

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* things service errors issue

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* Decode errors
Add authn service to run script

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* Modify tests

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* service_test

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* debug lines

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* Regulate tests

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* Improve errors in Redis

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* Remove dead code
Inline if conditions
Rename err var

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* Transform errors messages to lowercase

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* improve errors package

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* modify wrap method
inline wrapping errors in redis

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* Add copyright to errors package

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* wrapping nil error returns wrapper (instead of nil)

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* move response messages in test to vars

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* golangcibot review fix

Signed-off-by: Ivan Milošević <iva@blokovi.com>

* golangbot fix review in transport

Signed-off-by: Ivan Milošević <iva@blokovi.com>
2020-03-30 15:22:18 +02:00

98 lines
2.0 KiB
Go

// Copyright (c) Mainflux
// SPDX-License-Identifier: Apache-2.0
package email
import (
"bytes"
"fmt"
"html/template"
"net/smtp"
"github.com/mainflux/mainflux/errors"
"github.com/mainflux/mainflux/logger"
)
var (
// ErrMissingEmailTemplate missing email template file
errMissingEmailTemplate = errors.New("Missing e-mail template file")
errParseTemplate = errors.New("Parse e-mail template failed")
errExecTemplate = errors.New("Execute e-mail template failed")
errSendMail = errors.New("Sending e-mail failed")
)
type emailTemplate struct {
To []string
From string
Subject string
Header string
Content string
Footer string
}
// Config email agent configuration.
type Config struct {
Driver string
Host string
Port string
Username string
Password string
FromAddress string
FromName string
Template string
}
// Agent for mailing
type Agent struct {
conf *Config
auth smtp.Auth
addr string
log logger.Logger
tmpl *template.Template
}
// New creates new email agent
func New(c *Config) (*Agent, error) {
a := &Agent{}
a.conf = c
a.auth = smtp.PlainAuth("", c.Username, c.Password, c.Host)
a.addr = fmt.Sprintf("%s:%s", c.Host, c.Port)
tmpl, err := template.ParseFiles(c.Template)
if err != nil {
return nil, errors.Wrap(errParseTemplate, err)
}
a.tmpl = tmpl
return a, nil
}
// Send sends e-mail
func (a *Agent) Send(To []string, From, Subject, Header, Content, Footer string) error {
if a.tmpl == nil {
return errMissingEmailTemplate
}
email := new(bytes.Buffer)
tmpl := emailTemplate{
To: To,
From: From,
Subject: Subject,
Header: Header,
Content: Content,
Footer: Footer,
}
if From == "" {
tmpl.From = a.conf.FromName
}
if err := a.tmpl.Execute(email, tmpl); err != nil {
return errors.Wrap(errExecTemplate, err)
}
if err := smtp.SendMail(a.addr, a.auth, a.conf.FromAddress, To, email.Bytes()); err != nil {
return errors.Wrap(errSendMail, err)
}
return nil
}