2010-06-05 198 views
9

我正在使用JavaMail做一個簡單的應用程序,當它發現一個目錄中的一些文件時發送一封電子郵件。我設法從Eclipse開始工作。我運行該應用程序,它發送沒有錯誤的電子郵件。Java郵件:沒有供應商爲smtp

但是,當我創建的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庫會不會出錯?

你有什麼想法嗎?

回答

10

支持jar:mail.jar和activation.jar不在您的類路徑中。當你構建你的jar時,你需要在你的類路徑中包含這些。

+0

非常感謝您回答這麼快。 我剛剛試過了你告訴我的,我不知道我是否以正確的方式做到了這一點: 在Eclipse中,在項目的屬性中,我看到在構建路徑中,在庫中:activation.jar ,mailapi.jar,smtp.jar ...在那裏。在訂單和出口,我已經檢查了這些罐子。他們沒有被檢查過。我再次導出了jar,但錯誤仍然存​​在。可能我做錯了什麼?也許我不應該從Eclipse中做到這一點?謝謝邁克。 – pablof 2010-06-05 13:24:11

+0

我對eclipse不熟悉。但是這絕對是與類路徑相關的東西。下一步你可以改變你運行jar的方式。當你運行你的jar時,包含這兩個jar的路徑。所以關閉我的頭頂,像這樣:jar -cp ./full/path/to/activation.jar:./full/path/to/mail.jar -jar yourjarname.jar – Mike 2010-06-05 13:42:18

+0

謝謝麥克。我會嘗試這個。 – pablof 2010-06-05 18:02:02

4

我有同樣的問題。

您可以通過在Eclipse中創建Runnable JAR文件並使用庫處理選項來修復它。在製作您的JAR時請選擇第二個,該文件說明「將所需的庫打包到生成的JAR中」

package required libraries

-1

我設法解決這個錯誤,這是由於糟糕的圖書館。我嘗試使用從maven下載的javax.mail jar文件,結果不完整。所以我再次搜索javamail並得到一個directly from Oracle(點擊版本鏈接)。這次它是一個zip文件。

3

你需要添加smtp.jar文件,我也遇到了一些谷歌搜索和檢查一些舊項目後發現同樣的錯誤,我發現我錯過了我的庫中的這個特定的jar,我將這個jar添加到庫和發現問題修復。

1

我有同樣的錯誤,從Oracle更新jar直接修復它。

0

對於使用搖籃的:你可以得到所有需要的jar如下(1.5.5是最新的版本):

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