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

5

第一次使用Java Mail。我正在按照这个教程进行操作,但是在发送基本消息时就出错了,并且我收到一个非常奇怪的错误:

java.util.ServiceConfigurationError: javax.mail.Provider: Provider com.sun.mail.imap.IMAPProvider not a subtype

奇怪的是我在代码中没有使用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);

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

有什么建议可以解决这个问题吗?

编辑:显然,这里更改了地址/主机,并且我正在使用实际代码中有效的地址。


你应该跟随这个链接。我已经成功地使用了同样的链接通过SMTP方式发送邮件。https://www.tutorialspoint.com/javamail_api/javamail_api_gmail_smtp_server.htm - Shankar Saran Singh
或者通过此链接,希望能帮到您。 https://www.javatpoint.com/example-of-sending-email-using-java-mail-api - Shankar Saran Singh
@ShankarSaranSingh 您提供的链接不是用于“多部分”消息的。 - Scary Wombat
请发布完整的异常堆栈跟踪。如果您的类路径上有多个JavaMail/JakartaMail的副本,则可能会出现此问题,请同时发布您的依赖项列表(例如Maven pom.xml或Gradle build.gradle)。 - Mark Rotteveel
4个回答

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);
}

调整代码可以使其正常工作。

1
java.util.ServiceConfigurationError: jakarta.mail.Provider: com.sun.mail.imap.IMAPProvider not a subtype

我曾经遇到过类似的问题,因为项目使用了jakarta.mail,而其中一个依赖项将javax.mail作为传递性依赖项引入。

排除旧的javax.mail应该可以解决问题。

<dependency>
    <groupId>org.abc</groupId>
    <artifactId>xyz</artifactId>
    <version>0.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
        </exclusion>
    </exclusions>
</dependency>

mvn dependency:tree 命令可以查看所有依赖及其依赖项。


0

这是一个发送带有附件的多部分消息的示例:

String from = "from@example.com";
String to = "to@example.com";
File file = new File("/file/to/attach");

Properties mailProps = new Properties();
// put your properties here
Session session = Session.getInstance(mailProps, null);

try {
 MimeMessage message = new MimeMessage(session);
 message.setFrom(new InternetAddress(from) );
 InternetAddress[] toAddress = { new InternetAddress(to) };
 message.setRecipients(Message.RecipientType.TO, toAddress);
 message.setSubject("Demo Message");
 message.setSentDate(new Date());

 MimeBodyPart part1 = new MimeBodyPart();
 part1.setText("Test");

 MimeBodyPart part2 = new MimeBodyPart();
 part2.attachFile(file);

 Multipart multiPart = new MimeMultipart();
 multiPart.addBodyPart(part1);
 multiPart.addBodyPart(part2);

 message.setContent(multiPart);

 Transport.send(message);

} catch( MessagingException e ) {
  // handle the exception properly
  e.printStackTrace();
}

希望它能帮助到您。


0

我在LibertyCore服务器上也遇到同样的问题, 我在server.xml中添加了这个功能,现在可以正常工作了

<feature>javaMail-1.6</feature>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接