EMR 内没有 smtp 提供程序

Posted

技术标签:

【中文标题】EMR 内没有 smtp 提供程序【英文标题】:No provider for smtp inside EMR 【发布时间】:2021-03-04 11:43:39 【问题描述】:

我正在尝试在 EMR 作业完成后发送电子邮件。我在我的 sbt 依赖项中使用了 libraryDependencies += "com.sun.mail" % "javax.mail" % "1.6.2"。

我测试了在本地发送的电子邮件,它工作正常,但相同的作业在 EMR 作业中失败,但出现以下异常:

20/11/21 04:28:12 WARN mail: expected resource not found: /META-INF/javamail.default.address.map
javax.mail.NoSuchProviderException: No provider for smtp
    at javax.mail.Session.getProvider(Session.java:545)
    at javax.mail.Session.getTransport(Session.java:744)
    at javax.mail.Session.getTransport(Session.java:725)
    at javax.mail.Session.getTransport(Session.java:782)
    at javax.mail.Transport.send0(Transport.java:249)
    at javax.mail.Transport.send(Transport.java:124)
    at util.EmailUtil.sendEmail(EmailUtil.java:44)
    at util.EmailUtil.sendMail(EmailUtil.java:59)
    at com.here.places.rule.testing.EmailTester$.main(EmailTester.scala:16)
    at com.here.places.rule.testing.EmailTester.main(EmailTester.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$4.run(ApplicationMaster.scala:706)

使用的代码是` 公共类 EmailUtil public static void sendEmail(Session session, String toEmail, String subject, String 身体) 尝试 MimeMessage 消息 = 新的 MimeMessage(会话); //设置消息头 msg.addHeader("内容类型", "文本/html; charset=UTF-8"); msg.addHeader("格式", "流动"); msg.addHeader("Content-Transfer-Encoding", "8bit");

        msg.setFrom(new InternetAddress(toEmail));
        msg.setReplyTo(InternetAddress.parse(toEmail));
        msg.setSubject(subject, "UTF-8");
        msg.setText(body, "UTF-8");

        msg.setSentDate(new Date());

        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
        System.out.println("Message is ready");
        Transport.send(msg);

        System.out.println("EMail Sent Successfully!!");
    
    catch (Exception e) 
        e.printStackTrace();
    


public static void sendMail() 
    Properties props = System.getProperties();
    props.put("mail.smtp.host", "***");
    props.put("mail.smtp.port", "25");

    Session session = Session.getInstance(props, null);
    sendEmail(session, "***","SimpleEmail Testing Subject", "SimpleEmail Testing Body");

`

【问题讨论】:

试用位于 here 的 Amazon Simple Email Service。 谢谢。我将尝试亚马逊简单电子邮件服务。但是,我仍然想知道这里到底是什么问题。我登录到数据节点并 ping 了 smtp 主机,它是成功的。另外,telnet host-name 25 也成功了。这确认没有网络问题。 我只能推荐你here。 【参考方案1】:

应用程序是使用 SBT 构建的,并使用了以下合并策略。

assemblyMergeStrategy in assembly := 
  case PathList("META-INF", xs @ _*) => MergeStrategy.discard
  case x => MergeStrategy.first

创建的胖 jar 没有来自 javax.mail jar 的必要 META_INF 文件,这会导致问题。出于测试目的,我手动将 META-INF 文件从 javax.mail jar 复制到 fat jar 中,它可以正常工作。

【讨论】:

为什么没有提供关于这个问题是如何实际解决的信息? SBT 的外观如何?

以上是关于EMR 内没有 smtp 提供程序的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS EMR 中使用 spark-submit 启动 Python 应用程序

mrjob 在 Amazon EMR 5.x 上不起作用,但在 EMR4.8.3 上运行

如何在 mandrill 中更改 SMTP 用户名

EMR:Spark 应用程序在引导时可用吗?

在 EMR 上运行 Spark 应用程序很慢

问题通过 SMTP 发送邮件