zhengkun 3 yıl önce
ebeveyn
işleme
3081a34692

+ 116 - 11
get_assign/src/main.go

@@ -28,6 +28,8 @@ func initMgo()  {
 		UserName:    "zhengkun",
 	}
 	save_mgo.InitPool()
+
+	log.Println("init mgo 加载完毕...")
 }
 
 func init() {
@@ -38,19 +40,121 @@ func init() {
 
 func main()  {
 	//定时任务
+	log.Println("部署...定时任务...")
 	c := cron.New()
 	c.AddFunc("0 30 7 ? * *", func() {
-		exportSpecSiteDataWeek() //周邮件-每周1点    8点
-		exportSpecSiteDataMonth() //月邮件-每月1号   8点
+		exportSpecSiteDataDay() //日邮件-每天
+		exportSpecSiteDataWeek() //周邮件-每周一
+		exportSpecSiteDataMonth() //月邮件-每月1号
 	})
 	c.Start()
 
-	//立即处理一次
-	exportSpecSiteDataWeek()
-	exportSpecSiteDataMonth()
+	time.Sleep(99999*time.Hour)
+}
 
+//处理数据-周邮件
+func exportSpecSiteDataDay() {
+	log.Println("每天:准备邮件数据...")
+	now:=time.Now()
+	durdays:=1
+	start:= time.Date(now.Year(), now.Month(), now.Day()-durdays, 0, 0, 0, 0, time.Local).Unix()
+	end := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix()
 
-	time.Sleep(99999*time.Hour)
+	log.Println(start,end)
+	q := map[string]interface{}{
+		"comeintime": map[string]interface{}{
+			"$gte":  start,
+			"$lt": end,
+		},
+	}
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	log.Println("bidding 查询条件:",q)
+	//省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
+	it_site := sess.DB(save_mgo.DbName).C(save_c_name).Find(&q).Sort("comeintime").Select(map[string]interface{}{
+		"area":1,
+		"title":1,
+		"toptype":1,
+		"publishtime":1,
+		"href":1,
+		"projectname":1,
+		"site":1,
+	}).Iter()
+	timeLayout := "2006-01-02"
+	total,isok,dataArr:= 0,0,make([]map[string]string,0)
+	for tmp := make(map[string]interface{}); it_site.Next(&tmp); total++ {
+		if total%10000 == 0 {
+			log.Println("cur index :", total,isok)
+		}
+		toptype:=qu.ObjToString(tmp["toptype"])
+		if toptype=="拟建"||toptype=="预告"||toptype=="招标"||toptype=="采购意向" {
+			site:=qu.ObjToString(tmp["site"])
+			area:=qu.ObjToString(tmp["area"])
+			projectname:=qu.ObjToString(tmp["projectname"])
+			publishtime:=qu.Int64All(tmp["publishtime"])
+			new_publishtime := ""//转日期
+			if publishtime>0 {
+				new_publishtime = time.Unix(publishtime, 0).Format(timeLayout)
+			}
+			href:=qu.ObjToString(tmp["href"])
+			title:=qu.ObjToString(tmp["title"])
+
+			if (site=="上海政府采购网" || site=="中国政府采购网") && area=="上海"  {
+				isok++
+				dataArr = append(dataArr, map[string]string{
+					"area":area,
+					"toptype":toptype,
+					"title":title,
+					"projectname":projectname,
+					"site":site,
+					"publishtime":new_publishtime,
+					"href":href,
+					"jyhref":fmt.Sprintf(Url, qu.CommonEncodeArticle("content", BsonTOStringId(tmp["_id"]))),
+				})
+			}
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Println("is site over :",total,isok)
+
+	end_str := time.Unix(end-1, 0).Format(timeLayout)
+	xlsxName := "上海通服:"+end_str+".xlsx"
+	log.Println("邮件名:",xlsxName)
+	os.Remove(xlsxName)
+	f :=xlsx.NewFile()
+	sheet, _ := f.AddSheet("上海数据")
+	row := sheet.AddRow()
+	//省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
+	row.AddCell().Value = "省份"
+	row.AddCell().Value = "公告类别"
+	row.AddCell().Value = "公告标题"
+	row.AddCell().Value = "项目名称"
+	row.AddCell().Value = "发布时间"
+	row.AddCell().Value = "来源网站"
+	row.AddCell().Value = "公告地址"
+	row.AddCell().Value = "剑鱼地址"
+
+	for _,tmp:=range dataArr {
+		row = sheet.AddRow()
+		row.AddCell().SetString(tmp["area"])
+		row.AddCell().SetString(tmp["toptype"])
+		row.AddCell().SetString(tmp["title"])
+		row.AddCell().SetString(tmp["projectname"])
+		row.AddCell().SetString(tmp["publishtime"])
+		row.AddCell().SetString(tmp["site"])
+		row.AddCell().SetString(tmp["href"])
+		row.AddCell().SetString(tmp["jyhref"])
+	}
+	err := f.Save(xlsxName)
+
+	if err != nil {
+		log.Println("保存xlsx失败:", err)
+		sendWarningSmtp("保存xlsx异常","请检查...上海通服...")
+	}else {
+		log.Println("保存xlsx成功:", err)
+		body_str := fmt.Sprintf("日期:%s\t\t总计:%d条",end_str,isok)
+		sendErrMailSmtp("上海通服数据~天",body_str,xlsxName)
+	}
 }
 
 //处理数据-周邮件
@@ -62,7 +166,7 @@ func exportSpecSiteDataWeek() {
 	}
 	log.Println("每周一:准备邮件数据...")
 	now:=time.Now()
-	durdays:=7*2
+	durdays:=7
 	start:= time.Date(now.Year(), now.Month(), now.Day()-durdays, 0, 0, 0, 0, time.Local).Unix()
 	end := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix()
 
@@ -166,16 +270,17 @@ func exportSpecSiteDataWeek() {
 
 //处理数据-月邮件
 func exportSpecSiteDataMonth() {
-	cur_time := time.Now().Unix()
 	cur_day := time.Now().Day()
 	if cur_day!=1 {
 		return
 	}
-	today := GetOneWeekDay(TimeStampToString(cur_time))
+	//cur_time := time.Now().Unix()
+	//today := GetOneWeekDay(TimeStampToString(cur_time))
+	//durdays:=int64(7)+today-int64(1)
+
 	log.Println("每月1号:准备邮件数据...")
 	now:=time.Now()
-	durdays:=int64(7)+today-int64(1)
-	start:= time.Date(now.Year(), now.Month(), now.Day()-int(durdays), 0, 0, 0, 0, time.Local).Unix()
+	start:= time.Date(now.Year(), now.Month()-1, now.Day(), 0, 0, 0, 0, time.Local).Unix()
 	end := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix()
 
 	log.Println(start,end)

+ 29 - 22
listen_data/src/main.go

@@ -78,27 +78,36 @@ func init() {
 
 func main()  {
 
-	python_mgo = &MongodbSim{
-		MongodbAddr: "172.17.145.163:27083,172.17.4.187:27082",
-		DbName:      "mixdata",
-		Size:        20,
-		UserName: "zhengkun",
-		Password: "zk@123123",
-	}
-	python_mgo.InitPool()
+	//python_mgo = &MongodbSim{
+	//	MongodbAddr: "172.17.145.163:27083,172.17.4.187:27082",
+	//	DbName:      "mixdata",
+	//	Size:        10,
+	//	UserName: "zhengkun",
+	//	Password: "zk@123123",
+	//}
+	//python_mgo.InitPool()
+
+	//save_mgo = &MongodbSim{
+	//	MongodbAddr: "172.17.4.85:27080",
+	//	DbName:      "qfw",
+	//	Size:        10,
+	//	UserName: "",
+	//	Password: "",
+	//}
+	//save_mgo.InitPool()
 
 	save_mgo = &MongodbSim{
-		MongodbAddr: "172.17.4.85:27080",
-		DbName:      "qfw",
-		Size:        20,
+		MongodbAddr: "172.17.4.87:27080",
+		DbName:      "spider",
+		Size:        10,
 		UserName: "",
 		Password: "",
 	}
 	save_mgo.InitPool()
 
 	//save_mgo = &MongodbSim{
-	//	MongodbAddr: "172.17.4.87:27080",
-	//	DbName:      "datamark",
+	//	MongodbAddr: "127.0.0.1:27017",
+	//	DbName:      "zhengkun",
 	//	Size:        10,
 	//	UserName: "",
 	//	Password: "",
@@ -106,19 +115,21 @@ func main()  {
 	//save_mgo.InitPool()
 
 	//save_mgo = &MongodbSim{
-	//	MongodbAddr: "127.0.0.1:27017",
-	//	DbName:      "zhengkun",
+	//	MongodbAddr: "172.17.145.163:27083,172.17.4.187:27082",
+	//	DbName:      "qfw",
 	//	Size:        10,
-	//	UserName: "",
-	//	Password: "",
+	//	UserName: "zhengkun",
+	//	Password: "zk@123123",
 	//}
 	//save_mgo.InitPool()
 
-	exportRepairNewStandData()
+
+	//dealWithQyBdwBidData()
 
 	return
 
 
+
 	c := cron.New()
 	c.AddFunc("0 50 8 ? * *", func() { dealWithSiteData() })
 	c.Start()
@@ -183,10 +194,6 @@ func dealWithSiteData()  {
 	}).Iter()
 	total:= 0
 	for tmp := make(map[string]interface{}); it_site.Next(&tmp); total++ {
-		//if total%100000 == 0 {
-		//	log.Println("current:", total)
-		//}
-
 		site:=qu.ObjToString(tmp["site"])
 		comeintime:=qu.Int64All(tmp["comeintime"])
 		time_key :=TimeStampToString(comeintime)

Dosya farkı çok büyük olduğundan ihmal edildi
+ 2383 - 58
listen_data/src/zkmethod.go


+ 7 - 7
vps_server/src/config.json

@@ -13,7 +13,6 @@
     "专用-芜湖",
     "专用-南京",
     "专用-南通",
-    "专用-秦皇岛",
     "专用-三明",
     "专用-驻马店",
     "专用-淮北",
@@ -26,18 +25,15 @@
     "数据-大连",
     "数据-黄山",
     "数据-荆州",
-    "数据-聊城",
     "数据-洛阳",
     "数据-宁德",
     "数据-厦门",
     "数据-宿迁",
     "数据-信阳",
-    "数据-珠海",
     "数据-泉州",
     "数据-苏州",
     "数据-锦州",
     "数据-漳州",
-    "数据-丽水",
     "数据-无锡",
     "数据-衢州",
     "附件-北京",
@@ -50,12 +46,15 @@
     "附件-漯河",
     "附件-荆门",
     "附件-景德镇",
-    "附件-上海",
     "附件-福州",
     "附件-天津",
     "附件-合肥",
     "附件-宁德"
   ],
+  "extIDs" : [
+    "6601",
+    "6602"
+  ],
   "during": 10,
   "isErr" : 3,
   "smtpMail": {
@@ -67,7 +66,8 @@
     "pwd":      "xomkphsjsamybdbj"
   },
   "jkmail": {
-    "to": "zhaoyujian@topnet.net.cn,zhangjinkun@topnet.net.cn",
+    "tovps": "zhaoyujian@topnet.net.cn",
+    "toext": "zhengkun@topnet.net.cn,zhangjinkun@topnet.net.cn",
     "api": "http://172.17.145.179:19281/_send/_mail"
   }
-}
+}

+ 82 - 61
vps_server/src/main.go

@@ -14,36 +14,29 @@ var (
 	sysconfig			map[string]interface{} //配置文件
 	port				string
 	save_mgo        	*MongodbSim
-	idsArr				[]string
-	dataTmp				map[string]map[string]interface{}
+	idsArr,extArr		[]string
+	vpsTmp				map[string]map[string]interface{}
+	extTmp				map[string]interface{}
 	during,isErr		int64
 	test				map[string]interface{}
 	updatelock 			sync.Mutex
 	save_coll_name		string
 )
+
+
+
+
 func init()  {
 	//加载配置文件
 	log.Println("加载...")
 	qu.ReadConfig(&sysconfig)
 	port = sysconfig["port"].(string)
-	arr := sysconfig["vpsIDs"].([]interface{})
-	idsArr = qu.ObjArrToStringArr(arr)
-
+	arr1 := sysconfig["vpsIDs"].([]interface{})
+	idsArr = qu.ObjArrToStringArr(arr1)
+	arr2 := sysconfig["extIDs"].([]interface{})
+	extArr = qu.ObjArrToStringArr(arr2)
 
-
-	updatelock.Lock()
-	dataTmp = make(map[string]map[string]interface{},0)
-	for _,v := range idsArr{
-		id := qu.ObjToString(v)
-		dataTmp[id] = map[string]interface{}{
-			"isHeart":0,
-			"isErrNum":0,
-			"isProcess" : 0,
-			"isVpsMail":0,
-			"isProMail":0,
-		}
-	}
-	updatelock.Unlock()
+	resetRecordData()
 
 	during = qu.Int64All(sysconfig["during"])
 	isErr = qu.Int64All(sysconfig["isErr"])
@@ -56,13 +49,9 @@ func init()  {
 		Size:        qu.IntAllDef(saveconf["pool"], 5),
 	}
 	save_mgo.InitPool()
-
-
 	log.Println("准备完毕...")
 }
 
-
-
 func main() {
 
 	//http://monitor.spdata.jianyu360.com/,程序端口7811
@@ -73,60 +62,39 @@ func main() {
 	//每隔1分钟执行一次:0 */1 * * * ?   每隔5秒执行一次:*/5 * * * * ?
 
 	spec :=fmt.Sprintf("30 */%d * * * ?",during)
-	//spec =fmt.Sprintf("*/%d * * * * ?",during)
-
 	spec_reset := "0 0 0 * * ?"
-
+	spec_extract :=fmt.Sprintf("20 */%d * * * ?",during)
 	c := cron.New()
 	c.AddFunc(spec, func() { taskFinishing()})
 	c.AddFunc(spec_reset, func() { resetRecordData()})
+	c.AddFunc(spec_extract, func() { extractRunning()})
 	c.Start()
-
-
-
 	time.Sleep(99999 * time.Hour)
 }
 
-func resetRecordData()  {
-	updatelock.Lock()
-	log.Println("重置数据...")
-	dataTmp = make(map[string]map[string]interface{},0)
-	for _,v := range idsArr{
-		id := qu.ObjToString(v)
-		dataTmp[id] = map[string]interface{}{
-			"isHeart":0,
-			"isErrNum":0,
-			"isProcess" : 0,
-			"isVpsMail":0,
-			"isProMail":0,
-		}
-	}
-	log.Println("重置数据...",len(dataTmp))
-	updatelock.Unlock()
-}
-
-
 func handler(w http.ResponseWriter, r *http.Request) {
 	updatelock.Lock()
 	r.ParseForm() //解析参数,默认是不会解析的
 	if r.Method == "GET" {
 		vpsid ,process,isProMail:= "",int64(0),int64(0)
+		extid :=""
 		for k, v := range r.Form {
 			if k=="id" {
 				vpsid = strings.Join(v, "")
-				isProMail = qu.Int64All(dataTmp[vpsid]["isProMail"])
+				isProMail = qu.Int64All(vpsTmp[vpsid]["isProMail"])
 			}else if k=="process" {
 				process = qu.Int64All(strings.Join(v, ""))
 				if process==0 {
 					isProMail = 0
 				}
-
+			}else if k=="extract" {
+				extid = strings.Join(v, "")
 			}else {
 
 			}
 		}
-		if vpsid!="" { //改变-旧状态
-			dataTmp[vpsid] = map[string]interface{}{
+		if vpsid!="" {
+			vpsTmp[vpsid] = map[string]interface{}{
 				"isHeart":1,
 				"isErrNum":0,
 				"isVpsMail":0,   //收到心跳-vps邮件重置为0,可以发
@@ -135,7 +103,9 @@ func handler(w http.ResponseWriter, r *http.Request) {
 			}
 		}
 
-		//log.Println("接收Get请求:",dataTmp[vpsid])
+		if extid!="" {
+			extTmp[extid] = time.Now().Unix()
+		}
 
 	} else if r.Method == "POST" {
 
@@ -146,25 +116,52 @@ func handler(w http.ResponseWriter, r *http.Request) {
 	updatelock.Unlock()
 }
 
+//重置数据
+func resetRecordData()  {
+	updatelock.Lock()
+	vpsTmp = make(map[string]map[string]interface{},0)
+	for _,v := range idsArr{
+		id := qu.ObjToString(v)
+		vpsTmp[id] = map[string]interface{}{
+			"isHeart":0,
+			"isErrNum":0,
+			"isProcess" : 0,
+			"isVpsMail":0,
+			"isProMail":0,
+		}
+	}
+	log.Println("重置数据vps...",len(vpsTmp))
+
+
+	extTmp = make(map[string]interface{},0)
+	for _,v := range extArr{
+		extid := qu.ObjToString(v)
+		extTmp[extid] = time.Now().Unix()
+
+	}
+	log.Println("重置ext数据...")
+
+
+	updatelock.Unlock()
+}
 //不断监听处理
 func taskFinishing()  {
 	//加锁
 	updatelock.Lock()
 	log.Println("...处理一次...")
-
 	isVpsMailContent,isProMailContent:= "",""
 	for _ , vpsid := range idsArr {
 		//此标识-是否正常
 		//log.Println("原:",dataTmp[vpsid])
-		isHeart,isProcess:= qu.Int64All(dataTmp[vpsid]["isHeart"]),qu.Int64All(dataTmp[vpsid]["isProcess"])
+		isHeart,isProcess:= qu.Int64All(vpsTmp[vpsid]["isHeart"]),qu.Int64All(vpsTmp[vpsid]["isProcess"])
 		isErrNum := int64(0)
-		isVpsMail,isProMail := qu.Int64All(dataTmp[vpsid]["isVpsMail"]),qu.Int64All(dataTmp[vpsid]["isProMail"])
+		isVpsMail,isProMail := qu.Int64All(vpsTmp[vpsid]["isVpsMail"]),qu.Int64All(vpsTmp[vpsid]["isProMail"])
 		if isVpsMail == 1 { //送过邮件了
 			//log.Println("发过vps邮件","心跳:",isHeart,"次数:",isErrNum,"下载器:",isProcess,"vps邮件:",isVpsMail,"pro邮件:",isProMail)
 			continue
 		}
 		if isHeart == 0 { //未接收心跳反应,错误+1
-			isErrNum = qu.Int64All(dataTmp[vpsid]["isErrNum"])
+			isErrNum = qu.Int64All(vpsTmp[vpsid]["isErrNum"])
 			isErrNum ++
 		}
 		if isErrNum > isErr { //错误超过一定次数,发邮件vps异常
@@ -189,8 +186,7 @@ func taskFinishing()  {
 
 		//log.Println("处理后:","心跳:",0,"次数:",isErrNum,"下载器:",isProcess,"vps邮件:",isVpsMail,"pro邮件:",isProMail)
 
-
-		dataTmp[vpsid] = map[string]interface{}{
+		vpsTmp[vpsid] = map[string]interface{}{
 			"isHeart":0,
 			"isErrNum":isErrNum,
 			"isProcess":isProcess,
@@ -212,7 +208,7 @@ func taskFinishing()  {
 			"detail" : isVpsMailContent,
 		})
 
-		sendErrMailApi("vps",isVpsMailContent)
+		sendErrVpsMailApi("vps",isVpsMailContent)
 	}else {
 		if isProMailContent !="" {
 			log.Println("发邮件:下载器异常...",isProMailContent)
@@ -224,10 +220,35 @@ func taskFinishing()  {
 				"detail" : isProMailContent,
 			})
 
-			sendErrMailApi("下载器异常",isProMailContent)
+			sendErrVpsMailApi("下载器异常",isProMailContent)
 		}
 	}
 
 	updatelock.Unlock()
 
+}
+//抽取活跃监测
+func extractRunning()  {
+	log.Println("...抽取活跃处理一次...")
+	isSend := false
+	for _,v := range extTmp{
+		t := qu.Int64All(v)
+		now_time := time.Now().Unix()
+		if now_time-t > int64(1800) {
+			isSend = true//有异常发邮件
+			break
+		}
+	}
+	if isSend {
+		updatelock.Lock()
+		extTmp = make(map[string]interface{},0)
+		for _,v := range extArr{
+			extid := qu.ObjToString(v)
+			extTmp[extid] = time.Now().Unix()
+
+		}
+		//发送邮件
+		sendErrExtMailApi("抽取程序异常","抽取程序超半小时未响应...清检查")
+		updatelock.Unlock()
+	}
 }

+ 56 - 32
vps_server/src/mark

@@ -1,49 +1,73 @@
-"vpsIDs" : [
-    "专用-常州",
-    "专用-杭州",
+{
+  "port": "7811",
+  "save_mgodb": {
+    "addr": "172.17.4.87:27080",
+    "db": "editor",
+    "coll": "monitor_other",
+    "pool": 5
+  },
+  "vpsIDs" : [
+    "专用-蚌埠",
     "专用-合肥",
     "专用-莱芜",
+    "专用-芜湖",
+    "专用-南京",
     "专用-南通",
-    "专用-秦皇岛",
-    "专用-威海",
+    "专用-三明",
     "专用-驻马店",
-    "专用-池州",
+    "专用-淮北",
     "专用-菏泽",
     "专用-淮南",
-    "专用-嘉兴",
+    "专用-徐州",
     "专用-宣城",
-    "数据-桂林",
+    "数据-莆田",
+    "数据-池州",
+    "数据-大连",
     "数据-黄山",
     "数据-荆州",
-    "数据-聊城",
     "数据-洛阳",
     "数据-宁德",
-    "数据-衢州",
-    "数据-三亚",
     "数据-厦门",
-    "数据-汕头",
-    "数据-信阳",
     "数据-宿迁",
-    "数据-盐城",
-    "数据-中山",
-    "数据-镇江",
-    "数据-珠海",
-    "数据-成都",
-    "数据-莆田",
-    "数据-湖州",
+    "数据-信阳",
+    "数据-泉州",
     "数据-苏州",
-    "数据-台州",
-    "数据-舟山",
+    "数据-锦州",
+    "数据-漳州",
+    "数据-无锡",
+    "数据-衢州",
+    "附件-北京",
     "附件-亳州",
-    "附件-葫芦岛",
-    "附件-马鞍山",
-    "附件-濮阳",
+    "附件-济南",
     "附件-绍兴",
     "附件-石家庄",
-    "附件-云浮",
-    "代理-北京",
-    "代理-杭州",
-    "代理-济南",
-    "代理-开封",
-    "代理-扬州"
-  ],
+    "附件-扬州",
+    "附件-阜阳",
+    "附件-漯河",
+    "附件-荆门",
+    "附件-景德镇",
+    "附件-福州",
+    "附件-天津",
+    "附件-合肥",
+    "附件-宁德"
+  ],
+  "extIDs" : [
+    "6601",
+    "6602"
+  ],
+  "during": 10,
+  "isErr" : 3,
+  "smtpMail": {
+    "from": "zhengkun@topnet.net.cn",
+    "to": "zhengkun@topnet.net.cn",
+    "smtpHost": "smtp.qq.com",
+    "smtpPort": "465",
+    "user":     "920032221@qq.com",
+    "pwd":      "xomkphsjsamybdbj"
+  },
+  "jkmail": {
+    "tovps": "zhaoyujian@topnet.net.cn",
+    "toext": "zhengkun@topnet.net.cn,zhangjinkun@topnet.net.cn",
+    "api": "http://172.17.145.179:19281/_send/_mail"
+  }
+}

+ 19 - 2
vps_server/src/sendmail.go

@@ -44,10 +44,27 @@ func sendErrMailSmtp(title,body string) {
 
 
 //api模式 二选一皆可
-func sendErrMailApi(title,body string)  {
+func sendErrVpsMailApi(title,body string)  {
 	jkmail, _ := sysconfig["jkmail"].(map[string]interface{})
 	if jkmail != nil {
-		tomail, _ = jkmail["to"].(string)
+		tomail, _ = jkmail["tovps"].(string)
+		api, _ = jkmail["api"].(string)
+	}
+	log.Println(tomail,api)
+	res, err := http.Get(fmt.Sprintf("%s?to=%s&title=%s&body=%s", api, tomail, title, body))
+	if err == nil {
+		defer res.Body.Close()
+		read, err := ioutil.ReadAll(res.Body)
+		log.Println("邮件发送成功:", string(read), err)
+	}else {
+		log.Println("邮件发送失败:", err)
+	}
+}
+
+func sendErrExtMailApi(title,body string)  {
+	jkmail, _ := sysconfig["jkmail"].(map[string]interface{})
+	if jkmail != nil {
+		tomail, _ = jkmail["toext"].(string)
 		api, _ = jkmail["api"].(string)
 	}
 	log.Println(tomail,api)

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor