package mokuai import ( "bytes" "crypto/tls" "encoding/json" "errors" "fmt" gomail "gopkg.in/gomail.v2" "io/ioutil" "math/rand" "net/http" "regexp" "strings" "time" ) type monitormail struct { Smtpurl string `gorm:"smtpurl" json:"smtpurl"` // smtp服务器 Smtpport int `gorm:"smtpport" json:"smtpport"` // smtp 端口 Smtpuser string `gorm:"smtpuser" json:"smtpuser"` // 邮箱账号 Smtpname string `gorm:"smtpname" json:"smtpname"` // 发件人别名 Smtppasswd string `gorm:"smtppasswd" json:"smtppasswd"` // 邮箱密码/授权码 Smtpssl int `gorm:"smtpssl" json:"smtpssl"` // 是否启用SSL . (1. 启用 ) Sendmail string `gorm:"sendmail" json:"sendmail"` // 发送到的邮箱 } // 钉钉通知 文本内容 Sign方式 // webhook_url 文本型 机器人webhook URL ; // text 文本型 通知的消息内容 ; // secret 文本型 机器人安全设置内的加签 ; // atMobiles 文本型 被@人的手机号,多个用|隔开 ; (与 ”是否@所有人“ 互斥) // isAtAll 布尔型 ,是否@所有人。 (与 ”被@人的手机号“ 互斥 ,两者都有此为优先) func Tools_DingToInfo(webhook_url, text, secret, atMobiles string, isAtAll bool) bool { timestamp := time.Now().UnixNano() / 1e6 stringToSign := fmt.Sprintf("%d\n%s", timestamp, secret) sign := Hash_hmacSha256_en(stringToSign, secret) url := fmt.Sprintf("%s×tamp=%d&sign=%s", webhook_url, timestamp, sign) var mobilezu []string if Text_FindKeyword(atMobiles, "|") != -1 { mobilezu = Text_GetSplitText(atMobiles, "|") } else { mobilezu = append(mobilezu, atMobiles) } content, data, at := make(map[string]string), make(map[string]interface{}), make(map[string]interface{}) content["content"] = text at["atMobiles"] = mobilezu at["isAtAll"] = isAtAll data["msgtype"] = "text" data["text"] = content data["at"] = at b, _ := json.Marshal(data) resp, err := http.Post(url, "application/json", bytes.NewBuffer(b)) if err != nil { fmt.Println("DingToInfo ERROR :", err) return false } defer resp.Body.Close() // body, _ := ioutil.ReadAll(resp.Body) // fmt.Println(string(body)) return true } // 获取本机公网出口IP . 失败返回空 // n 为 访问哪个接口获取。 0为随机 ; 1. h.myip.top ; 2. myip.top ; 3. myip.zzznb.cc ; 4. HTTP ip检测接口 ; func Tools_GetPublicIP_Api(n int) string { if n == 0 { n = int(Text_GetRandNumInRange(1, 4)) } var resp *http.Response var err error if n == 1 { resp, err = http.Get("http://h.myip.top/") if err != nil { return "" } } else if n == 2 { resp, err = http.Get("http://myip.top/") if err != nil { return "" } } else if n == 3 { resp, err = http.Get("http://myip.zzznb.cc/") if err != nil { return "" } } else if n == 4 { resp, err = http.Get("http://106.15.239.72/myip") if err != nil { return "" } } defer resp.Body.Close() lin, _ := ioutil.ReadAll(resp.Body) ip := "" linzu := Text_GetSplitText(string(lin), ",") for _, v := range linzu { if Text_FindKeyword(v, "ip") != -1 { ip = Text_GetBetween(Text_GetRightText(v, ":"), "\"", "\"") } } return ip } // 检测IP正确性 func Tools_ChkIp(ip string) bool { r, _ := regexp.Compile("^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$") if !r.MatchString(ip) { return false } return true } // 随机生成mac func Tools_RandMac() string { var m [6]byte rand.Seed(time.Now().UnixNano()) for i := 0; i < 6; i++ { mac_byte := rand.Intn(256) m[i] = byte(mac_byte) rand.Seed(int64(mac_byte)) } return fmt.Sprintf("%02x:%02x:%02x:%02x:%02x:%02x", m[0], m[1], m[2], m[3], m[4], m[5]) } // 发送邮件 func Tool_sendmail(euser monitormail, mailSubject, mailBody string) (isOk bool, err error) { if mailSubject == "" { return false, errors.New("mailSubject is Null") } if mailBody == "" { return false, errors.New("mailBody is Null") } if euser.Smtpurl == "" { return false, errors.New("Smtpurl is Null") } if euser.Smtpport <= 0 { return false, errors.New("Smtpport is Null") } if euser.Sendmail == "" { return false, errors.New("Sendmail is Null") } if euser.Smtpuser == "" { return false, errors.New("Smtpuser is Null") } m := gomail.NewMessage() if euser.Smtpname != "" { m.SetHeader("From", euser.Smtpname+"<"+euser.Smtpuser+">") } else { m.SetHeader("From", euser.Smtpuser) } u := strings.Split(euser.Sendmail, ",") m.SetHeader("To", u...) m.SetHeader("Subject", mailSubject) m.SetBody("text/html", mailBody) /* if files != "" { // 添加附件 f := strings.Split(files, ",") for _, i := range f { m.Attach(i) } }*/ // d := gomail.NewDialer(euser.Smtpurl, euser.Smtpport, euser.Smtpuser, euser.Smtppasswd) if euser.Smtpssl == 1 { // 开启SSL协议认证 d.TLSConfig = &tls.Config{InsecureSkipVerify: true} } // Send the email to Bob, Cora and Dan. err = d.DialAndSend(m) if err == nil { isOk = true } else { isOk = false } return }