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

时间:2024-10-01 14:37:46

 

一、介绍

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

github地址:/betterfor/

二、要点

1、获取天气的api

2、发送邮件

3、定时

三、获取天气api

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

申请key

天气查询API服务地址:

https:///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

晚上风力

 

获取网络请求

  1. func doHttpGetRequest(url string) (rlt string,err error) {
  2. resp,err := (url)
  3. if err!=nil {
  4. return "",err
  5. } else {
  6. defer ()
  7. body,err := ()
  8. if err != nil {
  9. return "",err
  10. } else {
  11. return string(body),err
  12. }
  13. }
  14. }

获取天气信息

  1. func getWeather() (string,string,error) {
  2. url := "/v3/weather/weatherInfo?"
  3. key := "你的appkey"
  4. city := "370211"
  5. ext := "all"
  6. rlt,err:=doHttpGetRequest(url + "city=" + city + "&key=" + key + "&extensions=" + ext)
  7. var data Weather
  8. var fore Forecast
  9. var cast Cast
  10. ([]byte(rlt),&data)
  11. if err != nil {
  12. return (),"",err
  13. } else {
  14. fore = [0]
  15. output := + + " 预报时间:" + + "\n"
  16. var str,subject string
  17. for i := 0; i < len(); i++ {
  18. cast = [i]
  19. str += "日期:" ++ "\t星期"+NumToStr()+
  20. "\n白天:【天气:"++"\t 温度:"++"\t 风向:"++"\t 风力:"++"】"+
  21. "\n夜晚:【天气:"++"\t 温度:"++"\t\t 风向:"++"\t 风力:"++"】\r\n"
  22. }
  23. subject = verity([0].Dayweather,[0].Nightweather)
  24. return subject,output+str,nil
  25. }
  26. }

一些小工具

  1. func verity(dayweather,nightweather string) string {
  2. var sub string
  3. rain := "雨"
  4. snow := "雪"
  5. sub = "收藏点赞投硬币,新的一天会有好事发生哝 ||今日天气预报"
  6. if (dayweather,rain) || (nightweather,rain) {
  7. sub = sub + "今天将降雨,出门请别忘带伞"
  8. }
  9. if (dayweather,snow) || (nightweather,snow) {
  10. sub = sub + " 下雪了"
  11. }
  12. return sub
  13. }
  14. func NumToStr(str string) string {
  15. switch str {
  16. case "1":
  17. return "一"
  18. case "2":
  19. return "二"
  20. case "3":
  21. return "三"
  22. case "4":
  23. return "四"
  24. case "5":
  25. return "五"
  26. case "6":
  27. return "六"
  28. case "7":
  29. return "日"
  30. }
  31. return ""
  32. }

接受到的天气信息

  1. type Weather struct {
  2. Status string `json:"status"返回状态`
  3. Count string `json:"count"返回结果总条数`
  4. Info string `json:"info"返回的状态信息`
  5. Infocode string `json:"infocode"返回状态说明`
  6. Forecasts []Forecast `json:"forecasts"预报天气信息数据`
  7. }
  8. type Forecast struct {
  9. City string `json:"city"城市名称`
  10. Adcode string `json:"adcode"城市编码`
  11. Province string `json:"province"省份`
  12. Reporttime string `json:"reporttime"预报时间`
  13. Casts []Cast `json:casts预报数据`
  14. }
  15. type Cast struct {
  16. Date string `json:"date"日期`
  17. Week string `json:"week"星期`
  18. Dayweather string `json:"dayweather"白天天气`
  19. Nightweather string `json:"nightweather"晚上天气`
  20. Daytemp string `json:"daytemp"白天温度`
  21. Nighttemp string `json:"nighttemp"晚上温度`
  22. Daywind string `json:"daywind"白天风向`
  23. Nightwind string `json:"nightwind"晚上风向`
  24. Daypower string `json:"daypower"白天风力`
  25. Nightpower string `json:"nightpower"晚上风力`
  26. }

四、发送邮件

  1. func sendToMail(user,password,host,to,subject,body,mailtype string) error {
  2. hp := (host,":")
  3. auth := ("",user,password,hp[0])
  4. var content_type string
  5. if mailtype =="html" {
  6. content_type = "Content_Type: text/" + mailtype + "; charset=UTF-8"
  7. } else {
  8. content_type = "Content_Type: text/plain" + "; charset=UTF-8"
  9. }
  10. msg := []byte("To:" + to +"\r\nFrom: " + user + "<"+
  11. user + ">\r\nSubject: "+ subject + "\r\n" +
  12. content_type + "\r\n\r\n" + body)
  13. send_to := (to,";")
  14. err := (host,auth,user,send_to,msg)
  15. return err
  16. }
  1. func sendEmail(subject,body string) {
  2. user := "发件箱"
  3. pwd := "发件箱的授权码"
  4. host := "smtp.:25"
  5. to := "收件箱"//可以用;隔开发送多个
  6. ("send email")
  7. err := sendToMail(user,pwd,host,to,subject,body,"html")
  8. if err != nil {
  9. ("Send mail error!")
  10. (err)
  11. } else {
  12. ("Send mail success!")
  13. }
  14. }

五、定时发送消息

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

  1. func main() {
  2. TimeSettle()
  3. }
  4. //定时结算
  5. func TimeSettle() {
  6. d := ()
  7. t := (d)
  8. defer ()
  9. for {
  10. currentTime := ()
  11. if () == 8 {
  12. sendinfo()
  13. ()
  14. }
  15. <-
  16. }
  17. }

六、结果

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

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

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