本项目采用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. MySQL 8.x

    MySQL 8.x SQL & NoSQL $ mysql --version # mysql Ver 8.0.21 for osx10.15 on x86_64 (Homebrew) # M ...

  2. WLAN-AC+AP射频一劳永逸的调优方式

    AP射频调优组网图 射频调优简介 射频调优的主要功能就是动态调整AP的信道和功率,可以使同一AC管理的各AP的信道和功率保持相对平衡,保证AP工作在最佳状态.WLAN网络中,AP的工作状态会受到周围环 ...

  3. java基础第12期——反射、注解

    一. 反射 反射: 将类的各个组成部分封装为其他对象. 1.1 获取class对象的方式 Class.forName("全类名"): 将字节码文件加载进内存,返回class对象 多 ...

  4. springboot项目启动后tomcat服务器自动关闭 解决方法

    需要在pom.xml中添加 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  5. 使用PageHelper进行分页查询

    service层代码: public Result getDataSetList(String dataCode, String dataName, int pageIndex, int length ...

  6. Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated column

    Error: javax.servlet.ServletException: java.sql.SQLSyntaxErrorException: Expression #4 of SELECT lis ...

  7. Python处理不平衡数据

    参考文献 所谓的不平衡数据集指的是数据集各个类别的样本量极不均衡.以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下通常情况下把多数类样本的比例接近100:1这种情况下的数据称为不平 ...

  8. Django框架-cookie和session以及中间件

    目录 一.cookie 和 session 1.为什么会有这些技术 2. cookie 2.1 Django如何设置cookie 2.2 Django如何获取cookie 2.3 Django如何设置 ...

  9. Svelte 码半功倍

    你未注意到的最重要的指标. 注意:原文发表于2019-04-20,随着框架不断演进,部分内容可能已不适用. 所有代码都有 BUG,你写的越多,BUG 越多,这很合情合理. 同时,写的越多,费时越多,留 ...

  10. mysql索引的性能分析

    [前言]上一篇博客介绍了InnoDB引擎的索引机制,主要围绕B+树的建立,目录项记录里主键和页号,到页目录下的二分法定位数据:二级索引里的主键和索引列,及其回表操作.这一篇分析一下索引的性能,围绕如何 ...