Программа работает в IDE, но не как файл .jar - PullRequest
0 голосов
/ 07 марта 2019

Я создаю более крупную программу, которая будет отправлять электронные письма в учетную запись пользователя всякий раз, когда происходит событие, и сейчас я просто концентрируюсь на том, чтобы заставить отправку электронной почты работать.

Прямо сейчас у меня все отлично работает в IDE (IntelliJ) без ошибок и предупреждений, но после того, как я jar запустил файл и запустил его в terminal, я получаю ошибку каждый раз, когда программа пытается отправить электронное письмо.

Я предполагаю, что файл неправильно дрогнул, так как он прекрасно работает в IDE, но я не слишком уверен. Я искал похожие проблемы с моими, но не нашел работающего решения.

Это файл, который имеет проблемы в terminal

package handler;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import java.util.Properties;

public class Sender {

    private Sender(){}

    private static final String SENDERS_GMAIL = "myemail@email.com";
    private static final String SENDERS_PASSWORD = "mypassword";

    private static final String RECEIEVES_EMAIL = "myemail@email.com";

    private static Properties mailServerProperties;
    private static Session mailSession;
    private static MimeMessage mailMessage;

    public static void sendMail(String emailBody) throws Throwable
    {
        mailServerProperties = System.getProperties();
        mailServerProperties.put("mail.smtp.port", "587");
        mailServerProperties.put("mail.smtp.auth", "true");
        mailServerProperties.put("mail.smtp.starttls.enable", "true");

        mailSession = Session.getDefaultInstance(mailServerProperties);

        mailMessage = new MimeMessage(mailSession);
        mailMessage.addRecipient(RecipientType.BCC, new InternetAddress(RECEIEVES_EMAIL));
        mailMessage.setSubject("Test Email");
        mailMessage.setContent(emailBody, "text/html");

        Transport transport = mailSession.getTransport("smtp");
        transport.connect("smtp.gmail.com", SENDERS_GMAIL, SENDERS_PASSWORD);
        transport.sendMessage(mailMessage, mailMessage.getAllRecipients());
        transport.close();
    }
}

И всякий раз, когда я запускаю .jar в terminal, я получаю такую ​​ошибку:

    C:\Users\genlap\EmailSender>java -jar SendEmail.jar
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 handler.Sender.sendMail(Sender.java:37)
        at handler.ManageService.run(ManageService.java:32)
        at java.lang.Thread.run(Unknown Source)
Message failed to be sent.

Строка в файле Sender, вызываемая по ошибке:

Transport transport = mailSession.getTransport("smtp");

Кто-нибудь знает, как я могу это решить?

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Вы либо не включаете зависимости в SendEmail.jar, либо в них отсутствуют MANIFEST.MF записи, указывающие на них.Из-за этих зависимостей, которые IntelliJ использует для сборки и запуска приложения, они недоступны при выполнении java -jar из командной строки.

Самый простой способ - создать толстый JAR со всеми зависимостями.Если вы используете Maven, вы можете взглянуть на этот ответ или использовать Maven Shade Plugin .

0 голосов
/ 08 марта 2019

Если вы создаете свое приложение, беря файлы классов из jar-файла JavaMail и помещая их в свой jar-файл приложения, то вам не хватает всех файлов META-INF из jar-файла JavaMail.Наилучший подход - найти решение, которое не требует перепаковки jar-файла JavaMail, например One-JAR .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...