,端口:25,响应:421,java,scala,apache-spark,email"/>

首页 > 解决方案 > javax.mail.MessagingException:无法连接到 SMTP 主机:,端口:25,响应:421

问题描述

我在 scala 中构建了一个 Spark 应用程序,用于发送警报电子邮件。检查 Yarn 中的日志,一旦我的工作提交,我就会不断收到该错误消息:

21/06/08 11:11:07,333 INFO DAGScheduler: Job 20 finished: collect at SendingMail.scala:14, took 0.078407 s
javax.mail.MessagingException: Could not connect to SMTP host: <smtp host>, port: 25, response: 421
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1960)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:642)
    at javax.mail.Service.connect(Service.java:295)
    at javax.mail.Service.connect(Service.java:176)
    at javax.mail.Service.connect(Service.java:125)
    at javax.mail.Transport.send0(Transport.java:194)
    at javax.mail.Transport.send(Transport.java:124)
    ...

这让我感到惊讶,因为在 Spark shell 中测试代码时,我能够使用相同的代码行发送电子邮件而不会出现相同的错误。

这就是我的代码的样子:

import javax.mail.internet.{InternetAddress, MimeMessage}
import org.apache.spark.sql.{Dataset, Row}

import java.util.{Date, Properties}
import javax.mail.{Message, MessagingException, Session, Transport}

object SendingMail {
  def run(types: String, dataframe: Dataset[Row]) {
    def sendScalaMail(): Unit = {
      val fields  = s"<table><tr><th>${dataframe.columns.toSeq(0)}<th><th>${dataframe.columns.toSeq(1)}<th><th>${dataframe.columns.toSeq(2)}<th><th>${dataframe.columns.toSeq(3)}<th><th>${dataframe.columns.toSeq(4)}<th><th>${dataframe.columns.toSeq(5)}<th><th>${dataframe.columns.toSeq(6)}<th><th>${dataframe.columns.toSeq(7)}<tr>"
      val mailSender = <sender>
      val arrBatch = dataframe.select("Value").collect()
      val arrString = arrBatch.map(a => a(0).toString.replace("""]""", "").replace("""[""", "").split(",").mkString("<td><td>"))
      val newstrMailBody = arrString.map(a => "".concat(a))
      val strMailBody =  s"<style> table, th, td {border: 0.5px solid black;border-collapse: collapse;}th, td {padding: 15px;text-align: left;}#t01 {width: 100%;background-color: #f1f1c1;}</style></head><body><h2>${types} aggregation with status mismatch : <h2>" $plus fields $plus "<td>" $plus newstrMailBody.mkString("<tr><td>")
      val finalstrMailBody = strMailBody.concat("<tr></table>")
      val smtpHost: String = <smtp host>
      val prop: Properties = new Properties()
      prop.put("mail.smtp.host", smtpHost)
      val session: Session = Session.getInstance(prop)

      try {
        val msg: MimeMessage = new MimeMessage(session)
        msg.setFrom(new InternetAddress(mailSender))
        msg.setRecipients(Message.RecipientType.TO, <recipients>)
        msg.setSubject(s"Mismatch for ${types} aggregations")
        msg.setSentDate(new Date())
        msg.setContent(finalstrMailBody, "text/html")
        Transport.send(msg)
      }
      catch{
        case me:MessagingException =>
          me.printStackTrace()
      }
    }
    sendScalaMail()
  }
}

标签: javascalaapache-sparkemail

解决方案


推荐阅读