Java Mail: исключение при отправке электронной почты - PullRequest
1 голос
/ 08 января 2020

Первый раз работаю с java почтой. Я следую этому учебнику , но мне уже не удается отправить базовое c сообщение, и я получаю очень странную ошибку:

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

Ошибка происходит в последней строке (отправить). Я знаю, что сервер SMTP правильный и работает.

Любой совет, почему это происходит и как я могу это решить?

РЕДАКТИРОВАТЬ: очевидно, что адреса / хосты здесь изменены, и я использую реальный те, которые работают в реальном коде.

Ответы [ 2 ]

2 голосов
/ 08 января 2020

оказывается, я столкнулся с несколькими проблемами:

  1. Проблема с учебником

Используется com.sun.mail.smtp.SMTPMessage, но в моем случае это не работает, но используется javax.mail.internet.MimeMessage отлично работает.

Root причина ошибки

Приведенный выше код запускается в стороннем приложении, основанном на затмении, и, кажется, он мешает друг другу. Решение для этого можно найти здесь :

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

Корректировка кода соответственно, чтобы он работал.

0 голосов
/ 08 января 2020

Это пример отправки составного сообщения с вложением:

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

Надеюсь, это поможет.

...