今天在阿里云上部署了kafka-eagle作为kafka的监控和管理工具,使用时候发现邮件配置好了但没法使用。 查看日志发现无法连接到邮件服务器的25端口,网上查了一下才知道是阿里为了防止大量的垃圾邮件而禁止了25端口的外发。 到项目的官方github(https://github.com/smartloli/kafka-eagle)上拉了一份代码下来。看了一下邮件相关的代码并没有实现ssl邮件发送。 只能硬着头皮改改代码了(没咋弄过java心虚),最后发现只需要修改一个类就能搞定了。 偷懒直接使用了原来配置文件里面的kafka.eagle.mail.enable作为是否是用ssl的配置
cat kafka-eagle-api\src\main\java\org\smartloli\kafka\eagle\api\email\MailServiceImpl.java
package org.smartloli.kafka.eagle.api.email; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Address; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import org.apache.commons.lang.StringUtils; import org.smartloli.kafka.eagle.common.protocol.MailSenderInfo; import org.smartloli.kafka.eagle.common.protocol.SaAuthenticatorInfo; import org.smartloli.kafka.eagle.common.util.SystemConfigUtils; import java.security.Security; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; /** * Implements MailService all method. * * @author smartloli. * * Created by Jan 17, 2017 * * @see org.smartloli.kafka.eagle.factory.MailService */ public class MailServiceImpl implements MailService { /** Send alert message by email. */ @Override public boolean send(String subject, String address, String content, String attachment) { MailSenderInfo mailInfo = new MailSenderInfo(); mailInfo.setMailServerHost(SystemConfigUtils.getProperty("kafka.eagle.mail.server.host")); mailInfo.setMailServerPort(SystemConfigUtils.getProperty("kafka.eagle.mail.server.port")); mailInfo.setValidate(true); mailInfo.setUserName(SystemConfigUtils.getProperty("kafka.eagle.mail.sa")); mailInfo.setPassword(SystemConfigUtils.getProperty("kafka.eagle.mail.password")); mailInfo.setFromAddress(SystemConfigUtils.getProperty("kafka.eagle.mail.username")); mailInfo.setToAddress(address); mailInfo.setSubject(subject); mailInfo.setContent(content); List<File> fileList = null; if (StringUtils.isNotBlank(attachment)) { fileList = new ArrayList<File>(); String[] attachments = attachment.split(";"); File file = null; for (String fileName : attachments) { file = new File(fileName); fileList.add(file); } mailInfo.setFileList(fileList); } return sendHtmlMail(mailInfo); } /** Send mail in HTML format */ private boolean sendHtmlMail(MailSenderInfo mailInfo) { SaAuthenticatorInfo authenticator = null; Session sendMailSession = null; Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; Properties pro = mailInfo.getProperties(); //借用这个参数来标识是否用ssl发送邮件 if (mailInfo.isValidate()) { pro.setProperty("mail.smtp.host", mailInfo.getMailServerHost()); pro.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY); pro.setProperty("mail.smtp.socketFactory.fallback", "false"); //邮箱发送服务器端口,这里设置为465端口 pro.setProperty("mail.smtp.port", mailInfo.getMailServerPort()); pro.setProperty("mail.smtp.socketFactory.port", mailInfo.getMailServerPort()); pro.put("mail.smtp.auth", "true"); final String username = mailInfo.getUserName(); final String password = mailInfo.getPassword(); //获取到邮箱会话,利用匿名内部类的方式,将发送者邮箱用户名和密码授权给jvm sendMailSession = Session.getDefaultInstance(pro, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); } else { authenticator = new SaAuthenticatorInfo(mailInfo.getUserName(), mailInfo.getPassword()); sendMailSession = Session.getDefaultInstance(pro, authenticator); } try { Message mailMessage = new MimeMessage(sendMailSession); Address from = new InternetAddress(mailInfo.getFromAddress()); mailMessage.setFrom(from); Address[] to = new Address[mailInfo.getToAddress().split(",").length]; int i = 0; for (String e : mailInfo.getToAddress().split(",")) to[i++] = new InternetAddress(e); mailMessage.setRecipients(Message.RecipientType.TO, to); mailMessage.setSubject(mailInfo.getSubject()); mailMessage.setSentDate(new Date()); Multipart mainPart = new MimeMultipart(); BodyPart html = new MimeBodyPart(); html.setContent(mailInfo.getContent(), "text/html; charset=UTF-8"); mainPart.addBodyPart(html); List<File> list = mailInfo.getFileList(); if (list != null && list.size() > 0) { for (File f : list) { MimeBodyPart mbp = new MimeBodyPart(); FileDataSource fds = new FileDataSource(f.getAbsolutePath()); mbp.setDataHandler(new DataHandler(fds)); mbp.setFileName(f.getName()); mainPart.addBodyPart(mbp); } list.clear(); } mailMessage.setContent(mainPart); Transport.send(mailMessage); return true; } catch (MessagingException ex) { ex.printStackTrace(); } return false; } }java水平实在太烂,原来工程的maven打包没搞定,直接把kafka-eagle-api打包成jar替换线上war里面的jar 替换war包里面的jar的方法也贴上
(1)# jar -tvf ke.war |grep kafka-eagle-api-1.2.4.jar 10247 Thu Oct 25 14:01:18 CST 2018 WEB-INF/lib/kafka-eagle-api-1.2.4.jar (2)# jar -xvf ke.war WEB-INF/lib/kafka-eagle-api-1.2.4.jar 已解压: WEB-INF/lib/kafka-eagle-api-1.2.4.jar # ll -rw-r--r--. 1 opp opp 4426 8月 20 10:43 kafka-eagle-api-1.2.4.jar #新的kafka-eagle-api-1.2.4.jar -rw-rw-r--. 1 opp opp 114896942 10月 12 09:48 ke.war drwxr-xr-x. 3 root root 20 12月 28 10:29 WEB-INF #解压出来的kafka-eagle-api-1.2.4.jar文件(连带目录结构也解压出来了) (3)# cp kafka-eagle-api-1.2.4.jar WEB-INF/lib/ (4)# jar -uvf ke.war WEB-INF/lib/kafka-eagle-api-1.2.4.jar 正在添加: WEB-INF/lib/kafka-eagle-api-1.2.4.jar(输入 = 4426) (输出 = 1892)(压缩了 57%)在后台http://xxx.xxx.xxx.xxx:8048/ke/system/user新建一个用户,邮件也测试发送成功了