Java Mail: нет провайдера для SMTP - PullRequest
9 голосов
/ 05 июня 2010

Я использую JavaMail для создания простого приложения, которое отправляет электронное письмо, когда находит какие-либо файлы в каталоге. Мне удалось заставить это работать от Затмения. Я запускаю приложение, и оно отправило письмо без ошибок.

Но, когда я создал банку и выполнил ее, она не работает в части отправки электронной почты. Это дает исключение:

javax.mail.NoSuchProviderException: No provider for smtp
 at javax.mail.Session.getProvider(Session.java:460)
 at javax.mail.Session.getTransport(Session.java:655)
 at javax.mail.Session.getTransport(Session.java:636)
 at main.java.util.MailManager.sendMail(MailManager.java:69)
 at main.java.DownloadsMail.composeAndSendMail(DownloadsMail.java:16)
 at main.java.DownloadsController.checkDownloads(DownloadsController.java:51)
 at main.java.MainDownloadsController.run(MainDownloadsController.java:26)
 at java.lang.Thread.run(Unknown Source)

Я использую библиотеку в этом методе:

public static boolean sendMail(String subject, String text) {

    noExceptionsThrown = true;
    try {
        loadProperties();
    } catch (IOException e1) {
        System.out.println("Problem encountered while loading properties");
        e1.printStackTrace();
        noExceptionsThrown = false;
    }

    Properties mailProps = new Properties();

    String host = "mail.smtp.host";
    mailProps.setProperty(host, connectionProps.getProperty(host));

    String tls = "mail.smtp.starttls.enable";
    mailProps.setProperty(tls, connectionProps.getProperty(tls));

    String port = "mail.smtp.port";
    mailProps.setProperty(port, connectionProps.getProperty(port));

    String user = "mail.smtp.user";
    mailProps.setProperty(user, connectionProps.getProperty(user));

    String auth = "mail.smtp.auth";
    mailProps.setProperty(auth, connectionProps.getProperty(auth));

    Session session = Session.getDefaultInstance(mailProps);
    //session.setDebug(true);

    MimeMessage message = new MimeMessage(session);

    try {
        message.setFrom(new InternetAddress(messageProps.getProperty("from")));

        message.addRecipient(Message.RecipientType.TO, new InternetAddress(
                messageProps.getProperty("to")));

        message.setSubject(subject);
        message.setText(text);
        Transport t = session.getTransport("smtp");
        try {
            t.connect(connectionProps.getProperty("user"), passwordProps
                    .getProperty("password"));
            t.sendMessage(message, message.getAllRecipients());
        } catch (Exception e) {
            System.out.println("Error encountered while sending the email");
            e.printStackTrace();
            noExceptionsThrown = false;
        } finally {
            t.close();
        }
    } catch (Exception e) {
        System.out.println("Error encountered while creating the message");
        e.printStackTrace();
        noExceptionsThrown = false;
    }
    return noExceptionsThrown;
}

Я загружаю эти значения из файлов свойств.

mail.smtp.host=smtp.gmail.com

mail.smtp.starttls.enable=true

mail.smtp.port=587

mail.smtp.auth=true

Я попытался изменить хост с помощью ssl: //smtp.gmail.com, порт на 465 (только для того, чтобы попробовать что-то другое), но он тоже не работает. В любом случае, если он работает нормально из Eclipse с исходными параметрами, я думаю, что значения верны, но проблема заключается в создании фляги. Я не очень много знаю о возможных результатах или изменениях при создании банки. Могут ли библиотеки JavaMail каким-то образом работать неправильно при создании jar-файла?

У вас есть идеи?

Ответы [ 6 ]

10 голосов
/ 05 июня 2010

Вспомогательные файлы jar: mail.jar и activ.jar отсутствуют в вашем классе. Когда вы создаете банку, вы должны включить ее в свой путь к классам.

4 голосов
/ 02 февраля 2013

У меня была такая же проблема.

Это можно исправить, создав файл JAR Runnable в Eclipse и используя параметры обработки библиотеки. Выберите второй при создании JAR, тот, который говорит «Упаковать необходимые библиотеки в сгенерированный JAR» .

package required libraries

3 голосов
/ 09 февраля 2014

вам нужно добавить файл smtp.jar, я также застрял с той же ошибкой после некоторого поиска в Google и проверки некоторых старых проектов. Я обнаружил, что пропустил этот конкретный файл в моей библиотеке, и добавил этот файл в библиотеку. и найденная проблема исправлена.

1 голос
/ 19 мая 2014

У меня была та же ошибка, обновление jar из Oracle напрямую исправляло ее.

0 голосов
/ 05 августа 2016

Для тех, кто использует Gradle: вы можете получить все необходимые банки следующим образом (1.5.5 - последняя версия):

    compile 'com.sun.mail:javax.mail:1.5.5'
0 голосов
/ 26 марта 2013

Мне удалось исправить эту ошибку, которая была из-за плохой библиотеки. Я пытался использовать javax.mail jar, скачанный с maven, который оказался неполным. Поэтому я еще раз искал javamail и получил один непосредственно из Oracle (нажмите ссылку Release ) На этот раз это zip-файл.

...