Browse Source

告警邮件样式优化;邮件组件调整为commons-email简化邮件操作;

xuxueli 7 years ago
parent
commit
2f2ed56348

+ 1 - 0
doc/XXL-JOB官方文档.md

@@ -1079,6 +1079,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
 - 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次;
 - 15、Log地址格式兼容,支持非"/"结尾路径配置;
 - 16、JobHandler提供init/destroy方法,支持在JobHandler初始化和销毁时进行附加操作;
+- 17、告警邮件样式优化;邮件组件调整为commons-email简化邮件操作;
 
 
 ### TODO LIST

+ 1 - 0
pom.xml

@@ -34,6 +34,7 @@
 		<commons-exec.version>1.3</commons-exec.version>
 		<commons-beanutils.version>1.9.2</commons-beanutils.version>
 		<commons-lang.version>2.6</commons-lang.version>
+		<commons-email.version>1.5</commons-email.version>
 
 		<c3p0.version>0.9.5.2</c3p0.version>
 		<mysql-connector-java.version>5.1.29</mysql-connector-java.version>

+ 4 - 4
xxl-job-admin/pom.xml

@@ -124,11 +124,11 @@
 			<version>${httpclient.version}</version>
 		</dependency>
 
-		<!-- javax.mail -->
+		<!-- commons-email -->
 		<dependency>
-			<groupId>javax.mail</groupId>
-			<artifactId>mail</artifactId>
-			<version>${mail.version}</version>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-email</artifactId>
+			<version>${commons-email.version}</version>
 		</dependency>
 
 		<!-- quartz :quartz-2.2.3/c3p0-0.9.1.1/slf4j-api-1.6.6 -->

+ 48 - 19
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java

@@ -4,6 +4,7 @@ import com.xxl.job.admin.core.model.XxlJobGroup;
 import com.xxl.job.admin.core.model.XxlJobInfo;
 import com.xxl.job.admin.core.model.XxlJobLog;
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
+import com.xxl.job.admin.core.util.JobKeyUtil;
 import com.xxl.job.admin.core.util.MailUtil;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.handler.IJobHandler;
@@ -28,6 +29,8 @@ public class JobFailMonitorHelper {
 		return instance;
 	}
 
+	// ---------------------- monitor ----------------------
+
 	private LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>(0xfff8);
 
 	private Thread monitorThread;
@@ -97,6 +100,46 @@ public class JobFailMonitorHelper {
 		monitorThread.start();
 	}
 
+	public void toStop(){
+		toStop = true;
+		// interrupt and wait
+		monitorThread.interrupt();
+		try {
+			monitorThread.join();
+		} catch (InterruptedException e) {
+			logger.error(e.getMessage(), e);
+		}
+	}
+	
+	// producer
+	public static void monitor(int jobLogId){
+		getInstance().queue.offer(jobLogId);
+	}
+
+
+	// ---------------------- alarm ----------------------
+
+	// email alarm template
+	private static final String mailBodyTemplate = "<h5>监控告警明细:</span>" +
+			"<table border=\"1\" cellpadding=\"3\" style=\"border-collapse:collapse; width:80%;\" >\n" +
+			"   <thead style=\"font-weight: bold;color: #ffffff;background-color: #ff8c00;\" >" +
+			"      <tr>\n" +
+			"         <td>执行器</td>\n" +
+			"         <td>JobKey</td>\n" +
+			"         <td>任务描述</td>\n" +
+			"         <td>告警类型</td>\n" +
+			"      </tr>\n" +
+			"   <thead/>\n" +
+			"   <tbody>\n" +
+			"      <tr>\n" +
+			"         <td>{0}</td>\n" +
+			"         <td>{1}</td>\n" +
+			"         <td>{2}</td>\n" +
+			"         <td>调度失败</td>\n" +
+			"      </tr>\n" +
+			"   <tbody>\n" +
+			"</table>";
+
 	/**
 	 * fail alarm
 	 *
@@ -110,10 +153,12 @@ public class JobFailMonitorHelper {
 
 			Set<String> emailSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));
 			for (String email: emailSet) {
-				String title = "《调度监控报警》(任务调度中心XXL-JOB)";
 				XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(Integer.valueOf(info.getJobGroup()));
-				String content = MessageFormat.format("任务调度失败, 执行器名称:{0}, 任务描述:{1}.", group!=null?group.getTitle():"null", info.getJobDesc());
-				MailUtil.sendMail(email, title, content, false, null);
+
+				String title = "调度中心监控报警";
+				String content = MessageFormat.format(mailBodyTemplate, group!=null?group.getTitle():"null", JobKeyUtil.formatJobKey(info), info.getJobDesc());
+
+				MailUtil.sendMail(email, title, content);
 			}
 		}
 
@@ -121,20 +166,4 @@ public class JobFailMonitorHelper {
 
 	}
 
-	public void toStop(){
-		toStop = true;
-		// interrupt and wait
-		monitorThread.interrupt();
-		try {
-			monitorThread.join();
-		} catch (InterruptedException e) {
-			logger.error(e.getMessage(), e);
-		}
-	}
-	
-	// producer
-	public static void monitor(int jobLogId){
-		getInstance().queue.offer(jobLogId);
-	}
-	
 }

+ 23 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java

@@ -0,0 +1,23 @@
+package com.xxl.job.admin.core.util;
+
+import com.xxl.job.admin.core.model.XxlJobInfo;
+
+/**
+ * job key util
+ *
+ * @author xuxueli 2017-12-22 18:48:45
+ */
+public class JobKeyUtil {
+
+    /**
+     * format job key
+     *
+     * @param xxlJobInfo
+     * @return
+     */
+    public static String formatJobKey(XxlJobInfo xxlJobInfo){
+        return String.valueOf(xxlJobInfo.getJobGroup())
+                .concat("_").concat(String.valueOf(xxlJobInfo.getId()));
+    }
+
+}

+ 34 - 84
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java

@@ -1,19 +1,16 @@
 package com.xxl.job.admin.core.util;
 
-import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.mail.DefaultAuthenticator;
+import org.apache.commons.mail.EmailException;
+import org.apache.commons.mail.HtmlEmail;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.mail.javamail.JavaMailSenderImpl;
-import org.springframework.mail.javamail.MimeMessageHelper;
 
-import javax.mail.internet.MimeMessage;
-import java.io.File;
-import java.util.Properties;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
+import java.nio.charset.Charset;
 
 /**
  * 邮件发送.Util
+ *
  * @author xuxueli 2016-3-12 15:06:20
  */
 public class MailUtil {
@@ -33,89 +30,42 @@ public class MailUtil {
 	}
 
 	/**
-	 * 发送邮件 (完整版) (纯JavaMail)
-	 * 
-	 * @param toAddress		: 收件人邮箱
-	 * @param mailSubject	: 邮件主题
-	 * @param mailBody		: 邮件正文
-	 * @param mailBodyIsHtml: 邮件正文格式,true:HTML格式;false:文本格式
-	 * //@param inLineFile	: 内嵌文件
-	 * @param attachments	: 附件
+	 *
+	 * @param toAddress		收件人邮箱
+	 * @param mailSubject	邮件主题
+	 * @param mailBody		邮件正文
+	 * @return
 	 */
-	public static boolean sendMail (String toAddress, String mailSubject, String mailBody, 
-			boolean mailBodyIsHtml, File[] attachments){
-        try {
-			// 创建邮件发送类 JavaMailSender (用于发送多元化邮件,包括附件,图片,html 等)
-        	JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
-        	mailSender.setHost(host); 			// 设置邮件服务主机    
-        	mailSender.setUsername(username); 	// 发送者邮箱的用户名    
-        	mailSender.setPassword(password); 	// 发送者邮箱的密码    
-        	
-			// 配置文件,用于实例化java.mail.session
-			Properties pro = new Properties();
-			pro.put("mail.transport.protocol", "smtp");
-			pro.put("mail.smtp.auth", "true");		// 登录SMTP服务器,需要获得授权 (网易163邮箱新近注册的邮箱均不能授权,测试 sohu 的邮箱可以获得授权)
-			pro.put("mail.smtp.socketFactory.port", port);
-			pro.put("mail.smtp.socketFactory.fallback", "false");
-			mailSender.setJavaMailProperties(pro);
-			
-			// 创建多元化邮件 (创建 mimeMessage 帮助类,用于封装信息至 mimeMessage)
-			MimeMessage mimeMessage = mailSender.createMimeMessage();						
-			MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, ArrayUtils.isNotEmpty(attachments), "UTF-8");
-			
-			helper.setFrom(username, sendNick);
-			helper.setTo(toAddress);
+	public static boolean sendMail(String toAddress, String mailSubject, String mailBody){
 
-			helper.setSubject(mailSubject);
-			helper.setText(mailBody, mailBodyIsHtml); 
-			
-			// 设置收件人抄送的名片和地址(相当于群发)
-			//helper.setCc(InternetAddress.parse(MimeUtility.encodeText("邮箱001") + " <@163.com>," + MimeUtility.encodeText("邮箱002") + " <@foxmail.com>"));
+		try {
+			// Create the email message
+			HtmlEmail email = new HtmlEmail();
 
-			// 内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源
-			//helper.addInline(MimeUtility.encodeText(inLineFile.getName()), inLineFile);
-			
-			// 添加附件
-			/*if (ArrayUtils.isNotEmpty(attachments)) {
-				for (File file : attachments) {
-					helper.addAttachment(MimeUtility.encodeText(file.getName()), file);	
-				}
-			}*/
+			//email.setDebug(true);		// 将会打印一些log
+			//email.setTLS(true);		// 是否TLS校验,,某些邮箱需要TLS安全校验,同理有SSL校验
+			//email.setSSL(true);
 
-			// 群发
-			//MimeMessage[] mailMessages = { mimeMessage };
-			
-			mailSender.send(mimeMessage);
+			email.setHostName(host);
+			email.setSmtpPort(Integer.valueOf(port));
+			//email.setSslSmtpPort(port);
+			email.setAuthenticator(new DefaultAuthenticator(username, password));
+			email.setCharset(Charset.defaultCharset().name());
+
+			email.setFrom(username, sendNick);
+			email.addTo(toAddress);
+			email.setSubject(mailSubject);
+			email.setMsg(mailBody);
+
+			//email.attach(attachment);	// add the attachment
+
+			email.send();				// send the email
 			return true;
-		} catch (Exception e) {
+		} catch (EmailException e) {
 			logger.error(e.getMessage(), e);
+
 		}
 		return false;
 	}
-	
-	static int total = 0;
-	public static void main(String[] args) {
-		
-		ExecutorService exec = Executors.newCachedThreadPool();
-		for (int i = 0; i < 1; i++) {
-			exec.execute(new Thread(new Runnable() {
-				@Override
-				public void run() {
-					while(total < 1){
-						String mailBody = "<html><head><meta http-equiv="
-								+ "Content-Type"
-								+ " content="
-								+ "text/html; charset=gb2312"
-								+ "></head><body><h1>新书快递通知</h1>你的新书快递申请已推送新书,请到<a href=''>空间"
-								+ "</a>中查看</body></html>";
-						
-						sendMail("931591021@qq.com", "测试邮件", mailBody, true, null);
-						System.out.println(total);
-						total++;
-					}
-				}
-			}));
-		}
-	}
-	
+
 }

+ 44 - 0
xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java

@@ -0,0 +1,44 @@
+package com.xxl.job.dao.impl;
+
+import com.xxl.job.admin.core.util.MailUtil;
+import org.junit.Test;
+
+import java.text.MessageFormat;
+
+/**
+ * email util test
+ *
+ * @author xuxueli 2017-12-22 17:16:23
+ */
+public class MailUtilTest {
+
+    @Test
+    public void registryTest() throws Exception {
+
+        String mailBodyTemplate = "<h5>监控告警明细:</span>" +
+                "<table border=\"1\" cellpadding=\"3\" style=\"border-collapse:collapse; width:80%;\" >\n" +
+                "   <thead style=\"font-weight: bold;color: #ffffff;background-color: #ff8c00;\" >" +
+                "      <tr>\n" +
+                "         <td>执行器</td>\n" +
+                "         <td>JobKey</td>\n" +
+                "         <td>任务描述</td>\n" +
+                "         <td>告警类型</td>\n" +
+                "      </tr>\n" +
+                "   <thead/>\n" +
+                "   <tbody>\n" +
+                "      <tr>\n" +
+                "         <td>{0}</td>\n" +
+                "         <td>{1}</td>\n" +
+                "         <td>{2}</td>\n" +
+                "         <td>调度失败</td>\n" +
+                "      </tr>\n" +
+                "   <tbody>\n" +
+                "</table>";
+
+        mailBodyTemplate = MessageFormat.format(mailBodyTemplate, "1_1", "分组A", "任务A1");
+
+        boolean ret = MailUtil.sendMail("931591021@qq.com", "调度中心监控报警" , mailBodyTemplate);
+        System.out.println(ret);
+    }
+
+}