2008-11-07 44 views
10

我想發送郵件而不用打擾用於傳遞的SMTP服務器。有人知道用於Java的郵件(SMTP)傳遞庫嗎?

所以JavaMail API不適合我,因爲我必須指定一個SMTP服務器連接到。

我希望圖書館通過查詢郵件地址域的MX記錄來找出哪個SMTP服務器負責哪個電子郵件地址。

我在尋找類似Aspirin的東西。不幸的是,我不能使用阿司匹林本身,因爲開發停止了2004年,圖書館無法正確地與現代的垃圾郵件強化服務器進行通信。

James的可嵌入版本將執行此任務。但是我還沒有找到關於這是否可能的文件。

或者有人知道我可以使用的其他庫嗎?

+0

我很好奇,爲什麼你不想使用自己的郵件服務器來處理郵件和卸載你的工作? – Joel 2008-11-07 14:53:34

+0

該應用程序針對不同環境中的不同客戶安裝。他們會發送報告郵件到他們自己的電子郵件地址。我不希望他們使用「我們的」電子郵件服務器來發送「他們的」電子郵件。 – 2008-11-07 15:45:28

回答

2

這完全是錯誤的處理方法。

任何連接到互聯網,將具有某種「合法的」 SMTP服務器提供給他們取提交電子郵件的 - 你的ISP,你的辦公室等

要充分利用,因爲他們做幾給你的東西。

1)他們把你的信息和責任處理該信息。你把它關掉後,它不再是你的問題了。

2)任何郵件反垃圾郵件技術都由服務器處理。更好的是,如果這些技術發生變化(域密鑰任何人?),服務器將處理它,而不是您的代碼。

3)作爲發送郵件系統的客戶端,您已擁有與該服務器交談所需的任何憑據。主SMTP服務器通過身份驗證,IP範圍等被鎖定。

4)您不是在重新發明輪子。利用您擁有的基礎設施。你正在編寫一個應用程序或郵件服務器?設置郵件服務器是一項每天都很簡單的任務。互聯網上所有那些偶然的「啞巴」用戶都設法建立了電子郵件。

16

一個可能的解決方案:自行獲取MX記錄並使用JavaMail API

您可以使用dnsjava項目獲得的MX記錄:

Maven2的依賴性:

的MX記錄檢索
<dependency> 
    <groupId>dnsjava</groupId> 
    <artifactId>dnsjava</artifactId> 
    <version>2.0.1</version> 
</dependency> 

方法:

public static String getMXRecordsForEmailAddress(String eMailAddress) { 
    String returnValue = null; 

    try { 
     String hostName = getHostNameFromEmailAddress(eMailAddress); 
     Record[] records = new Lookup(hostName, Type.MX).run(); 
     if (records == null) { throw new RuntimeException("No MX records found for domain " + hostName + "."); } 

     if (log.isTraceEnabled()) { 
      // log found entries for debugging purposes 
      for (int i = 0; i < records.length; i++) { 
       MXRecord mx = (MXRecord) records[i]; 
       String targetString = mx.getTarget().toString(); 
       log.trace("MX-Record for '" + hostName + "':" + targetString); 
      } 
     } 

     // return first entry (not the best solution) 
     if (records.length > 0) { 
      MXRecord mx = (MXRecord) records[0]; 
      returnValue = mx.getTarget().toString(); 
     } 
    } catch (TextParseException e) { 
     throw new RuntimeException(e); 
    } 

    if (log.isTraceEnabled()) { 
     log.trace("Using: " + returnValue); 
    } 
    return returnValue; 
} 

private static String getHostNameFromEmailAddress(String mailAddress) throws TextParseException { 
    String parts[] = mailAddress.split("@"); 
    if (parts.length != 2) throw new TextParseException("Cannot parse E-Mail-Address: '" + mailAddress + "'"); 
    return parts[1]; 
} 

通過JavaMail代碼發送郵件:

public static void sendMail(String toAddress, String fromAddress, String subject, String body) throws AddressException, MessagingException { 
    String smtpServer = getMXRecordsForEmailAddress(toAddress); 

    // create session 
    Properties props = new Properties(); 
    props.put("mail.smtp.host", smtpServer); 
    Session session = Session.getDefaultInstance(props); 

    // create message 
    Message msg = new MimeMessage(session); 
    msg.setFrom(new InternetAddress(fromAddress)); 
    msg.setRecipient(Message.RecipientType.TO, new InternetAddress(toAddress)); 
    msg.setSubject(subject); 
    msg.setText(body); 

    // send message 
    Transport.send(msg); 
} 
2

不要。

發送電子郵件比看起來複雜得多。電子郵件服務器擅長(或應該擅長)可靠的交付。

如果您需要,建立一個單獨的電子郵件服務器 - 這基本上與使用Java實現一個服務器相同(我懷疑您會找到用於此任務的庫 - 它們本質上是完整的郵件服務器),但更簡單得多。

相關問題