2011-07-14 63 views
6

目前我使用Commons Email發送電子郵件,但是我一直無法找到共享發送的電子郵件之間smtp連接的方法。我有一個像下面的代碼:Apache Commons電子郵件和重複使用SMTP連接

Email email = new SimpleEmail(); 
    email.setFrom("[email protected]"); 
    email.addTo("[email protected]"); 
    email.setSubject("Hello Example"); 
    email.setMsg("Hello Example"); 
    email.setSmtpPort(25); 
    email.setHostName("localhost"); 
    email.send(); 

這是非常具有可讀性,但速度很慢,當我做大量的消息,我相信這是重新連接每條消息的開銷。所以我使用下面的代碼對它進行了分析,發現使用重複使用Transport可以使事情快三倍。

Properties props = new Properties(); 
    props.setProperty("mail.transport.protocol", "smtp"); 
    Session mailSession = Session.getDefaultInstance(props, null); 
    Transport transport = mailSession.getTransport("smtp"); 
    transport.connect("localhost", 25, null, null); 

    MimeMessage message = new MimeMessage(mailSession); 
    message.setFrom(new InternetAddress("[email protected]")); 
    message.addRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]")); 
    message.setSubject("Hello Example"); 
    message.setContent("Hello Example", "text/html; charset=ISO-8859-1"); 

    transport.sendMessage(message, message.getAllRecipients()); 

所以我想知道是否有一種方法可以使Commons Email重用爲多個電子郵件發送的SMTP連接?我更喜歡Commons Email API,但表現令人痛苦。

感謝, 贖金

回答

3

我想出了挖掘到公地源本身經過以下解決方案。這應該工作,但也有可能是更好的解決方案,我不知道

Properties props = new Properties(); 
    props.setProperty("mail.transport.protocol", "smtp"); 
    Session mailSession = Session.getDefaultInstance(props, null); 
    Transport transport = mailSession.getTransport("smtp"); 
    transport.connect("localhost", 25, null, null); 

    Email email = new SimpleEmail(); 
    email.setFrom("[email protected]"); 
    email.addTo("[email protected]"); 
    email.setSubject("Hello Example"); 
    email.setMsg("Hello Example"); 
    email.setHostName("localhost"); // buildMimeMessage call below freaks out without this 

    // dug into the internals of commons email 
    // basically send() is buildMimeMessage() + Transport.send(message) 
    // so rather than using Transport, reuse the one that I already have 
    email.buildMimeMessage(); 
    Message m = email.getMimeMessage(); 
    transport.sendMessage(m, m.getAllRecipients()); 
1

難道我們沒有做到這一點通過getMailSession()從第一封電子郵件獲取郵件會話,並把它用setMailSession所有後續消息更容易()?

不是100%確定是什麼

請注意,通過用戶名和密碼(在郵件驗證的情況下),將創建一個DefaultAuthenticator一個新的郵件會話。這很容易,但可能會出乎意料。如果使用郵件身份驗證,但沒有提供用戶名和密碼,則實現假定您已設置身份驗證程序並將使用現有的郵件會話(如預期的那樣)。

從javadoc中表示,雖然: -/ http://commons.apache.org/email/api-release/org/apache/commons/mail/Email.html#setMailSession%28javax.mail.Session%29

還看到: https://issues.apache.org/jira/browse/EMAIL-96

不知道如何繼續在這裏...