2013-07-09 79 views
5

我想在我的應用程序中創建一個實用程序方法,該方法接受電子郵件作爲參數並知道如何發送它。此實用程序方法將負責知道哪個SMTP服務器使用它應該使用的憑據來連接它。在沒有郵件會話的情況下使用Java創建電子郵件

我快與javax.mail的問題是javax.mail.Message類和javax.mail.MimeMessage類期待javax.mail.Session對象作爲參數傳遞給構造。因此,我不能有像

private static void sendMail(javax.mail.Message); 

方法簽名,因爲我的客戶端類將無法constuct消息都沒有,我試圖抽象掉的細節。他們必須知道如何通過連接到郵件服務器來創建會話。

有沒有辦法在沒有會話的情況下創建消息,或者是封裝不需要會話的電子郵件的類?

+1

你有沒有在Apache的通用電子郵件軟件包看着這一切,或者是你在'javax.mail'設置? – thatidiotguy

+0

我使用Apache公共。我對使用開源軟件包的解決方案感到非常滿意。 –

回答

4

使用Apache Commons Email,可以將以下任何代碼添加到sendMail方法,具體取決於您希望設置的位置。

HtmlEmail email = new HtmlEmail(); 
    //email.setDebug(debugMode); 
    email.setBounceAddress("[email protected]"); 
    email.setHostName("mySMTPHost"); 


    email.setFrom("[email protected]"); 
    email.addTo(emailAddress); 
    email.addBcc("bccAddres"); 

    email.setSubject("Your Subject"); 
    email.setAuthentication("[email protected]", "password"); 
    email.setSSL(true); 
    email.setSmtpPort(465); 
    email.setHtmlMsg(html); 

public static void sendMail(org.apache.commons.mail.HtmlEmail email) 
{  
    email.send(); 
} 
+1

本示例中使用的庫來自Apache Commons:http://commons.apache.org/。 HTMLEmail是這些庫的commons-email組件中的一個類:http://commons.apache.org/proper/commons-email/ –

0

而不是讓每個客戶端自己創建消息類,讓他們從您的實用程序類中獲取消息對象。然後,實用程序類可以構造具有所需會話信息的消息對象。

+0

是否有這樣的消息實用程序對象已經在某個庫中構建,或者這是我會必須創建? –

+0

我認爲你需要創建它。即使Spring使用JavaMailSenderImpl中的會話對象。 http://static.springsource.org/spring/docs/2.0.8/api/org/springframework/mail/javamail/JavaMailSenderImpl.html – mmirwaldt

+0

這個答案缺少一個代碼示例,或者至少應該清楚地指出什麼是實用程序你正在談論的課程(-1) –

5

MimeMessage類將接受空會話。如果您創建此類消息,Transport.send可能無法發送您的MimeMessage要解決您只需管理自己的會話和傳輸對象,然後使用非靜態的Transport.sendMessage方法。

public void forward(Session session, Message m) throws MessagingException { 
    Address[] all = m.getAllRecipients(); 
    if (all == null) { //Don't pass null to sendMessage. 
     all = new InternetAddress[0]; 
    } 

    Transport t; 
    try { 
     if (all.length != 0) { 
      t = session.getTransport(all[0]); 
     } else { 
      t = session.getTransport("smtp"); 
     } 
    } catch (NoSuchProviderException tryDefault) { 
     try { 
      t = session.getTransport(); 
     } catch (NoSuchProviderException fail) { 
      if (fail.setNextException(tryDefault)) { 
       throw fail; 
      } else { 
       tryDefault.setNextException(fail); 
       throw tryDefault; 
      } 
     } 
    } 


    m.saveChanges(); 

    t.connect("host", 25, "user", "pass"); 
    try { 
     t.sendMessage(m, all); 
    } finally { 
     try { 
      t.close(); 
     } catch (MessagingException warning) { 
     } 
    } 
} 
+0

你可以提供或指出任何示例代碼? –

+1

添加示例代碼。 – jmehrens

1

如果你正在使用Spring框架/春天開機,你可以注入一個Spring JavaMailSenderImpl到類,並做(很明顯,你將需要注入郵件發送者太SMTP服務器屬性):

MimeMessage mimeMessage = javaMailSender.createMimeMessage(); 

你需要以下依賴添加到您的應用程序這個工作:

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-mail</artifactId> 
    </dependency> 
相關問題