mirror of
https://github.com/mainflux/mainflux.git
synced 2025-04-29 13:49:28 +08:00

* user service - wraping errors Signed-off-by: Ivan Milošević <iva@blokovi.com> * wrapping more errors unwrap only wrapped errors Signed-off-by: Ivan Milošević <iva@blokovi.com> * Add internal database error Wrap internal database error Signed-off-by: Ivan Milošević <iva@blokovi.com> * Wrap user not found error Signed-off-by: Ivan Milošević <iva@blokovi.com> * Wrapping errors in idp and hasher Signed-off-by: Ivan Milošević <iva@blokovi.com> * Use error.Is for testing errors in Identify test Signed-off-by: Ivan Milošević <iva@blokovi.com> * Get wraper from wrapped errors Signed-off-by: Ivan Milošević <iva@blokovi.com> * Switch order of wrapping errors Remove dead code (comments) Signed-off-by: Ivan Milošević <iva@blokovi.com> * assert true in tests Signed-off-by: Ivan Milošević <iva@blokovi.com> * Change comparing errors in tests (assert.True) Signed-off-by: Ivan Milošević <iva@blokovi.com> * Add errorRes structure to API responses in body in things service Signed-off-by: Ivan Milošević <iva@blokovi.com> * resolve conflicts after rebasing Signed-off-by: Ivan Milošević <iva@blokovi.com> * Create errors package Signed-off-by: Ivan Milošević <iva@blokovi.com> * implement new errors package Signed-off-by: Ivan Milošević <iva@blokovi.com> * Modify tests Signed-off-by: Ivan Milošević <iva@blokovi.com> * return copyright comments Signed-off-by: Ivan Milošević <iva@blokovi.com> * remove changes from .gitignore Signed-off-by: Ivan Milošević <iva@blokovi.com> * Move logging to encode errors Comment exported vars and methods Formatting Signed-off-by: Ivan Milošević <iva@blokovi.com> * Login function returns errors.Error Signed-off-by: Ivan Milošević <iva@blokovi.com> * Modify login tests to meet login returning errors.Error Signed-off-by: Ivan Milošević <iva@blokovi.com> * Error interface Signed-off-by: Ivan Milošević <iva@blokovi.com> * Change parameter in Wrapper to interface Error Signed-off-by: Ivan Milošević <iva@blokovi.com> * implement new error interface Signed-off-by: Ivan Milošević <iva@blokovi.com> * Modify tests to use new Error interface Signed-off-by: Ivan Milošević <iva@blokovi.com> * Fix Login Signed-off-by: Ivan Milošević <iva@blokovi.com> * Remove unnecessary errir casting Signed-off-by: Ivan Milošević <iva@blokovi.com> * new error interface implementation Signed-off-by: Ivan Milošević <iva@blokovi.com> * check if Error is empty in registrationEndpoint Signed-off-by: Ivan Milošević <iva@blokovi.com> * Add Empty factory function Use new Empty factory function Use isEmpty method Signed-off-by: Ivan Milošević <iva@blokovi.com> * Lose else in encodeError Signed-off-by: Ivan Milošević <iva@blokovi.com> * Modify tests Signed-off-by: Ivan Milošević <iva@blokovi.com> * Remove *json.UnmarshalTypeError and *json.SyntaxError types from encodeError type switch Signed-off-by: Ivan Milošević <iva@blokovi.com> * Fix nil error value in jwtIdentityProvider Signed-off-by: Ivan Milošević <iva@blokovi.com> * Fix gprc to use new error package Signed-off-by: Ivan Milošević <iva@blokovi.com> * rename receiver in errors package grpc errors Signed-off-by: Ivan Milošević <iva@blokovi.com> * remove debugging code Signed-off-by: Ivan Milošević <iva@blokovi.com> * Resolving conflicts after rebase Signed-off-by: Ivan Milošević <iva@blokovi.com> * Remove comment Signed-off-by: Ivan Milošević <iva@blokovi.com> * Remove Empty from custom error Implement custom error on new methods Signed-off-by: Ivan Milošević <iva@blokovi.com> * WIP tests Signed-off-by: Ivan Milošević <iva@blokovi.com> * remove wrap from Error interface Signed-off-by: Ivan Milošević <iva@blokovi.com> * password-change related tests remove debug code Signed-off-by: Ivan Milošević <iva@blokovi.com> * remove dead code Signed-off-by: Ivan Milošević <iva@blokovi.com> * Move all errors casting to errors package Signed-off-by: Ivan Milošević <iva@blokovi.com> * Fix comment in error package Signed-off-by: Ivan Milošević <iva@blokovi.com> * Change struct pointer to interface in package methods Signed-off-by: Ivan Milošević <iva@blokovi.com> * resolving reviews Signed-off-by: Ivan Milošević <iva@blokovi.com> * fix return in database.go Signed-off-by: Ivan Milošević <iva@blokovi.com> * Fix copyright header Signed-off-by: Ivan Milošević <iva@blokovi.com> * Fix comment in hasher Signed-off-by: Ivan Milošević <iva@blokovi.com>
98 lines
2.0 KiB
Go
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, errors.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) errors.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
|
|
}
|