kafka-eagle在阿里云上邮件无法发送
今天在阿里云上部署了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://.:8048/ke/system/user新建一个用户,邮件也测试发送成功了
来源:http://www./content-4-68801.html
|