blog_backend_api/controller/mail.go

285 lines
7.1 KiB
Go

package controller
import (
"bufio"
"bytes"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"io/ioutil"
"log"
"net/smtp"
"os"
"regexp"
"strings"
"text/template"
"time"
"background/config"
"background/db"
)
type MailController struct {
}
type RespJson struct {
Msg string `json:"msg"`
Data interface{} `json:"data,omitempty"`
Affected int64 `json:"affected,omitempty"`
}
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsExist(err) {
return true, nil
}
return false, err
}
func GetTemplateFile(template string) ([]byte, error) {
path := "G:\\GoPath\\Email\\" + template + ".tpl"
ok, err := PathExists(path)
if !ok {
return nil, errors.New("Count not Find File " + path)
}
file, err := os.Open(path)
if err != nil {
log.Println(err.Error())
}
ret, err := ioutil.ReadAll(file)
file.Close()
return ret, nil
}
//静态文件存放地
const PATH_STATIC = "G://GoPath//Email//static//"
type ReqSendEmailTpl struct {
From string `json:"from"`
To string `json:"to"`
Tittle string `json:"tittle"`
TempData interface{} `json:"temp_data"`
Template string `json:"template"`
Generate bool `json:"generate"`
}
type ReqSendEmail struct {
Email string `json:"email_address"`
Content string `json:"content"`
}
func SendToMailWithUserInfo(title, user, password, host, to, content string) error {
var content_type string
hp := strings.Split(host, ":")
auth := smtp.PlainAuth("", user, password, hp[0])
msg := []byte("To: " + to + "\r\nFrom: " + user + "\r\nSubject: " + title + "\r\n" +
content_type + "\r\n\r\n" + content + "\r\n")
send_to := strings.Split(to, ";")
//检测是否是邮件地址
for k, _ := range send_to {
match, _ := regexp.MatchString("[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?", send_to[k])
if !match {
return errors.New("Format Error")
}
}
err := smtp.SendMail(host, auth, user, send_to, msg)
if err != nil {
return err
}
return err
}
func SendToMailTpl(title, user, password, host, to, tplname string, content interface{}, mailtype string, ifgenerate bool) error {
var content_type string
var paseresult bytes.Buffer
writer := bufio.NewWriter(&paseresult)
hp := strings.Split(host, ":")
auth := smtp.PlainAuth("", user, password, hp[0])
if mailtype == "html" {
content_type = "Content-Type: text/" + mailtype + "; charset=UTF-8"
} else {
content_type = "Content-Type: text/plain" + "; charset=UTF-8"
}
//todo 获取模板文件内容
tpl, err := GetTemplateFile(tplname)
if err != nil {
log.Println(err.Error())
return err
}
//todo 渲染
tparse := template.New(tplname)
tparse, _ = tparse.Parse(string(tpl))
tparse.Execute(writer, content)
writer.Flush()
if err != nil {
log.Println(err.Error())
return err
}
msg := []byte("To: " + to + "\r\nFrom: " + user + "\r\nSubject: " + title + "\r\n" +
content_type + "\r\n\r\n" + paseresult.String() + "\r\n")
send_to := strings.Split(to, ";")
//todo 如果生成Html文件
if ifgenerate {
file, err := os.Create(PATH_STATIC + tplname + ".html")
if err != nil {
log.Println(err.Error())
}
file.WriteString(paseresult.String())
file.Close()
}
//检测是否是邮件地址
for k, _ := range send_to {
match, _ := regexp.MatchString("[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?", send_to[k])
if !match {
return errors.New("Format Error")
}
}
err = smtp.SendMail(host, auth, user, send_to, msg)
if err != nil {
return err
}
return err
}
/*
func OnSendEmailSendCloud(c *gin.Context){
var req ReqSendEmail
var resp mysqlcurd.RespJson
defer func() {
c.JSON(200, resp)
}()
e := c.Bind(&req)
if e!= nil{
log.Println(e.Error())
resp.Msg = "ParaErr"
return
}
sendcloud.UpdateApiInfo("a7458969_test_KIIqjl", "ovErXj6M8UJeiPJt")
var to = make([]map[string]string, 1)
to[0] = map[string]string{"to":"290198252@qq.com", "%url%": "http://www.baidu.com"}
var ok, err, result = sendcloud.SendTemplateMail("test_template_active", "290198252@sendcloud.org", "测试", "", "测试", to, nil)
if err != nil{
log.Print(err.Error())
resp.Msg = "Fail"
}
if !ok{
resp.Msg = "Fail"
}
resp.Msg = result
}*/
/*
{
"tittle":"运维通知",
"from":"c7458969@163.com",
"to":"290198252@qq.com",
"template":"test",
"generate":true,
"temp_data":{
"content":"f发撒旦法时代阿达是否",
"title":"运维通知2",
"topimg":"http://img2.imgtn.bdimg.com/it/u=387283908,3372540416&fm=27&gp=0.jpg",
"button1text":"客服热线",
"button1url":"http://www.baidu.com",
"button2text":"查看详情",
"button2url":"http://www.baidu.com",
"logoimg":"http://news.tom.com/dimg/2016/1027/img-1479784632271.jpg"
}
}
*/
//from: 发送人邮箱
//to:接收邮件,可以是"290198252@qq.com;29019822@qq.com;2901982@qq.com" 邮箱之间用分号隔开
//template:模板名字
//content :网页模板的参数 key-value结构
//temp_data 模板内具体要替换的变量名字 Key-value结构
//generate 是否生成静态html
func OnSendEmailTpl(c *gin.Context) {
var req ReqSendEmailTpl
var resp RespJson
defer func() {
c.JSON(200, resp)
}()
e := c.Bind(&req)
if e != nil {
log.Println(e.Error())
resp.Msg = "ParaErr"
return
}
user := "c7458969@163.com"
password := "caiyu123"
host := "smtp.163.com:25"
//抄送给自己
//e = SendToMail(user,password,host,req.From,req.Template,req.Content,"html")
//发送
e = SendToMailTpl(req.Tittle, user, password, host, req.To, req.Template, req.TempData, "html", req.Generate)
if nil != e {
log.Println(e.Error())
resp.Msg = "Error"
return
}
resp.Msg = "OK"
}
//from: 发送人邮箱
//to:接收邮件,可以是"290198252@qq.com;29019822@qq.com;2901982@qq.com" 邮箱之间用分号隔开
//template:模板名字
//content :网页模板的参数 key-value结构
//temp_data 模板内具体要替换的变量名字 Key-value结构
//generate 是否生成静态html
func (this *MailController) OnSendEmailCode(c *gin.Context) {
var req ReqSendEmail
var resp RespJson
defer func() {
c.JSON(200, resp)
}()
e := c.Bind(&req)
if e != nil {
log.Println(e.Error())
resp.Msg = "ParaErr"
return
}
if req.Email != "" {
type Count struct {
Count int32 `json:"count"`
}
cnt := []Count{}
query := fmt.Sprintf("select count(*) as count from users where users.email_address = '%s'", req.Email)
e := db.GetMysqlClient().Query2(query, &cnt)
if nil != e {
log.Println(e.Error())
return
}
} else {
return
}
user := "c7458969@163.com"
password := "caiyu123"
host := "smtp.163.com:25"
//抄送给自己
//e = SendToMail(user,password,host,req.From,req.Template,req.Content,"html")
//发送
verCode := CreateVerify(6)
content := "您的验证码是" + verCode
userKey := fmt.Sprintf("user_%s_verify", req.Email)
config.RedisOne().Set(userKey, verCode, time.Hour*24)
e = SendToMailWithUserInfo("后台管理系统验证码", user, password, host, req.Email, content)
if nil != e {
log.Println(e.Error())
resp.Msg = "Error"
return
}
resp.Msg = "OK"
}