您的位置:首页 > 编程语言 > Java开发

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

2015-03-12 16:54 281 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: