Java Mail:smtp没有提供程序

10
我正在使用JavaMail编写一个简单的应用程序,当在一个目录中找到一些文件时,它可以发送电子邮件。我已经成功地从Eclipse中实现了这个功能。我运行了应用程序,并且没有出现任何错误就成功地发送了电子邮件。
但是,当我创建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 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中正常工作,我想值是正确的,但问题是创建jar时出现了问题。我不太了解创建jar时可能产生的可能结果或更改。当创建jar时,JavaMail库可能会出错吗?

你有任何想法吗?

6个回答

10

支持文件(supporting jars):mail.jar和activation.jar不在您的类路径上。当您构建jar文件时,您需要将这些文件包含在您的类路径中。


非常感谢您的快速回复。 我刚刚尝试了您告诉我的方法,但我不知道是否做得正确: 在Eclipse中,项目属性中的构建路径下,我看到了Libraries中有activation.jar、mailapi.jar、smtp.jar等。在Order and Export中,我勾选了这些jar文件。它们以前没有被勾选过。我重新导出了jar文件,但错误仍然存在。我可能做错了什么吗?也许我不应该从Eclipse中进行操作?谢谢Mike。 - pablof
我不熟悉Eclipse。但这肯定与类路径有关。你可以更改运行jar的方式作为下一步。在运行jar时包括这两个jar的路径。所以,从我的经验来看,大概是这样:jar -cp ./full/path/to/activation.jar:./full/path/to/mail.jar -jar yourjarname.jar - Mike
谢谢你,Mike。我会试一下这个。 - pablof

4

我遇到了同样的问题。

您可以通过在Eclipse中创建可运行的JAR文件并使用库处理选项来解决它。在制作JAR文件时选择第二个选项,即说“将所需库打包到生成的JAR文件中”。

package required libraries


3

您需要添加smtp.jar文件,我在谷歌搜索并检查一些旧项目后也遇到了同样的错误,发现我在库中缺少了这个特定的jar文件,我将其添加到库中并发现问题已解决。


1

对于使用Gradle的用户:您可以按如下方式获取所有需要的Jars(1.5.5是最新版本):

    compile 'com.sun.mail:javax.mail:1.5.5'

1

我曾经遇到过同样的错误,直接从Oracle更新jar包就解决了问题。


-1

我成功修复了这个错误,原因是由于一个不好的库。我尝试使用从Maven下载的javax.mail jar文件,结果发现它是不完整的。所以我再次搜索javamail并从Oracle直接获取了一个(点击Release链接)。这次它是一个zip文件。


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