Files
golib/smtp/mail.go
T
Nicolas JUHEL ca39d7ad26 Refactor package errors + packages names :
- Refactor ErrorType, list errors managment, codeError
- Add interface Error with error interface implement
- Add type CodeError assign typiclly to const that represent code of error
- Add func to registry func to retrieve message from an uint16 codeError (typicaly a switch of each codeError const)
- Add default errorCode with default errorMessage if no one code or message is found
- Add modeError to manage how to manage compatibility between Error interface and error interface
- Add Error interface that allow parent link (parent as error or Error interface), code and trace management
- Add trace finder to allow find func/file/line caller when Error is call
- Add http 2 transport in httpcli
- Add http 2 transport in httpserver
- Add function to get client http with timeout management in httpcli
- Add function to get Error if occurs of http client in httpcli
- Add test for smtp package
- Chg return error by returning Error in all packages
- Chg package njs-archive by archive
- Chg package njs-certif by certificates
- Chg package njs-console by console
- Chg package njs-crypt by crypt
- Chg package njs-errors by errors
- Chg package njs-httpcli by httpcli
- Chg package njs-httpserver by httpserver
- Chg package njs-ioutils by ioutils
- Chg package njs-ldap by ldap
- Chg package njs-logger by logger
- Chg package njs-password by password
- Chg package njs-progress by progress
- Chg package njs-router by router
- Chg package njs-semaphore by semaphore
- Chg package njs-smtp by smtp
- Chg package njs-static by static
- Chg package njs-status by status
- Chg package njs-version by version
- Fix dependancies gopkg by github/go-ldap for go module compatibility
- Fix gin Abort call by gin Abort with Error in static package
- Fix issue #18 in status package : replace partner by component
- Fix go vet error
- Del deprecated function
- Del useless function & files
- Bump dependancies
- Apply CHG in README.md
2020-07-14 11:00:57 +02:00

173 lines
3.6 KiB
Go

package smtp
import (
"bytes"
"html/template"
"io/ioutil"
"os"
"github.com/jaytaylor/html2text"
"github.com/olekukonko/tablewriter"
. "github.com/nabbar/golib/errors"
)
type mailTemplate struct {
data interface{}
char string
opt html2text.Options
tpl *template.Template
}
func (m *mailTemplate) SetCharset(char string) {
m.char = char
}
func (m mailTemplate) GetCharset() string {
return m.char
}
func (m *mailTemplate) SetTextOption(opt html2text.Options) {
m.opt = opt
}
func (m mailTemplate) GetTextOption() html2text.Options {
return m.opt
}
func (m mailTemplate) GetBufferHtml(data interface{}) (*bytes.Buffer, Error) {
var res = bytes.NewBuffer(make([]byte, 0))
if data == nil {
data = m.data
}
if err := m.tpl.Execute(res, data); err != nil {
return nil, TEMPLATE_EXECUTE.ErrorParent(err)
}
return res, nil
}
func (m mailTemplate) GetBufferText(data interface{}) (*bytes.Buffer, Error) {
var (
res = bytes.NewBuffer(make([]byte, 0))
str string
e error
)
if buf, err := m.GetBufferHtml(data); err != nil {
return nil, err
} else if str, e = html2text.FromReader(buf, m.opt); e != nil {
return nil, TEMPLATE_HTML2TEXT.ErrorParent(e)
} else if _, e = res.WriteString(str); e != nil {
return nil, BUFFER_WRITE_STRING.ErrorParent(e)
}
return res, nil
}
func (m mailTemplate) GetBufferRich(data interface{}) (*bytes.Buffer, Error) {
panic("implement me")
}
func (m *mailTemplate) RegisterData(data interface{}) {
m.data = data
}
func (m mailTemplate) IsEmpty() bool {
if m.tpl == nil {
return true
}
if m.tpl.DefinedTemplates() == "" {
return true
}
return false
}
func (m mailTemplate) Clone() (MailTemplate, Error) {
res := &mailTemplate{
data: nil,
char: m.char,
opt: m.opt,
tpl: nil,
}
if tpl, err := m.tpl.Clone(); err != nil {
return nil, TEMPLATE_CLONE.ErrorParent(err)
} else {
res.tpl = tpl
}
return res, nil
}
type MailTemplate interface {
Clone() (MailTemplate, Error)
IsEmpty() bool
SetCharset(char string)
GetCharset() string
SetTextOption(opt html2text.Options)
GetTextOption() html2text.Options
GetBufferHtml(data interface{}) (*bytes.Buffer, Error)
GetBufferText(data interface{}) (*bytes.Buffer, Error)
GetBufferRich(data interface{}) (*bytes.Buffer, Error)
RegisterData(data interface{})
}
func NewMailTemplate(name, tpl string, isFile bool) (MailTemplate, Error) {
var (
err error
res = &mailTemplate{
data: nil,
tpl: template.New(name),
opt: html2text.Options{
PrettyTables: true,
PrettyTablesOptions: &html2text.PrettyTablesOptions{
AutoFormatHeader: true,
AutoWrapText: true,
ReflowDuringAutoWrap: true,
ColWidth: tablewriter.MAX_ROW_WIDTH,
ColumnSeparator: tablewriter.COLUMN,
RowSeparator: tablewriter.ROW,
CenterSeparator: tablewriter.CENTER,
HeaderAlignment: tablewriter.ALIGN_DEFAULT,
FooterAlignment: tablewriter.ALIGN_DEFAULT,
Alignment: tablewriter.ALIGN_DEFAULT,
ColumnAlignment: []int{},
NewLine: tablewriter.NEWLINE,
HeaderLine: true,
RowLine: false,
AutoMergeCells: false,
Borders: tablewriter.Border{Left: true, Right: true, Bottom: true, Top: true},
},
OmitLinks: true,
},
}
)
if isFile {
var fs []byte
if _, err = os.Stat(tpl); err != nil {
return nil, FILE_STAT.ErrorParent(err)
} else if fs, err = ioutil.ReadFile(tpl); err != nil {
return nil, FILE_READ.ErrorParent(err)
}
tpl = string(fs)
}
if res.tpl, err = res.tpl.Parse(tpl); err != nil {
return nil, TEMPLATE_PARSING.ErrorParent(err)
}
return res, nil
}