From 4778962c1e07200ee67bc8a75aa1d30310aff894 Mon Sep 17 00:00:00 2001 From: ftlynx Date: Mon, 2 Nov 2020 13:54:14 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E9=99=84=E4=BB=B6=E5=90=8D=E4=B9=B1?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.ini.template | 7 ++++-- go.mod | 2 +- main.go | 55 ++++++++++++++++++++++++--------------------- 3 files changed, 36 insertions(+), 28 deletions(-) diff --git a/config.ini.template b/config.ini.template index 57bd8db..38100d5 100644 --- a/config.ini.template +++ b/config.ini.template @@ -7,5 +7,8 @@ port = 587 [data] datasource = "root:root@tcp(127.0.0.1:3306)/xx?parseTime=true&loc=Local" sql = "select * from user" -name = "用户数据" -mailto = "xx@xx.com;xy@xx.com" \ No newline at end of file +subject = "用户数据" +mailto = "xx@xx.com;xy@xx.com" +cc = "xz@xx.com;zz@xx.com" +plain_body = "hi, all\r\n\r\n 相关数据见附件" +attach_name = "用户数据" \ No newline at end of file diff --git a/go.mod b/go.mod index b757f1a..bf220ef 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/BurntSushi/toml v0.3.1 - github.com/ftlynx/tsx v0.0.0-20200407075516-7380aaf715d7 + github.com/ftlynx/tsx v0.0.0-20201102032401-e33c02295a5d github.com/go-sql-driver/mysql v1.5.0 github.com/tealeg/xlsx v1.0.5 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect diff --git a/main.go b/main.go index 15b4b7c..11e7283 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "database/sql" "fmt" "github.com/BurntSushi/toml" + "github.com/ftlynx/tsx" "github.com/ftlynx/tsx/mysqlx" _ "github.com/go-sql-driver/mysql" "github.com/tealeg/xlsx" @@ -25,8 +26,11 @@ type Config struct { type DataConfig struct { Datasource string `toml:"datasource"` Sql string `toml:"sql"` - Name string `toml:"name"` + Subject string `toml:"subject"` Mailto string `toml:"mailto"` + Cc string `toml:"cc"` + PlainBody string `toml:"plain_body"` + AttachName string `toml:"attach_name"` } type EmailConf struct { @@ -69,6 +73,8 @@ type myDB struct { DB *sql.DB } +type RowData []interface{} + func (d *myDB) QueryDataToMap(sql string) ([]string, []map[string]interface{}, error) { result := make([]map[string]interface{}, 0) rows, err := d.DB.Query(sql) @@ -80,18 +86,18 @@ func (d *myDB) QueryDataToMap(sql string) ([]string, []map[string]interface{}, e return columns, result, err } - cache := make([]interface{}, len(columns)) - for index, _ := range cache { - var a interface{} - cache[index] = &a + r := make(RowData, len(columns)) + for index, _ := range r { + var tmp interface{} + r[index] = &tmp } for rows.Next() { - if err := rows.Scan(cache...); err != nil { + if err := rows.Scan(r...); err != nil { return columns, result, err } item := make(map[string]interface{}) - for i, data := range cache { + for i, data := range r { item[columns[i]] = *data.(*interface{}) } result = append(result, item) @@ -99,8 +105,6 @@ func (d *myDB) QueryDataToMap(sql string) ([]string, []map[string]interface{}, e return columns, result, err } -type RowData []interface{} - func (d *myDB) QueryDataToSlice(sql string) ([]string, []RowData, error) { result := make([]RowData, 0) rows, err := d.DB.Query(sql) @@ -180,29 +184,30 @@ type connMail struct { Port int `json:"port"` } -func (m *connMail) Send(to string, cc string, subject string, attaFile string) error { +// TODO 中文附件名在部分邮件客户端中显示乱码 +func (m *connMail) Send(to string, cc string, subject string, plain_body string, attach_file string) error { d := gomail.NewDialer(m.Smtp, m.Port, m.User, m.Passwd) d.TLSConfig = &tls.Config{InsecureSkipVerify: true} //设置消息 - msg := gomail.NewMessage() + msg := gomail.NewMessage(gomail.SetCharset("UTF-8"), gomail.SetEncoding(gomail.Base64)) msg.SetHeader("From", msg.FormatAddress(m.User, "系统邮件")) msg.SetHeader("To", strings.Split(to, ";")...) - msg.SetHeader("CC", cc) + if cc != "" { + msg.SetHeader("Cc", strings.Split(cc, ";")...) + } msg.SetHeader("Subject", subject) - msg.SetBody("text/plain", "hi, all:\r\n\r\n 相关数据见附件") + msg.SetBody("text/plain", plain_body) - if attaFile != "" { - names := strings.Split(attaFile, "/") + if tsx.FileExists(attach_file) { + names := strings.Split(attach_file, "/") name := names[len(names)-1] - msg.Attach(attaFile, - gomail.Rename(name), - gomail.SetHeader(map[string][]string{ - "Content-Disposition": []string{ - fmt.Sprintf(`attachment; filename="%s"`, mime.QEncoding.Encode("UTF-8", name)), - }, - }, - )) + //处理附件文件名乱码 + fileHeader := map[string][]string{ + "Content-Type": {fmt.Sprintf(`text/plain; name="%s"`, mime.QEncoding.Encode("UTF-8", name))}, + //"Content-Disposition": {fmt.Sprintf(`attachment; filename="%s"`, mime.QEncoding.Encode("UTF-8", name))}, + } + msg.Attach(attach_file, gomail.Rename(name), gomail.SetHeader(fileHeader)) } return d.DialAndSend(msg) @@ -223,7 +228,7 @@ func main() { if err != nil { panic(err) } - filename := fmt.Sprintf("/tmp/%s.xlsx", cfg.Data.Name) + filename := fmt.Sprintf("/tmp/%s.xlsx", cfg.Data.AttachName) sqldata := myDB{DB: db} // 使用slice columns, result, err := sqldata.QueryDataToSlice(cfg.Data.Sql) @@ -249,7 +254,7 @@ func main() { Smtp: cfg.EMail.Smtp, Port: cfg.EMail.Port, } - if err := email.Send(cfg.Data.Mailto, "", cfg.Data.Name, filename); err != nil { + if err := email.Send(cfg.Data.Mailto, cfg.Data.Cc, cfg.Data.Subject, cfg.Data.PlainBody, filename); err != nil { panic(err) } return