我正在创建一个更大的程序,该程序将在事件发生时将电子邮件发送到用户帐户,现在我只是专注于使电子邮件发送工作正常。
现在,我已经在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");
有人知道我该怎么解决吗?
答案 0 :(得分:1)
您要么不在SendEmail.jar
中包括依赖项,要么缺少指向它们的MANIFEST.MF
条目。由于从命令行执行java -jar
时,IntelliJ用于构建和运行应用程序的依赖项不可用。
最简单的方法是创建具有所有依赖项的胖JAR。如果您使用Maven,则可以查看this answer或使用Maven Shade Plugin。
答案 1 :(得分:0)
如果要通过从JavaMail jar文件中删除类文件并将其放入应用程序jar文件中来创建应用程序,那么您将丢失JavaMail jar文件中的所有META-INF文件。最好的方法是找到不需要重新打包JavaMail jar文件(例如One-JAR)的解决方案。