分享

kafka-eagle在阿里云上邮件无法发送

 印度阿三17 2018-10-25

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多