2011-11-25 93 views
1

我們打算開發一種服務,它始終將保持連接到電子郵件服務器,以便每當用戶觸發郵件時,它將通過使用連接發送而不是獲得新連接併發送郵件。 是否有可能我們總是使用JAVA Mail API保持與電子郵件服務器的連接? 請在此幫助我。連續郵件服務器使用JAVA郵件API連接

回答

3

當您連接到SMTP服務器時(同樣在使用javax.mail API時),您使用套接字連接(請參閱SMTPTransport and Transport classes的src)。套接字允許您連接到遠程服務器,並且該連接保持打開狀態,直到明確關閉。這意味着理論上你可以創建一個連接並重用它。

但是,許多SMTP服務器非常邪惡,將終止連接if you are using it "too slow"if you try to resuse your SMTP session to often。 (我查找了postfix設置。)

Java郵件API允許您創建連接並在需要時關閉它。水木清華。像這樣:

 Transport transport = session.getTransport("smtp"); 
     transport.connect(); 
     transport.sendMessage(msg, addressArray); 
     // you can do transport.close(); later 

然而,因爲事實的SMTP服務器是如何,你不能只執行一次connect()和忘記它。最多可以做的是通過重新連接來正確處理強制斷開連接。還有就是Java郵件API做,在一個通知機制(以在notifyConnectionListeners方法的用法看看)

+0

感謝您的快速回復,我會檢查這個並回來給你。 – vairam

+0

嗨,我試過上面的代碼,它的工作正常,但有一個問題在那裏。如果我想連續發送消息使用與消息類型相同的連接作爲html(MinmeMessage和MimeBodyPart),則先前的消息將附加到下一封郵件中。你知道它附加的原因嗎? – vairam

+0

嗨,忽略上面的評論,我試了上面的代碼,它的工作正常,再次感謝。 – vairam

0

然而,因爲事實的SMTP服務器是如何,你不能只是 執行連接()一次並忘記它。至多,你可以做什麼, 通過重新連接再次正確處理強制斷開連接。

同意!

可事實上重複使用下面的邏輯了JavaMail SMTP連接:

Transport transport = null; 
MimeMessage message = null; 

Properties prop = new Properties(); 
// load all smtp properties 

Session session = Session.getDefaultInstance(prop, null); 
transport = session.getTransport("smtp"); 

for (EachMail eachMail : list) { 
    if (!transport.isConnected()) { 
     if (port != null && port.length() > 0) { 
      transport.connect(host, Integer.parseInt(port), "<username>", "<password>"); 
     } else { 
      transport.connect(host, "<username>", "<password>"); 
     } 
    } 

    // set all mail attributes from eachMail object 
    message.saveChanges(); 
    transport.sendMessage(message, message.getAllRecipients()); 
} 

就像一個魅力。乾杯!

0

如果你想要一個總是連接的連接,你應該在發送方法之外創建你的傳輸,但是爲了避免在發送時出現錯誤(SMTPSendFailedException 421超時數據客戶端),你應該檢查傳輸是否連接,如果不連接再次befor發送:

if (!transport.isConnected())//make sure the connection is alive 
      transport.connect(); 
transport.sendMessage(message, message.getAllRecipients()); 
相關問題