使用golang每天给自己发送一封天气预报的邮件 - Go语言中文社区

使用golang每天给自己发送一封天气预报的邮件


 

一、介绍

基于golang开发每天通过邮件发送天气信息

github地址:https://github.com/betterfor/weather.git

二、要点

1、获取天气的api

2、发送邮件

3、定时

三、获取天气api

比较百度地图和高德地图,百度地图的天气接口已经取消,高德地图的使用也较为简单。

申请key

天气查询API服务地址:

https://restapi.amap.com/v3/weather/weatherInfo?parameters
  • 请求参数

参数名

含义

规则说明

是否必须

缺省值

key

请求服务权限标识

用户在高德地图官网申请web服务API类型KEY

必填

city

城市编码

输入城市的adcode,adcode信息可参考城市编码表

必填

extensions

气象类型

可选值:base/all

base:返回实况天气

all:返回预报天气

可选

output

返回格式

可选值:JSON,XML

可选

JSON

  • 返回结果参数说明

行政区域查询的响应结果的格式由请求参数output指定。天气对照表>>

名称

含义

规则说明

status

返回状态

值为0或1

1:成功;0:失败

count

返回结果总数目

 

info

返回的状态信息

 

infocode

返回状态说明,10000代表正确

 

forecast

预报天气信息数据

 

 

city

城市名称

 

 

adcode

城市编码

 

 

province

省份名称

 

 

reporttime

预报发布时间

 

 

casts

预报数据list结构,元素cast,按顺序为当天、第二天、第三天的预报数据

 

 

 

date

日期

 

 

 

week

星期几

 

 

 

dayweather

白天天气现象

 

 

 

nightweather

晚上天气现象

 

 

 

daytemp

白天温度

 

 

 

nighttemp

晚上温度

 

 

 

daywind

白天风向

 

 

 

nightwind

晚上风向

 

 

 

daypower

白天风力

 

 

 

nightpower

晚上风力

 

获取网络请求

func doHttpGetRequest(url string) (rlt string,err error)  {
	resp,err := http.Get(url)
	if err!=nil {
		return "",err
	} else {
		defer resp.Body.Close()
		body,err := ioutil.ReadAll(resp.Body)
		if err != nil {
			return "",err
		} else {
			return string(body),err
		}
	}
}

获取天气信息

func getWeather() (string,string,error) {
	url := "https://restapi.amap.com/v3/weather/weatherInfo?"
	key := "你的appkey"
	city := "370211"
	ext := "all"
	rlt,err:=doHttpGetRequest(url + "city=" + city + "&key=" + key + "&extensions=" + ext)
	var data Weather
	var fore Forecast
	var cast Cast
	json.Unmarshal([]byte(rlt),&data)
	if err != nil {
		return err.Error(),"",err
	} else {
		fore = data.Forecasts[0]
		output := fore.Province + fore.City + " 预报时间:" + fore.Reporttime + "n"
		var str,subject string
		for i := 0; i < len(fore.Casts); i++ {
			cast = fore.Casts[i]
			str += "日期:" +cast.Date+ "t星期"+NumToStr(cast.Week)+
				"n白天:【天气:"+cast.Dayweather+"t	温度:"+cast.Daytemp+"t	风向:"+cast.Daywind+"t	风力:"+cast.Daypower+"】"+
				"n夜晚:【天气:"+cast.Nightweather+"t	温度:"+cast.Nighttemp+"tt	风向:"+cast.Nightwind+"t	风力:"+cast.Nightpower+"】rn"
		}
		subject = verity(fore.Casts[0].Dayweather,fore.Casts[0].Nightweather)
		return subject,output+str,nil
	}
}

一些小工具

func verity(dayweather,nightweather string) string {
	var sub string
	rain := "雨"
	snow := "雪"
	sub = "收藏点赞投硬币,新的一天会有好事发生哝 ||今日天气预报"
	if strings.Contains(dayweather,rain) || strings.Contains(nightweather,rain) {
		sub = sub + "今天将降雨,出门请别忘带伞"
	}
	if strings.Contains(dayweather,snow) || strings.Contains(nightweather,snow) {
		sub = sub + "    下雪了"
	}
	return sub
}

func NumToStr(str string) string {
	switch str {
	case "1":
		return "一"
	case "2":
		return "二"
	case "3":
		return "三"
	case "4":
		return "四"
	case "5":
		return "五"
	case "6":
		return "六"
	case "7":
		return "日"
	}
	return ""
}

接受到的天气信息

type Weather struct {
	Status 		string 		`json:"status"返回状态`
	Count		string		`json:"count"返回结果总条数`
	Info 		string		`json:"info"返回的状态信息`
	Infocode	string		`json:"infocode"返回状态说明`
	Forecasts 	[]Forecast	`json:"forecasts"预报天气信息数据`
}
type Forecast struct {
	City 		string		`json:"city"城市名称`
	Adcode		string		`json:"adcode"城市编码`
	Province	string		`json:"province"省份`
	Reporttime	string		`json:"reporttime"预报时间`
	Casts		[]Cast		`json:casts预报数据`
}
type Cast struct {
	Date 		string		`json:"date"日期`
	Week 		string		`json:"week"星期`
	Dayweather 	string		`json:"dayweather"白天天气`
	Nightweather string		`json:"nightweather"晚上天气`
	Daytemp		string		`json:"daytemp"白天温度`
	Nighttemp	string		`json:"nighttemp"晚上温度`
	Daywind		string		`json:"daywind"白天风向`
	Nightwind 	string		`json:"nightwind"晚上风向`
	Daypower 	string		`json:"daypower"白天风力`
	Nightpower	string		`json:"nightpower"晚上风力`
}

四、发送邮件

func sendToMail(user,password,host,to,subject,body,mailtype string) error {
	hp := strings.Split(host,":")
	auth := smtp.PlainAuth("",user,password,hp[0])
	var content_type string
	if mailtype =="html" {
		content_type = "Content_Type: text/" + mailtype + "; charset=UTF-8"
	} else {
		content_type = "Content_Type: text/plain" + "; charset=UTF-8"
	}

	msg := []byte("To:" + to +"rnFrom: " + user + "<"+
		user + ">rnSubject: "+ subject + "rn" +
		content_type + "rnrn" + body)
	send_to := strings.Split(to,";")
	err := smtp.SendMail(host,auth,user,send_to,msg)
	return err
}
func sendEmail(subject,body string)  {
	user := "发件箱"
	pwd := "发件箱的授权码"
	host := "smtp.126.com:25"
	to := "收件箱"//可以用;隔开发送多个
	fmt.Println("send email")
	err := sendToMail(user,pwd,host,to,subject,body,"html")
	if err != nil {
		fmt.Println("Send mail error!")
		fmt.Println(err)
	} else {
		fmt.Println("Send mail success!")
	}
}

五、定时发送消息

可以考虑time.sleep(time.hour*24),就是感觉不高大上。

func main() {
	TimeSettle()
}

//定时结算
func TimeSettle()  {
	d := time.Duration(time.Minute)
	t := time.NewTicker(d)
	defer t.Stop()
	for  {
		currentTime := time.Now()
		if currentTime.Hour() == 8 {
			sendinfo()
			time.Sleep(time.Hour)
		}
		<-t.C
	}
}

六、结果

每天起床第一眼,先看天气预报( ・᷄৺・᷅ )。

大概输出就是这样,下面可能会考虑如何通过qq或微信发送天气预报。

如果有问题欢迎询问,上面有邮箱哦

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_26450765/article/details/84258783
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-09-04 14:39:53
  • 阅读 ( 2846 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢