Java Mail:发送电子邮件时出现异常

beg*_*er_ 5 java jakarta-mail

第一次使用java邮件。我正在遵循本教程,但我已经无法发送基本消息,并且收到一个非常奇怪的错误:

java.util.ServiceConfigurationError: javax.mail.Provider: Provider com.sun.mail.imap.IMAPProvider not a subtype
Run Code Online (Sandbox Code Playgroud)

奇怪的是,我没有在代码中的任何地方使用 IMAP:

Properties mailProps = new Properties();
mailProps.put("mail.transport.protocol", "smtp");
mailProps.put("mail.host", "smtp.mydomain.com");
mailProps.put("mail.from", "me@mydomain.com");
mailProps.put("mail.smtp.port", "25");     

Session session = Session.getDefaultInstance(mailProps);
SMTPMessage m = new SMTPMessage(session);
MimeMultipart content = new MimeMultipart();
MimeBodyPart mainPart = new MimeBodyPart();
mainPart.setText("test");
content.addBodyPart(mainPart);  
m.setContent(content);
m.setSubject("Demo message");

m.setRecipient(RecipientType.TO, new InternetAddress("john@example.com"));
Transport.send(m);
Run Code Online (Sandbox Code Playgroud)

错误发生在最后一行(发送)。我知道 smtp 服务器正确且正常工作。

有什么建议为什么会发生这种情况以及我该如何解决它吗?

编辑:显然,地址/主机在这里发生了变化,我使用的是在实际代码中工作的真实地址/主机。

beg*_*er_ 2

事实证明我遇到了多个问题:

  1. 教程有问题

它使用com.sun.mail.smtp.SMTPMessage但在我的情况下不起作用,但使用javax.mail.internet.MimeMessage效果很好。

  1. 错误的根本原因

上面的代码在基于 Eclipse 的第三方应用程序中运行,它们似乎互相干扰。可以在这里找到解决方案:

Thread t =  Thread.currentThread();
ClassLoader ccl = t.getContextClassLoader();
t.setContextClassLoader(session.getClass().getClassLoader());
try {
    Transport.send(m);
} finally {
    t.setContextClassLoader(ccl);
}
Run Code Online (Sandbox Code Playgroud)

相应地调整代码使其工作。