mirror of
https://github.com/nabbar/golib.git
synced 2026-04-22 23:17:12 +08:00
ca39d7ad26
- 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
173 lines
3.6 KiB
Go
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
|
|
}
|