前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用golang每天给自己发送一封天气预报的邮件

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

作者头像
chenchenchen
发布2019-09-03 11:46:46
1.3K0
发布2019-09-03 11:46:46
举报
文章被收录于专栏:chenchenchenchenchenchen

一、介绍

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

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

二、要点

1、获取天气的api

2、发送邮件

3、定时

三、获取天气api

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

申请key

天气查询API服务地址:

代码语言:javascript
复制
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

晚上风力

获取网络请求

代码语言:javascript
复制
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
		}
	}
}

获取天气信息

代码语言:javascript
复制
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+"\t\t	风向:"+cast.Nightwind+"\t	风力:"+cast.Nightpower+"】\r\n"
		}
		subject = verity(fore.Casts[0].Dayweather,fore.Casts[0].Nightweather)
		return subject,output+str,nil
	}
}

一些小工具

代码语言:javascript
复制
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 ""
}

接受到的天气信息

代码语言:javascript
复制
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"晚上风力`
}

四、发送邮件

代码语言:javascript
复制
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 +"\r\nFrom: " + user + "<"+
		user + ">\r\nSubject: "+ subject + "\r\n" +
		content_type + "\r\n\r\n" + body)
	send_to := strings.Split(to,";")
	err := smtp.SendMail(host,auth,user,send_to,msg)
	return err
}
代码语言:javascript
复制
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),就是感觉不高大上。

代码语言:javascript
复制
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
	}
}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年11月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、介绍
  • 二、要点
  • 三、获取天气api
  • 四、发送邮件
  • 五、定时发送消息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档