java - NoSuchProviderException : smtp with log4j SMTP appender

标签 java log4j jms jakarta-mail slf4j

当出现异常时,我使用 log4j 发送电子邮件。下面是我的 log4j 属性文件配置。

log4j.rootLogger=WARN, R, email
log4j.appender.R=org.apache.log4j.ConsoleAppender
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{HH:mm:ss} %-5p [%c{1}]: %m%n
log4j.appender.email=org.apache.log4j.net.SMTPAppender
log4j.appender.email.BufferSize=10
log4j.appender.email.SMTPHost=myhost.com
log4j.appender.email.From=abc@some.com
log4j.appender.email.To=abc@some.com
log4j.appender.email.Subject=Error
log4j.appender.email.layout=org.apache.log4j.PatternLayout

我的是maven项目,我添加了mail.jar、activation.jar和smtp.jar的依赖项。但是在应用程序服务器启动本身上,我收到以下错误:

[ERROR] log4j:ERROR Error occured while sending e-mail notification.
[ERROR] javax.mail.NoSuchProviderException: smtp
[ERROR]     at javax.mail.Session.getService(Session.java:782)
[ERROR]     at javax.mail.Session.getTransport(Session.java:708)
[ERROR]     at javax.mail.Session.getTransport(Session.java:651)
[ERROR]     at javax.mail.Session.getTransport(Session.java:631)
[ERROR]     at javax.mail.Session.getTransport(Session.java:686)
[ERROR]     at javax.mail.Transport.send0(Transport.java:166)

我在这里错过了什么吗?错误的根本原因是什么?是因为 SMTP 主机名不正确吗?或者是因为缺少/冲突的依赖关系?

最佳答案

您不需要 smtp.jar 和 mail.jar - smtp.jar 中的所有内容也都在 mail.jar 中。摆脱 smtp.jar,尽管我怀疑这会解决您的问题。

此外,请确保类路径中没有任何其他包含 JavaMail 类的 jar 文件,例如 javaee.jar 或 j2ee.jar。

这很可能是某种类路径问题。 JavaMail 使用类加载器来查找配置提供程序(例如“smtp”)的配置文件。如果类加载器错误地处理资源查找,则可能会出现此问题。

关于java - NoSuchProviderException : smtp with log4j SMTP appender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10978501/

相关文章:

java - 模拟 Instant.now() 而不使用 Clock 进入构造函数或不使用 Clock 对象

java - 使用 log4J 记录静态方法

java - 将 Log4J 2.X 事件发送到 Log4J 1.X

node.js - Log4j JMS 附加程序向 STOMP 客户端发送空消息

Java JMS 在事务上保留消息属性

java - Retrofit 2 API 我可以使用本地文件路径或 json 字符串而不是 url 吗?

java - 如何用java faker创建一个连贯的对象

java - 什么是显式构造函数访问修饰符?

java - 使用自己的 log4j 配置在 jboss 中部署的简单 EJB jar

java - 如何配置 activemq 队列,使其不使用默认的死信队列来处理过期消息