2011-12-08 75 views
1

我有一個發送電子郵件的Grails應用程序。郵件服務器沒有SMTP認證,所以它需要「SMTP之前的POP」,這意味着我需要在通過SMTP發送之前對POP帳戶進行認證。大多數情況下它可以正常工作,但偶爾會發生,郵件服務器不能從屬性中獲取,而是嘗試連接到「localhost」。這裏是屬性:JavaMail SMTP主機錯誤

Properties props = new Properties(); 

    props.setProperty("mail.store.protocol", "pop3") 
    props.setProperty("mail.pop3.host", "mail.xxxxx.com") 
    props.setProperty("mail.pop3.port", "110") 
    props.setProperty("mail.smtp.host", "mail.xxxxx.com") 
    props.setProperty("mail.smtp.port", "25") 
    props.setProperty("mail.smtp.sendpartial", "true") 
    props.setProperty("mail.pop3.socketFactory.port", "110") 
    props.setProperty("mail.pop3.socketFactory.class","javax.net.SocketFactory") 
    props.setProperty("mail.pop3.socketFactory.fallback", "false") 
    Transport t = null 
    def store 

    try { 
     URLName url = new URLName("pop3", "mail.xxxxxxx.com", 110, 
      "INBOX", "username", "password"); 

     Session session = Session.getDefaultInstance(props, null) 

     store = session.getStore(url) 
     store.connect("mail.xxxxxx.com", "username", "password") 

     Message message = new MimeMessage(session); 

     message.setFrom(new InternetAddress("[email protected]")); 

     message.setRecipients(Message.RecipientType.TO, 
      InternetAddress.parse(toAddress, true)); 

     message.setSubject(mailTitle); 
     message.setContent(messageBody, "text/html"); 
     message.setSentDate(new Date()); 

     t = session.getTransport("smtp") 
     t.connect() 
     t.send(message) 
     return true 
    } 
    catch (AddressException e) { 
     e.printStackTrace() 
     return false 
    } 
    catch (MessagingException e) { 
     e.printStackTrace() 
     return false 
    } 
    finally { 
     store?.close() 
    } 

通常情況下,這個工程。但是,當一個Quartz Job正在發送時,來自Properties的郵件服務器條目沒有兌現,它使用「localhost」代替,然後無法發送電子郵件。

我可以連接Telnet並使用提到的屬性發送。

它可能是超時問題?根據我在文檔中讀到的內容,超時是默認的「無限」,所以「應該」不是問題。

它可能是一個性能問題?我創建了一個「虛擬應用程序」,它或多或少地具有相同的功能,但不會從Grails服務發出,而是直接從控制器發出。那個人一直都在工作,但那個應用總是處於閒置狀態。

我沒有使用Grails郵件插件,因爲我看不到它可以處理「smtp之前彈出」-paradigm。

在此先感謝。

+0

請問如果更換'Session.getDefaultInstance'用'Session.getInstance'幫助?它執行較少的魔法,所以可能在石英線程內工作更好(雖然只是一個瘋狂的猜測) – Martin

+0

試過,馬丁,但它沒有效果。問題依然存在。另外,我嘗試使用主機,端口,用戶名和密碼連接到Transport對象:t.connect(主機,端口,用戶名,密碼),但也失敗了,因爲沒有SMTP認證。 –

+0

我正在嘗試使用新的屬性; 「mail.smtp.localhost」並將該值設置爲與「mail.smtp.host」相同。到目前爲止,它看起來很有希望...... –

回答

1

解決方案:它看起來好像解決的辦法是把「mail.smtp.localhost」 - 值相同的值作爲「mail.smtp.host」。自從我把這個屬性放進去以後,沒有一封郵件失敗了。我認爲這不是一個明顯的屬性,並且從我的角度來看是無知的,但是,我希望這將在未來幫助其他人。

所以,我的屬性如下:

Properties props = new Properties(); 

    props.setProperty("mail.store.protocol", "pop3") 
    props.setProperty("mail.pop3.host", "mail.xxxxxxx.com") 
    props.setProperty("mail.pop3.port", "110") 
    props.setProperty("mail.smtp.localhost", "mail.xxxxxxx.com") 
    props.setProperty("mail.smtp.host", "mail.xxxxxxx.com") 
    props.setProperty("mail.smtp.port", "25") 
    props.setProperty("mail.smtp.sendpartial", "true") 
    props.setProperty("mail.pop3.socketFactory.port", "110") 
    props.setProperty("mail.pop3.socketFactory.class","javax.net.SocketFactory") 
    props.setProperty("mail.pop3.socketFactory.fallback", "false") 

值 「mail.smtp.host」設置該屬性「mail.smtp.localhost」,不僅所犯的錯誤走開,整個例程變得快了很多。

謝謝你的努力!

0
 props.setProperty("mail.transport.protocol", "smtp"); 
     props.setProperty("mail.smtp.port", "25"); 
     props.setProperty("mail.host", "a.b.com"); 
     props.setProperty("mail.smtp.timeout", "10000"); 

上述工程

相關問題