123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- 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
- }
|