Java Mail:没有smtp的提供者

时间:2010-06-05 12:55:23

标签: java email javamail

我正在使用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 个答案:

答案 0 :(得分:10)

支持jar:mail.jar和activation.jar不在您的类路径中。在构建jar时,需要将它们包含在类路径中。

答案 1 :(得分:4)

我遇到了同样的问题。

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

package required libraries

答案 2 :(得分:3)

你需要添加smtp.jar文件,我在谷歌搜索和检查一些较旧的项目时也遇到了同样的错误我发现我错过了我库中的这个特殊jar,我将这个jar添加到了库中并发现问题已修复。

答案 3 :(得分:1)

我遇到了同样的错误,更新了Oracle直接修复它的jar。

答案 4 :(得分:0)

对于使用Gradle的人:您可以按以下方式获得所有必需的Jars(1.5.5是最新版本):

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

答案 5 :(得分:-1)

我设法修复了这个错误,这是由于库错了。我试图使用从maven下载的javax.mail jar,结果证明是不完整的。所以我再次搜索javamail并获得一个directly from Oracle(点击发布链接)。这次它是一个zip文件。