使用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+"\t\t	风向:"+cast.Nightwind+"\t	风力:"+cast.Nightpower+"】\r\n"
		}
		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 +"\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
}
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
	}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JiekeXu之路

使用python将数据存入SQLite3数据库

Python从网站上抓取的数据为了可以重复利用,一般都会存储下来,存储方式最简单的会选择存储到文本文件,常见的有方式TXT、CSV、EXCEL等,还有一种方式...

16240
来自专栏JiekeXu之路

基于Python操作将数据存储到本地文件

前面说过Python爬取的数据可以存储到文件、关系型数据库、非关系型数据库。前面两篇文章没看的,可快速戳这里查看!《使用Python将数据存入SQLite3数据...

48720
来自专栏zhisheng

IDEA 这个快捷键有 17 个实用技巧,你竟然还不知道?

IDEA里有一个万能快捷键(alt enter),功能非常强大,同一个快捷键,可以根据不同的语境提示你不同的操作, 很多人可能还不了解这些功能,在处理代码的时候...

22030
来自专栏蚂蚁开源社区

微信小程序实战教程:火车票查询(含demo)

微信小程序自九月份推出内测资格以来,经历了舆论热潮到现在看似冷清,但并不意味着大家不那么关注或者不关注了。我想不管是否有内测资格,只要是感兴趣的开发者已经进入潜...

25930
来自专栏Super 前端

jQuery中调用JSON和XML数据--jQuery基础知识点(6)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

8520
来自专栏Super 前端

JavaScript语言精粹【数组、正则表达、JSON、JSLint】

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

5310
来自专栏全栈开发之路

2018-07-05 ES6学习

扩展运算符用处:当arr2 = arr1时,arr2值改变,arr1也改变;改成arr2=[...arr1]可解决

5410
来自专栏后端开发你必须学会的干货

session一致性的解决方案

服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文,这个相关信息就是session。这样,当用户在应用程序的Web页之间跳转时...

7440
来自专栏Super 前端

跨域请求HTTP数据之JSONP

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

9420
来自专栏编程坑太多

「走进k8s」Kubernetes1.15.1配置软知识yaml(16)

3.缩进时不允许使用Tab键,只允许使用空格。(可以通过编译器将tab键设置成2个空格或者4个空格)

19620

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励