本项目采用idea编辑器,依赖maven环境,相关搭建请自行百度

一、引入相关依赖
    本文Http接口交互使用hutool工具类与阿里FastJson解析报文。

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency> <!-- json -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency> <!-- hutool工具类-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.8</version>
</dependency> <!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
</dependencies>

二、编写相关配置
#本文使用163邮箱演示,邮箱需要开启IMAP/SMTP服务

#在yml文件中配置相关参数

server:
port: 8080
spring:
mail:
host: smtp.163.com
port: 465
username: @163.com
password:
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
scripturl:
url[0]:
sort: 0
url: https://gitee.com/login
type: post
params:
account: 123456
password: 123456
emailParams: @163.com

三、编写工具类
#编写发送邮件工具类SendEmailUtils
#邮件发送方法最好使用异步方式,这样可以保证调用方法执行后及时回馈

package com.auto.script.util;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.Security;
import java.util.Date;
import java.util.Properties; /**
* @Description: 发送邮件
* @Author: bigearchart
* @Date: 2021/4/2
* @return
*/
@Service
public class SendEmailUtils {
/** yml中配置的地址 */
@Value(value = "${spring.mail.host}")
private String host; /** yml中配置的端口 */
@Value(value = "${spring.mail.port}")
private String port; /** yml中配置的发件邮箱 */
@Value(value = "${spring.mail.username}")
private String userName; /** yml中配置的发件邮箱密码 */
@Value(value = "${spring.mail.password}")
private String passWord; /**
* 使用加密的方式,利用465端口进行传输邮件,开启ssl
* @param to 为收件人邮箱
* @param message 发送的消息
*/
@Async
public void sendEmil(String to,String subject, String message) {
try {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
//设置邮件会话参数
Properties props = new Properties();
//邮箱的发送服务器地址
props.setProperty("mail.smtp.host", host);
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
//邮箱发送服务器端口,这里设置为465端口
props.setProperty("mail.smtp.port", port);
props.setProperty("mail.smtp.socketFactory.port", port);
props.put("mail.smtp.auth", "true");
final String username = userName;
final String password = passWord;
//获取到邮箱会话,利用匿名内部类的方式,将发送者邮箱用户名和密码授权给jvm
Session session = Session.getDefaultInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
//通过会话,得到一个邮件,用于发送
Message msg = new MimeMessage(session);
//设置发件人
msg.setFrom(new InternetAddress(userName));
//设置收件人
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false)); //设置邮件消息
msg.setContent(message, "text/html; charset=utf-8");
//设置邮件标题
msg.setSubject(subject); //设置发送的日期
msg.setSentDate(new Date()); //调用Transport的send方法去发送邮件
Transport.send(msg); } catch (Exception e) {
e.printStackTrace();
} }
}

四、业务代码实现
#编写接口接收类ScriptUrl 需要注意字段名与yml中配置的字段名必须一致,不然会
#自动解析失败

package com.auto.script.entity;

import java.util.Map;

/**
* @author :bigearchart
* @date :Created in 2021/4/1 16:31
* @description: 脚本检查接口类
* @version: 1.0
*/
public class ScriptUrl {
/** 排序字段*/
public int sort;
/** 请求路径*/
public String url;
/** 请求类型*/
public String type;
/** 请求参数*/
public Map<String, Object> params; public int getSort() {
return sort;
} public void setSort(int sort) {
this.sort = sort;
} public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
} public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} public Map<String, Object> getParams() {
return params;
} public void setParams(Map<String, Object> params) {
this.params = params;
}
}

#编写参数注入类

package com.auto.script.util;

import com.auto.script.entity.ScriptUrl;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List; /**
* @Description: 脚本检查接口参数注入类
* @Author: bigearchart
* @Date: 2021/4/1
* @return
*/
@Configuration
@ConfigurationProperties(prefix = "scripturl")
@EnableConfigurationProperties(ScriptUrlEnum.class)
public class ScriptUrlEnum { private List<ScriptUrl> url; public List<ScriptUrl> getUrl() {
return url;
} public void setUrl(List<ScriptUrl> url) {
this.url = url;
}
}

#定义接口

package com.auto.script.service;

/**
* @author :bigearchart
* @date :Created in 2021/4/1 15:53
* @description: 定时任务配置类
* @version: 1.0
*/
public interface QuazrtAutoService { /**
* 定时任务每隔一分钟执行验证接口服务是否正常
*/
public void autoCrontab();
}

#编写接口实现类

package com.auto.script.service.impl;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.auto.script.entity.ScriptUrl;
import com.auto.script.service.QuazrtAutoService;
import com.auto.script.util.ScriptUrlEnum;
import com.auto.script.util.SendEmailUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List; /**
* @author :bigearchart
* @date :Created in 2021/4/1 15:53
* @description: 定时任务配置实现类
* @version: 1.0
*/
@Slf4j
@Component
public class QuazrtAutoServiceImpl implements QuazrtAutoService { @Value(value = "${emailParams:}")
private String[] emailParams; @Resource
private ScriptUrlEnum scriptUrlEnum;
@Resource
private SendEmailUtils sendEmailUtils; /**
* 定时任务每隔一分钟执行验证接口服务是否正常
*/
@Override
@Scheduled(cron = "0 */1 * * * ?")
public void autoCrontab() {
try{
//读取配置接口参数
List<ScriptUrl> url = scriptUrlEnum.getUrl(); //循环测试接口
for (ScriptUrl scriptUrl: url) {
String urlStr = scriptUrl.getUrl();
String type = scriptUrl.getType();
//验证参数非空
if(StrUtil.hasEmpty(urlStr, type)){
throw new RuntimeException("接口路径、请求类型不能为空,返回结果为空");
} log.info("============================本次测试接口【" + urlStr +"】=================="); //参数转json字符串
String paramsStr = JSONObject.toJSONString(scriptUrl.getParams()); String jsonStr = null;
//验证请求类型
if(type.equals("post")){
//进行接口交互
jsonStr = HttpUtil.post(scriptUrl.getUrl(), paramsStr);
}else{
//验证参数是否为空
if(scriptUrl.getParams().isEmpty() || scriptUrl.getParams().size() <= 0){
//进行接口交互
jsonStr = HttpUtil.get(scriptUrl.getUrl()).toString();
}else {
//进行接口交互
jsonStr = HttpUtil.get(scriptUrl.getUrl(), scriptUrl.getParams());
} } log.info("=============================接口返回结果为:" );
log.info(jsonStr); //验证返回结果是否为空
if(StrUtil.isEmpty(jsonStr)){
throw new RuntimeException("接口路径为【" + urlStr + "】的接口,返回结果为空");
} //解析返回结果
JSONObject jsonObject = JSONObject.parseObject(jsonStr);
//获取响应码
String code = jsonObject.get("code").toString();
//判断响应码是否正确
if(StrUtil.isEmpty(code) || ! code.equals("200")){
throw new RuntimeException("接口路径为【" + urlStr + "】的接口请求错误,接口返回结果为:" + jsonStr);
}
} }catch (Exception e){
//发送邮件
sendEmail(e.getMessage());
//控制台输出
log.info(e.toString());
}
} /**
* 封装邮件参数方法
* @param msg --- 发送文本
*/
public void sendEmail(String msg){
//循环待发送邮件集合
for (String email: emailParams ) {
//非空情况再执行
if(StrUtil.isNotEmpty(email)){
sendEmailUtils.sendEmil(email, "接口测试告警邮件", msg);
}
} }
}

五、启动类配置
#在启动类添加相关配置
# @EnableScheduling --- 开启对定时任务支持
# @EnableAsync --- 开启异步注解支持

/**
* @Description: 定时任务实现自动执行接口测试项目启动类
* @Author: bigearchart
* @Date: 2021/4/1
* @return
*/
@SpringBootApplication
@EnableScheduling
@EnableAsync
public class ScriptApplication { public static void main(String[] args) {
SpringApplication.run(ScriptApplication.class, args);
} }

六、启动项目
#项目启动后,查看控制台输出结果

#静等一分钟就可以看到接口请求的输出信息

#然后查看邮箱会收到一封告警邮件

本次的学习到这里就结束了,会根据实际使用更新文章。

如果对您有帮助 请点个关注,万分感谢
项目源码地址:
https://gitee.com/bigearchart_admin/script.git

Springboot进行Http接口交互实现邮件告警的更多相关文章

  1. python实现skywalking邮件告警webhook接口

    1.介绍 Skywalking可以对链路追踪到数据进行告警规则配置,例如响应时间.响应百分比等.发送警告通过调用webhook接口完成.webhook接口用户可以自定义. 2.默认告警规则 告警配置文 ...

  2. zabbix监控配置与邮件告警

    添加主机与主机组 进入web页面,在 配置-主机群组,创建主机群组 在 配置-主机,新建主机 在可见的名称中建议填写为类似 主机类型-主机名-IP或域名 的格式,如Web-Hyrule001-192. ...

  3. T-Pot平台cowrie蜜罐暴力破解探测及实现自动化邮件告警

    前言:Cowrie是基于kippo更改的中交互ssh蜜罐, 可以对暴力攻击账号密码等记录,并提供伪造的文件系统环境记录黑客操作行为, 并保存通过wget/curl下载的文件以及通过SFTP.SCP上传 ...

  4. SpringBoot | 第二十六章:邮件发送

    前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...

  5. 【快学springboot】2.Restful简介,SpringBoot构建Restful接口

    Restful简介 Restful一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现 ...

  6. SpringBoot 整合 Shiro 密码登录与邮件验证码登录(多 Realm 认证)

    导入依赖(pom.xml)  <!--整合Shiro安全框架--> <dependency> <groupId>org.apache.shiro</group ...

  7. Prometheus 监控报警系统 AlertManager 之邮件告警

    转载自:https://cloud.tencent.com/developer/article/1486483 文章目录1.Prometheus & AlertManager 介绍2.环境.软 ...

  8. 利用缓存实现APP端与服务器接口交互的Session控制

    与传统B/S模式的Web系统不同,移动端APP与服务器之间的接口交互一般是C/S模式,这种情况下如果涉及到用户登录的话,就不能像Web系统那样依赖于Web容器来管理Session了,因为APP每发一次 ...

  9. 更新日志 - BugHD 新增邮件告警功能

    最近 BugHD 又新增了一些功能,包括邮件告警. issue 分享. issue 备注等,同时也做了性能优化.希望能够帮助你更高效地收集解决应用崩溃. BugHD 新增功能 1.邮件告警 除了 We ...

随机推荐

  1. React Query & SWR

    React Query & SWR HTTP request all in one solution React Query Hooks for fetching, caching and u ...

  2. css 设置多行文本的行间距

    css 设置多行文本的行间距 block element span .ticket-card-info{ line-height:16px; display: inline-block; } .tic ...

  3. USDN代币发行 关于USDN代币

    "稳定币"是数字货币的一种,但与主流币存在的差异是,它可以通过锚定法币和加密资产等手段来维持币价的相对稳定.提及稳定币,一般会先介绍三种模式: 法币托管模式.数字资产抵押模式和无抵 ...

  4. Vue框架简介及简单使用

    目录 一.前端框架介绍 二.vue框架简介 三.vue使用初体验 1. vue如何在页面中引入 2. 插值表达式 3. 文本指令 4. 方法指令(事件指令) 5. 属性指令 四.js数据类型补充 1. ...

  5. StrictMode 检测应用

     Application, Activity, or other application component's onCreate() method:if (BuildConfig.SHOW_LOG) ...

  6. localforage indexedDB如何使用索引

    简单介绍下localForage.localForage 是一个 JavaScript 库,通过简单类似 localStorage API 的异步存储来改进你的 Web 应用程序的离线体验.它能存储多 ...

  7. 单细胞分析实录(9): 展示marker基因的4种图形(二)

    在上一篇中,我已经讲解了展示marker基因的前两种图形,分别是tsne/umap图.热图,感兴趣的读者可以回顾一下.这一节我们继续学习堆叠小提琴图和气泡图. 3. 堆叠小提琴图展示marker基因 ...

  8. QuickBase64 - Android 下拉通知栏快捷base64加解密工具

    Android Quick Setting Tile Base64 Encode/Decode Tool Android 下拉通知栏快捷 base64 加解密,自动将剪切板的内容进行 base64 E ...

  9. PAT-1151(LCA in a Binary Tree)+最近公共祖先+二叉树的中序遍历和前序遍历

    LCA in a Binary Tree PAT-1151 本题的困难在于如何在中序遍历和前序遍历已知的情况下找出两个结点的最近公共祖先. 可以利用据中序遍历和前序遍历构建树的思路,判断两个结点在根节 ...

  10. LeetCode-二叉树的镜像

    二叉树的镜像 二叉树的镜像 给定一个二叉树,输出二叉树的镜像. 只需要使用一个简单的递归,分别对左右子树反转后再对当前结点进行反转. #include<iostream> #include ...