栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

azkaban邮箱配置(基于azkaban3.9.0.0)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

azkaban邮箱配置(基于azkaban3.9.0.0)

① 环境准备: azkaban web端和server端能正常启动,并且正常登录,安装参考上篇
        azkaban安装(Linux环境)_江湖峰哥的博客-CSDN博客

② 邮箱配置主要配置邮箱发送端,并且只需要配置web端即可

③ 注意踩坑,azkaban3.9.0.0这个版本无法使用smtps协议发送邮件,源码如下:
 

public class JavaxMailSender {

  public static final String PROTOCOL = "smtp";

  private final Session session;
  private final SMTPTransport t;

  public JavaxMailSender(final Properties props)
      throws NoSuchProviderException {
    this.session = Session.getInstance(props, null);
    this.t = (SMTPTransport) this.session.getTransport(PROTOCOL);
  }
......

最终调用azkaban-3.90.0/azkaban-common/src/main/java/azkaban/utils/JavaxMailSender类中下SMTPTransport的当前实例去建立连接,发送消息,而源码
this.t = (SMTPTransport) this.session.getTransport(PROTOCOL);

这句代码看得我一脸懵逼,框架默认注入了pop3s,pop3,smtps,imaps不同协议的不同Provider实例,通过传入不同的protocol返回不同的实现,源码是将实例缓存在hashtable中,因为这里写死了protocol为smtp,所以无论怎么配置都只能使用25端口通过smtp协议发送邮件,而一般的云服务器都将25端口禁用掉了,这里做过测试,阿里云主机,25端口虽然能telnet通,但是邮件始终发送不出去,还有一点注意踩坑,源码如下:
 

public class EmailMessageCreator {

  public static final int DEFAULT_SMTP_PORT = 25;

  private final String mailHost;
  private final int mailPort;
  private final String mailUser;
  private final String mailPassword;
  private final String mailSender;
  private final String tls;
  private final boolean usesAuth;

  @Inject
  public EmailMessageCreator(final Props props) {
    this.mailHost = props.getString("mail.host", "localhost");
    this.mailPort = props.getInt("mail.port", DEFAULT_SMTP_PORT);
    this.mailUser = props.getString("mail.user", "");
    this.mailPassword = props.getString("mail.password", "");
    this.mailSender = props.getString("mail.sender", "");
    this.tls = props.getString("mail.tls", "false");
    this.usesAuth = props.getBoolean("mail.useAuth", true);
  }

邮件配置参数通过EmailMessageCreator注入并向后传递,但是该类中并没有打算接收protocol的属性配置,所以即使配置了这里也获取不到,所以需要修改源代码两处:
 

伪代码:
public class EmailMessageCreator {

  public static final int DEFAULT_SMTP_PORT = 25;

  private final String mailHost;
  private final int mailPort;
  private final String mailUser;
  private final String mailPassword;
  private final String mailSender;
  private final String protocol; // 增加protocol属性
  private final String tls;
  private final boolean usesAuth;

  @Inject
  public EmailMessageCreator(final Props props) {
    this.mailHost = props.getString("mail.host", "localhost");
    this.mailPort = props.getInt("mail.port", DEFAULT_SMTP_PORT);
    this.mailUser = props.getString("mail.user", "");
    this.mailPassword = props.getString("mail.password", "");
    this.protocol = props.getString("mail.transport.protocol", "smtp"); // 通过配置文件注入属性,key为mail.transport.protocol,默认值为smtp
    this.mailSender = props.getString("mail.sender", "");
    this.tls = props.getString("mail.tls", "false");
    this.usesAuth = props.getBoolean("mail.useAuth", true);
  }
......
}

伪代码:
public class JavaxMailSender {

  public static final String PROTOCOL = "smtp";

  private final Session session;
  private final Transport t; // 用顶级父类接收

  public JavaxMailSender(final Properties props)
      throws NoSuchProviderException {
    this.session = Session.getInstance(props, null);
    this.t =  this.session.getTransport(props.getProperty("mail.transport.protocol",PROTOCOL));
// 通过传入的参数获取要返回的实例,没传入就使用默认值
  }

④ 参考上篇的安装,重新编译源码

⑤ 添加配置文件

# mail settings  这里配置的是邮件发送方属性
mail.transport.protocol=smtps
mail.sender=123456@163.com
mail.host=smtp.163.com
mail.port=465 #可以不配,smtps协议默认端口465
mail.user=123456@163.com
mail.password=abcdef #这里是不同邮箱官方给的授权码,不是邮箱登录密码,怎么获取自己查资料
mail.useAuth=true
#mail.tls=true  //这里要么不配置,要么为false,配置为true,邮件发送不出去

⑥ 以为万事大吉,其实还没有,你还有可能遇到下面的坑,跟jdk版本和平台有关

windows[jdk1.8]:  openjdkjrelibsecurityjava.security
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024,
    EC keySize < 224, 3DES_EDE_CBC, anon, NULL

linux[jdk1.8]: jdk1.8.0_301/jre/lib/security/java.security

jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA,
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL,
   include jdk.disabled.namedCurves

linux平台jdk将TLSv1, TLSv1.1加密算法禁用了,所以导致使用smtps协议无法正常使用,解决办法将TLSv1, TLSv1.1这两种算法干掉,表示启用这两种算法

⑦ source一下环境变量,重新启动azkaban服务,接下来去测试邮件服务,不出意外就能成功了!祝您好运!!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/988545.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号