Java定时执行ping命令,当ping不通时发邮件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lintianlin/article/details/44224039
1.定时器代码
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.cvicse.mail.pingIP.TimerTaskTest;

public class sendmail implements ServletContextListener{
	
	public void contextDestroyed(ServletContextEvent arg0) {
		
	}
	public void contextInitialized(ServletContextEvent arg0) {
		
		//pingIP,当ping不同时发送邮件
		Timer timer3 = new Timer();
		timer3.schedule(new TimerTaskTest(), 1000, 2000);
	}
}

2.Java执行ping命令,以及发送邮件代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;
import java.util.TimerTask;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletContext;

public class TimerTaskTest extends TimerTask{
	
	private static SendMailConfig mailconfig = new SendMailConfig();
	private String _content="邮件内容";
	private String _subject="邮件标题";
	private String[] _to = {"收件人邮箱","收件人邮箱"};
	private ServletContext context = null; 
	
	@Override
	public void run() {
		boolean result = this.isReachable("fzkt.lixiaedu.com", 1, 5000);
		if(!result){
			Properties props = new Properties();
			//SMTP服务器 
			props.put("mail.smtp.host", mailconfig.get_Host());
			//是否需要SMTP验证
			props.put("mail.smtp.auth", mailconfig.get_IsSTMP());
			try{ 
				Session mailSession = Session.getDefaultInstance(props);
				
				//是否打印debug
				//mailSession.setDebug(true);
				
				Message message=new MimeMessage(mailSession); 
				//发件人
				message.setFrom(new InternetAddress(mailconfig.get_From()));
				int len=_to.length;    
	            InternetAddress[] address=new InternetAddress[len];    
	            for (int i = 0; i < _to.length; i++) {  
	                address[i]=new InternetAddress(_to[i]);   
	            }  
				//收件人 
				message.addRecipients(Message.RecipientType.TO,address);
				
				//邮件主题
				message.setSubject(this._subject);
				//邮件内容
				message.setContent(this._content,"text/html; charset=utf-8");
				message.saveChanges(); 
	   
				Transport transport = mailSession.getTransport("smtp"); 
				transport.connect(mailconfig.get_Host(), mailconfig.get_UserName(), mailconfig.get_UserPwd()); 
				transport.sendMessage(message, message.getAllRecipients()); 
				transport.close(); 
			}catch(Exception e){
				System.out.println(e);
			}
		}
	}
	
	/**  
	 * * 测试是否能ping通  
	 * * @param server  
	 * * @param timeout  
	 * * @return  
	 * */ 
	public boolean isReachable(String remoteIpAddress,int pingTimes,int timeOut) {  
		BufferedReader in = null;  
		Runtime r = Runtime.getRuntime();  
		// 将要执行的ping命令,此命令是windows格式的命令  
		String pingCommand = "ping " + remoteIpAddress + " -n " + pingTimes    + " -w " + timeOut;  
		try {   
			Process p = r.exec(pingCommand);   
			if (p == null) {    
				return false;   
				}   
			in = new BufferedReader(new InputStreamReader(p.getInputStream()));   
			// 逐行检查输出,计算类似出现=23ms TTL=62字样的次数   
			int connectedCount = 0;   
			String line = null;   
			while ((line = in.readLine()) != null) {    
				connectedCount += getCheckResult(line);   
				}   
			// 如果出现类似=23ms TTL=62这样的字样,出现的次数=测试次数则返回真   
			return connectedCount == pingTimes;
			
			
			} catch (Exception ex) {   
				// 出现异常则返回假  
				return false;  
			} finally {   
				try {    
					in.close();   
					} catch (IOException e) {    
						}  
				} 
		} 
	/**  
	 * * 若line含有=18ms TTL=16字样,说明已经ping通,返回1,否則返回0.  
	 * * @param line  
	 * * @return  
	 * */ 
	private static int getCheckResult(String line) {  
		// System.out.println("控制台输出的结果为:"+line);  
		Pattern pattern = Pattern.compile("(\\d+ms)(\\s+)(TTL=\\d+)",    
				Pattern.CASE_INSENSITIVE);  
		Matcher matcher = pattern.matcher(line);  
		while (matcher.find()) {   
			return 1;  
			}  
		return 0; 
		} 
}

3.配置代码

public class SendMailConfig {
	private String _Host;// stmp服务器地址
	private String _IsSTMP;//是否stmp
	private String _UserName;//邮箱登陆名
	private String _UserPwd;//邮箱密码
	private String _From;//发送人
	public SendMailConfig() {
		_Host="smtp.163.com";
		_IsSTMP = "true";
		_UserName = "发件人邮箱名";
		_UserPwd ="发件人邮箱密码";
		_From ="发件人邮箱密码";
	}

	public String get_Host() {
		return _Host;
	}

	public void set_Host(String host) {
		_Host = host;
	}

	public String get_IsSTMP() {
		return _IsSTMP;
	}

	public void set_IsSTMP(String isSTMP) {
		_IsSTMP = isSTMP;
	}

	public String get_UserName() {
		return _UserName;
	}

	public void set_UserName(String userName) {
		_UserName = userName;
	}

	public String get_UserPwd() {
		return _UserPwd;
	}

	public void set_UserPwd(String userPwd) {
		_UserPwd = userPwd;
	}

	public String get_From() {
		return _From;
	}

	public void set_From(String from) {
		_From = from;
	}
}



注意:有的电脑可能ping命令不能用,提示“ping不是内部或外部命令”,解决方法:

如果你的是XP的话,你在我的电脑上右键属性,高级里面找环境变量,找见path,如果没有,自己新建一条,编辑path,粘贴上
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\system32\WBEM


猜你喜欢

转载自blog.csdn.net/lintianlin/article/details/44224039