前言

  国庆期间,据说是为了防止有人在重大节日发表不正当言论,很多可以kxsw的ip都被封了,可是什么时候才会解封呢,不能没事就去ping一下吧,所以我写了个定时任务,定时ping谷歌服务器,如果ping通则发邮件通知,来看看是怎么做的吧!

Ping工具类

  首先保证你的电脑之前是可以访问谷歌的(shadowsocks),这个类是专门用来ping谷歌的,相当于手动输入ping www.google.com。

   import java.io.BufferedReader;
   import java.io.IOException;
   import java.io.InputStreamReader;

   /**
   * @author: zp
   * @Date: 2019-10-08 11:31
   * @Description:
   */
   public class PingUtils {

       public static boolean ping02(String ipAddress){
           // 读取的行信息
           String line =line = null;
           // 相当于cmd服务
           Process exec = null;
           // ping 的结果
           boolean res = true;
           try {
               exec = Runtime.getRuntime().exec("ping " + ipAddress);
               BufferedReader br = new BufferedReader(new InputStreamReader(exec.getInputStream()));
               // 最多执行三秒
               long endTime = System.currentTimeMillis()+3000;
               // 测试输出行中是否有ttl字符串,有就说明ping通了
               while ((res=true)==true&&(line = br.readLine()).indexOf("ttl")<0){
                   System.out.println("line = " + line);
                   res = false;
                   // 三秒还是ping不通则放弃尝试
                   if(System.currentTimeMillis()>endTime){
                       break;
                   }
               }
               System.out.println("line = " + line);
           } catch (IOException e) {
               e.printStackTrace();
           } finally {
               exec.destroy();
               return res;
           }
       }

   }

发送邮件的工具类

发送邮件首先需要引入两个jar包:

  • maven

    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>javax.mail-api</artifactId>
        <version>1.6.2</version>
    </dependency>
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.6.2</version>
    </dependency>
  • gradle

    compile group: 'javax.mail', name: 'javax.mail-api', version: '1.6.2'
    compile group: 'com.sun.mail', name: 'javax.mail', version: '1.6.2'

    值得注意的是:邮箱密码是 QQ邮箱开通的stmp服务后得到的客户端授权码!!!类似于sjhabsjhdabasf这种字串。

    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.AddressException;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.util.Properties;
    
    /**
    * @author: zp
    * @Date: 2019-10-08 14:13
    * @Description:
    */
    public class MailUtils {
        public static void sendQQMail() throws AddressException, MessagingException {
            Properties properties = new Properties();
            // 连接协议
            properties.put("mail.transport.protocol", "smtp");
            // 主机名
            properties.put("mail.smtp.host", "smtp.qq.com");
            // 端口号
            properties.put("mail.smtp.port", 465);
            properties.put("mail.smtp.auth", "true");
            // 设置是否使用ssl安全连接 ---一般都使用
            properties.put("mail.smtp.ssl.enable", "true");
            // 设置是否显示debug信息 true 会在控制台显示相关信息
            properties.put("mail.debug", "true");
            // 得到回话对象
            Session session = Session.getInstance(properties);
            // 获取邮件对象
            Message message = new MimeMessage(session);
            // 设置发件人邮箱地址
            message.setFrom(new InternetAddress("1226364229@qq.com"));
            // 设置收件人邮箱地址,可以有多个收件人
            message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("313694179@qq.com")});
            // 设置邮件标题
            message.setSubject("ping结果");
            // 设置邮件内容
            message.setText("您的IP解封了,成功ping通谷歌!");
            // 得到邮差对象
            Transport transport = session.getTransport();
            // 连接自己的邮箱账户,密码为QQ邮箱开通的stmp服务后得到的客户端授权码!!!
            transport.connect("1226364229@qq.com", "**********");
            // 发送邮件
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        }
    }

定时任务类

这个类采用的是基于SchedulingConfigurer接口的,在ping通后,会修改cron表达式的值,防止重复发送邮件。(之前一分钟测一次,现在一天测一次)

```java
import com.example.demojpa.utils.MailUtils;
import com.example.demojpa.utils.PingUtils;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
* @author: zp
* @Date: 2019-10-08 16:22:20
* @Description:
*/
@Configuration
@EnableScheduling
public class TaskBasedInterface implements SchedulingConfigurer {

    /**
    * 每小时执行一次
    */
    private static String cron = "0 */1 * * * ?";

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addCronTask(()-> {
            // 测试连接
            boolean connected = PingUtils.ping02("www.google.com");
            if(connected){
                try {
                    // 修改cron表达式,每天凌晨执行给我发邮件
                    cron = "0 0 0 * * ? *";
                    MailUtils.sendQQMail();
                    log("已成功ping通!");
                    return;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            log("ping不通");
        },cron);
    }

    public static void log(String message) {
        DateFormat df = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
        String date = df.format(new Date(System.currentTimeMillis()));
        System.out.println(date + " "+message);
    }
}

```

结果

后语

  能用已有的知识来做一些有趣的事真的能提高你对技术的兴趣呀,反正我是体会到了。

ping通谷歌后发送QQ邮件通知的更多相关文章

  1. 5分钟 wamp下php phpmaile发送qq邮件 2015最新方法说明

    13:40 2015/11/20 5分钟 wamp下php phpmaile发送qq邮件 2015最新方法说明 关键点:现在qq邮箱开通smtp服务后会给你一个很长的独立新密码,发邮件配置中的密码需要 ...

  2. CI框架使用PHPmail插件发送QQ邮件:

    有助请顶,不好请评.0:33 2016/3/12CI框架使用PHPmail插件发送QQ邮件:发送成功,不过修改了主机参数,还包含了一个phpmail中的一个另外的文件,详见下方:参见:http://c ...

  3. python3:利用SMTP协议发送QQ邮件+附件

    转载请表明出处:https://www.cnblogs.com/shapeL/p/9115887.html 1.发送QQ邮件,首先必须知道QQ邮箱的SMTP服务器 http://service.mai ...

  4. 电子邮件协议及GO发送QQ邮件

    目录 一.电子邮件的工作机制 1.1 SMTP 1.2 POP3 1.3 IMAP 二.邮件地址 三.MIME信息 四.使用golang发送qq邮件 一.电子邮件的工作机制 提供电子邮件服务的协议叫做 ...

  5. 【python】脚本连续发送QQ邮件

    今天习得用python写一个连续发送QQ邮件的脚本,经过测试,成功给国内外的服务器发送邮件,包括QQ邮箱.163邮箱.google邮箱,香港科技大学的邮箱和爱丁堡大学的邮箱.一下逐步解答相关技巧. 首 ...

  6. Java发送QQ邮件

    面试的时候被问到这个问题,别人问我用Java发过邮件没有,被问得一脸懵逼.然后就研究了一下,不是很难,按照网上的方法折腾了几天就搞出来了. 首先,使用QQ邮箱发送邮件之前需要在邮箱里面配置,开启pop ...

  7. java mail Received fatal alert: handshake_failure java 无法发送邮件问题 java 发送qq邮件(含源码)

     java 无法发送邮件问题 java 发送qq邮件 报错:java mail Received fatal alert: handshake_failure (使用ssl) javax.mail.M ...

  8. Quartz.NET浅谈一 : 简单Job使用(定时发送QQ邮件)

    Quartz.NET是一个全功能的开源作业调度系统,可用于从最小的应用程序到大型企业系统. 直接上代码吧... 一.新建一个控制台项目 略过 二.安装Nuget包 三.创建发送邮箱辅助工具类 stat ...

  9. .net 发送qq邮件

    最近开发一个项目,需要给客户发送报告邮件,在开发中遇到本地调试发送邮件一切正常,但当部署到服务器上的时候,一直返回“发送失败”,在此记录,以免以后采坑 webapi 端代码: /// <summ ...

随机推荐

  1. matplotlib绘制矢量图像(svg),pdf and ps文件

    机器学习的过程中处理数据,会遇到数据可视化的问题. 大部分都是利用python的matplotlib库进行数据的可视化处理. plt.show() 默认都是输出.png文件,图片只要稍微放大一点,就糊 ...

  2. CF - 1108 F MST Unification

    题目传送门 题意:在一幅图中, 问需要使得多少条边加一,使得最小生成树只有一种方案. 题解:Kruskal, sort完之后,对于相通的一个边权w,我们可以分析出来有多少边是可以被放到图里面的,然后我 ...

  3. CF980C Posterized 贪心 二十五

    Posterized time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  4. yzoj P2344 斯卡布罗集市 题解

    共t条街对于每一条街上有n个店铺(n可能不相同),每次只能选两端第一个营业的店铺采购,采购第i个店铺会获得幸福度ai,采购完后,这个店铺和它相邻的店铺便会关门,问最大幸福度? 考场想了一下dp,一开始 ...

  5. d3.js 制作简单的俄罗斯方块

    d3.js是一个不错的可视化框架,同时对于操作dom也是十分方便的.今天我们使用d3.js配合es6的类来制作一个童年小游戏--俄罗斯方块.话不多说先上图片. 1. js tetris类 由于方法拆分 ...

  6. Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.apache.catalina.connector.CoyoteWriter and no properties discovered to create BeanSerializer

    一.什么是序列化In computer science, in the context of data storage, serialization is the process of transla ...

  7. 宝塔Linux面板命令

    安装宝塔 Centos安装脚本 yum install -y wget && wget -O install.sh http://download.bt.cn/install/inst ...

  8. Docker详解(二)

    目录 1.Docker常用命令 1.1 镜像命令 1.2 容器命令 1.2.1 常用的容器命令 1.2.2 重要的容器命令 序言:上一章我们初步介绍了一下Docker的概念,那么这次我们着手于Dock ...

  9. windows update自启动解决方法

    win+r打开运行,输入services.msc打开服务面板 找到Windows update服务,将常规选项卡的启动类型改为禁用,然后选择恢复选项卡,将三个失败选项都改为无操作 win+r打开运行, ...

  10. MySQL的安装与配置——详细教程

    免安装版的Mysql MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用的 标准化语言,其特点为体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,在 Web 应 ...