①首先登陆邮箱查看授权码,登陆163邮箱到首页点击设置(QQ邮箱也是一样),开启服务,然后新增授权密码(这个得到的密码千万保存好,后面会用到) 

②创建springboot项目,导入关键jar包(如下)后面如果缺少什么包,我每段代码都会放上导入了哪些包可以作为参考

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.31</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.6</version></dependency><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.0</version></dependency>

③创建实体对象,邮件业务方法

import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;/*** @Author YMG* @Date 2021/6/22 13:54* @Description :*/
@Data
public class MailDto implements Serializable {/*** 接受邮箱账户*/@NotEmpty(message = "邮箱不可为空")private String[] mail;/*** 邮箱标题*/@NotEmpty(message = "邮箱标题不可为空")private String title;/*** 要发送的内容*/@NotEmpty(message = "内容不可为空")private String content;}
import com.zh.wit.sendMail.dto.MailDto;/*** @Author YMG* @Date 2021/6/22 13:55* @Description :*/
public interface MailService {/*** 发送邮件* @param mailDto d*/void send(MailDto mailDto);}
import com.zh.wit.sendMail.dto.MailDto;
import com.zh.wit.sendMail.service.MailService;
import lombok.RequiredArgsConstructor;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;/*** @Author YMG* @Date 2021/6/22 13:57* @Description :*/
@Service
@RequiredArgsConstructor
@Component
public class MailServiceImpl implements MailService {private final MailSender mailSender;@Overridepublic void send(MailDto mailDto) {// new 一个简单邮件消息对象SimpleMailMessage message = new SimpleMailMessage();// 和配置文件中的的username相同,相当于发送方(配置文件在下properties)message.setFrom("ymg@163.com");// 收件人邮箱message.setBcc(mailDto.getMail());//抄送人(是否给自己邮箱发送)message.setCc("ymg@163.com");message.setSubject(mailDto.getTitle());// 正文message.setText(mailDto.getContent());// 发送mailSender.send(message);}
}

④配置application.properties

server.port=9029
#邮件配置
#邮箱服务器地址,如果是QQ邮箱--->(smtp.qq.com)
spring.mail.host=smtp.163.com
#发送邮件的邮箱(自己邮箱)
spring.mail.username=ymg@163.com
#第一步页面配置得到的授权密码
spring.mail.password=EXIPENWAJYHERYDX
spring.mail.default-encoding=UTF-8
#(注意!!!以上配置,本地默认25端口访问邮箱服务器,如果需要放到服务器上,必须添加如下配置,用465端口访问才能访问到邮箱服务器)
#登录服务器是否需要认证
spring.mail.properties.mail.smtp.auth=true
#SSL证书Socket工厂
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
#使用SMTPS协议465端口
spring.mail.properties.mail.smtp.socketFactory.port=465

⑤编写定时器执行的方法,不要问为什么写controller,因为前期好测试,使用定时器的话,主程序启动千万别忘了配置

@EnableScheduling注解(启动项目加载定时器)
import com.zh.wit.bo.CommonResult;
import com.zh.wit.bo.RestResult;
import com.zh.wit.sendMail.dto.MailDto;
import com.zh.wit.sendMail.service.MailService;
import com.zh.wit.utils.Per;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;/*** @Author YMG* @Date 2021/6/22 13:59* @Description :*/
@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/api/mail")
public class MailController {private final MailService mailService;//spring定时器注解(每天凌晨三点三分发送邮件),因为凌晨三点三分眼前都还是你@Scheduled(cron = "0 03 03 ? * *")public void sendMail() throws IOException {//收件人数组(可以添加多个邮箱)String[] str = {"xxx@qq.com","xxx@163.com"};MailDto mailDto = new MailDto();mailDto.setMail(str);//设置邮件titlemailDto.setTitle("今天你也要开心!");//以下是发送的内容mailDto.setContent(Per.getWe());mailService.send(mailDto);}}

⑥处理邮件发送的内容,心知天气心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案数据解析(这个数据解析写的比较乱,可自行处理一下)

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** @Author YMG* @Date 2021/6/24 14:55* @Description : 以下每个URL地址都是(心知天气的API) 只需要更换 城市 还有 购买的key就能访问到数据*/
public class Per {public static String getWe() throws IOException {URL url = new URL("https://api.seniverse.com/v3/weather/daily.json?key=SIJ_kXNjjhOcycKI6&location=成都&language=zh-Hans&unit=c&start=0&days=1");URLConnection connectionData = url.openConnection();connectionData.setConnectTimeout(1000);BufferedReader br = new BufferedReader(new InputStreamReader(connectionData.getInputStream(), StandardCharsets.UTF_8));StringBuilder sb = new StringBuilder();String line;while ((line = br.readLine()) != null) {sb.append(line);}String data = sb.toString();JSONObject jsonData = JSON.parseObject(data);JSONArray results = jsonData.getJSONArray("results");JSONArray daily = results.getJSONObject(0).getJSONArray("daily");JSONObject jsonObject = daily.getJSONObject(0);Map<String, Object> dailyMap = new HashMap<>();for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {dailyMap.put(entry.getKey(), entry.getValue());}return getOneS() + "\n" + "\n" + getYe()+ "\n" + "===================="+ "\n" + "白天天气:" + "\t" + dailyMap.get("text_day")+ "\n" + "晚间天气:" + "\t" + dailyMap.get("text_night")+ "\n" + "最高温度(℃):" + "\t" + dailyMap.get("high")+ "\n" + "最低温度(℃):" + "\t" + dailyMap.get("low")+ "\n" + "相对湿度(%):" + "\t" + dailyMap.get("humidity")+ "\n" + "当前能见度(km):" + "\t" + getSk().get("visibility")+ "\n" + "气压(Pa):" + "\t" + getSk().get("pressure")+ "\n" + "风向:" + "\t" + dailyMap.get("wind_direction")+ "\n" + "风速(km/h):" + "\t" + dailyMap.get("wind_speed")+ "\n" + "风力等级:" + "\t" + dailyMap.get("wind_scale")+ "\n" + "===================="+ "\n" + "\n" + getSe();}public static String getSe() throws IOException {URL url = new URL("https://api.seniverse.com/v3/life/suggestion.json?key=SIJ_kXNjjhOcycKI6&location=成都&language=zh-Hans");URLConnection connectionData = url.openConnection();connectionData.setConnectTimeout(1000);BufferedReader br = new BufferedReader(new InputStreamReader(connectionData.getInputStream(), StandardCharsets.UTF_8));StringBuilder sb = new StringBuilder();String line;while ((line = br.readLine()) != null) {sb.append(line);}String data = sb.toString();JSONObject jsonData = JSON.parseObject(data);JSONArray results = jsonData.getJSONArray("results");JSONObject now = results.getJSONObject(0).getJSONObject("suggestion");Map<String, Object> suMap = new HashMap<>();for (Map.Entry<String, Object> entry : now.entrySet()) {suMap.put(entry.getKey(), entry.getValue());}Map<String, Object> resultMap = new HashMap<>();for (String s : suMap.keySet()) {JSONObject jsonObject = JSON.parseObject(suMap.get(s).toString());String resultStr = jsonObject.getString("brief") + "," + jsonObject.getString("details");resultMap.put(s, resultStr);}return "生活指数:"+ "\n" + "================================="+ "\n" + "(空气污染):>>>" + "\t" + resultMap.get("air_pollution")+ "\n" + "(紫外线):>>>" + "\t" + resultMap.get("uv")+ "\n" + "(舒适度):>>>" + "\t" + resultMap.get("comfort")+ "\n" + "(雨伞):>>>" + "\t" + resultMap.get("umbrella")+ "\n" + "(化妆):>>>" + "\t" + resultMap.get("makeup")+ "\n" + "(防晒):>>>" + "\t" + resultMap.get("sunscreen")+ "\n" + "(过敏):>>>" + "\t" + resultMap.get("allergy")+ "\n" + "(风寒):>>>" + "\t" + resultMap.get("chill")+ "\n" + "(感冒):>>>" + "\t" + resultMap.get("flu")+ "\n" + "(约会):>>>" + "\t" + resultMap.get("dating")+ "\n" + "(运动):>>>" + "\t" + resultMap.get("sport")+ "\n" + "(旅游):>>>" + "\t" + resultMap.get("travel")+ "\n" + "(晾晒):>>>" + "\t" + resultMap.get("airing")+ "\n" + "=================================";}public static Map<String, Object> getSk() throws IOException {URL url = new URL("https://api.seniverse.com/v3/weather/now.json?key=SIJ_kXNjjhOcycKI6&location=成都&language=zh-Hans&unit=c");URLConnection connectionData = url.openConnection();connectionData.setConnectTimeout(1000);BufferedReader br = new BufferedReader(new InputStreamReader(connectionData.getInputStream(), StandardCharsets.UTF_8));StringBuilder sb = new StringBuilder();String line;while ((line = br.readLine()) != null) {sb.append(line);}String data = sb.toString();JSONObject jsonData = JSON.parseObject(data);JSONArray results = jsonData.getJSONArray("results");JSONObject now = results.getJSONObject(0).getJSONObject("now");Map<String, Object> skMap = new HashMap<>();for (Map.Entry<String, Object> entry : now.entrySet()) {skMap.put(entry.getKey(), entry.getValue());}return skMap;}//得到农历生肖public static String getYe() throws IOException {URL url = new URL("https://api.seniverse.com/v3/life/chinese_calendar.json?key=SIJ_kXNjjhOcycKI6&start=0&days=1");URLConnection connectionData = url.openConnection();connectionData.setConnectTimeout(1000);BufferedReader br = new BufferedReader(new InputStreamReader(connectionData.getInputStream(), StandardCharsets.UTF_8));StringBuilder sb = new StringBuilder();String line;while ((line = br.readLine()) != null) {sb.append(line);}String data = sb.toString();JSONObject jsonData = JSON.parseObject(data);JSONObject jsonObject = jsonData.getJSONObject("results");JSONArray jsonArray = jsonObject.getJSONArray("chinese_calendar");JSONObject chinese_calendar = jsonArray.getJSONObject(0);Map<String, Object> chMap = new HashMap<>();for (Map.Entry<String, Object> entry : chinese_calendar.entrySet()) {chMap.put(entry.getKey(), entry.getValue());}return chMap.get("date") + "\t" + getWeekOfDate(new Date()) + "\t" + chMap.get("ganzhi_year") + "(" + chMap.get("zodiac") + ")" + "年" + chMap.get("lunar_month_name") + chMap.get("lunar_day_name") + "\t" + chMap.get("lunar_festival")+ "\t" + chMap.get("solar_term");}//得到情话public static String getOneS() throws IOException {//创建客户端对象HttpClient client = HttpClients.createDefault();/*创建地址 https://api.shadiao.pro/chp*/HttpGet get = new HttpGet("https://api.shadiao.pro/chp");//发起请求,接收响应对象HttpResponse response = client.execute(get);//获取响应体,响应数据是一种基于HTTP协议标准字符串的对象//响应体和响应头,都是封装HTTP协议数据。直接使用可能出现乱码或解析错误HttpEntity entity = response.getEntity();//通过HTTP实体工具类,转换响应体数据String entityString = EntityUtils.toString(entity, "utf-8");String substring = entityString.substring(8);String resultSubstring = substring.substring(0, substring.length() - 2);Map<String, Object> map = JSON.parseObject(resultSubstring, new TypeReference<Map<String, Object>>() {});return map.get("text").toString();}public static String getWeekOfDate(Date date) {String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};Calendar cal = Calendar.getInstance();cal.setTime(date);int w = cal.get(Calendar.DAY_OF_WEEK) - 1;if (w < 0) {w = 0;}return weekDays[w];}public static void main(String[] args) throws IOException {System.out.println(getWe());}}

⑦心知天气说明(免费版只能获取基础数据,开发者版才能使用具体功能(以上代码是开发者版编写)首次可以申请获得14天试用版的使用(与开发版功能完全一样,能使用接口全部功能))

⑧最终移动端呈现效果如下

⑨最终PC端呈现效果如下

springboot定时器 + Javamail + 心知天气API (通过邮件每天给女朋友发送一句情话+当日天气信息+当日生活指数)相关推荐

  1. 用cJSON解析心知天气返回的数据包

    目录: 文章目录 调用天气API接口获取天气信息 解析天气信息字符串 测试结果 欢迎关注 后台网友留言,说参考这个链接 天气数据解析1–JSON格式数据 处理天气API接口返回的数据,中间遇到了点问题 ...

  2. Esp8266 --深入分析官方json解析源码及如何使用json接口解析心知天气

    什么是json? 懵逼回答:[参考菜鸟教程]   a.JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)   b.JSON 是轻量级的文本数据交 ...

  3. 和风天气API接口调用

    今天闲来无事,搞点没啥用的东西.最近天气大热,突然想搞个天气API玩玩. 在网上一番查找发现了几个免费的天气API 1.和风天气API 点击直达 免费可调用,需要注册. 2.免费天气API接口-看云 ...

  4. 免费天气api 高速稳定的天气API接口 2019年4月测试稳定OK

    天气API (https://www.tianqiapi.com) 提供的是真正免费的天气api接口 接口没有调用次数.频率.IP等限制! 提供的接口完全满足广大开发者的日常需求, 而且使用接口无需注 ...

  5. 免费天气api_高速稳定的天气数据_高速稳定的天气API接口

    天气API (https://www.tianqiapi.com) 提供的是真正免费的天气api接口 接口没有调用次数.频率.IP等限制! 提供的接口完全满足广大开发者的日常需求, 而且使用接口无需注 ...

  6. 6 款最优秀,数据最全,免费,稳定,各类场景均适合的天气 API

    我挑出了 6 款最优秀,数据最全,免费,稳定,各类场景均适合的天气 API,并且一个个测了一遍,我把测试过程,怎么接 API 等所有细节都写在文章里了,希望对你有帮助. 本文详细讲解以下 6 个免费天 ...

  7. Android 天气APP(三)访问天气API与数据请求

    上一篇:Android 天气APP(二)获取定位信息 访问天气API与数据请求 新版------------------- 一.和风天气 二.城市搜索接口 三.OKHttp使用 四.文章源码 旧版-- ...

  8. 使用 Fiddler 调试 心知天气,stm32 esp8266获取天气api

    心知天气 - 免费用户的功能: 国内 370 个主要城市 天气实况,包括天气现象文字.代码和气温 3 项数据 未来 3 天天气预报,包括白天天气现象文字及代码.晚间天气现象文字及代码.当天最高温度和最 ...

  9. 利用Arduino Esp8266 心知天气API 获取天气预报信息(修改后可以DIY一个小型的桌面气象台)

    前期准备: 注册心知天气,获取API密钥  https://www.seniverse.com 生成API请求地址,北京今天和未来4天的预报请求地址如下: https://api.seniverse. ...

  10. Android中基于心知天气API获取天气信息

    Android中基于心知天气获取天气信息 JSON JSON简介 JSON对象 JSON数组 JSON解析 Android中获取天气 获取天气的流程 获取心知天气的API key 获取心知天气的API ...

最新文章

  1. C++之typedef 小记
  2. ORACLE RAC 更改instance name完整步骤
  3. e站app改内置hosts_e-Mobile安卓下载-e
  4. [转载]项目风险管理七种武器-孔雀翎
  5. List、Set、Map的区别
  6. win10下gnuplot的安装
  7. Python注释缩进不得当导致IndentationError: unexpected indent
  8. java 获取组件大小_java - 如何初始化取决于组件大小的图像抓取? - 堆栈内存溢出...
  9. 请假时碰到法定假期,实际请假几天?
  10. MPLAB X环境ICD3无法使用
  11. Linux Ubuntu系统下载安装NCL
  12. EasyClick 易点云测
  13. vbs模拟post请求上传文件
  14. MPC5744P-UART(LIN)模块
  15. mysql:设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)表(四)所示
  16. 面试70问经典回答技巧
  17. 轮播图特效 html+css+js
  18. Go中sync 包的 Once 使用
  19. 如何选购护眼灯呢?南卡/明基/孩视宝台灯哪个比较好?「测评三款热销护眼灯」
  20. python打字测试源码,在线打字

热门文章

  1. LaTeX制作幻灯片
  2. 计算机毕业设计之 疫情防控志愿者管理系统
  3. 力扣刷题(347. 前 K 个高频元素)快速排序
  4. 新手使用CAD制图-需要了解的软件常识
  5. web服务器硬件软件配置选择
  6. OEM、ODM模式区别
  7. 503 Service Temporarily Unavailable
  8. android_静默安装/adb执行/软件搬家/消息派发
  9. React Native --props使用之吹气球例子
  10. 菠萝狗四足机器人使用手册