java - 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()
}
}
解决方案
推荐阅读
- laravel-5 - 从 laravel 将用户添加到 phpbb3 论坛用户表
- postgresql - 创建表时出错:“@”处或附近的语法错误
- java - 在 java servlet 中设置多种内容类型
- python - Twitter api 流不是将推文作为推文对象传递,而是作为字符串传递
- python-2.7 - 如何使用点群制作复杂的形状......比如椅子、火箭等等,使用 pygame 和 numpy
- javascript - 为什么使用缓冲区转换日期格式比使用字符串操作慢?
- windows - 如何通过 CMD 在 Windows 上仅删除用户路径中的某些值
- php - 无法使用 sqlsrv_connect() 连接到 ms sql server
- reactjs - 在测试中模拟localStorage数据
- r - 如何在多列中有条件地用 NA 替换值