2008-11-07 11 views
10

Tôi muốn gửi thư mà không làm phiền với Máy chủ SMTP được sử dụng để gửi.Ai đó biết thư viện gửi thư (SMTP) cho Java?

Vì vậy, JavaMail API không hoạt động đối với tôi vì tôi phải chỉ định máy chủ SMTP để kết nối.

Tôi muốn thư viện tự tìm hiểu xem máy chủ SMTP nào chịu trách nhiệm về địa chỉ email nào bằng cách truy vấn bản ghi MX của miền địa chỉ email.

Tôi đang tìm một cái gì đó như Aspirin. Thật không may tôi không thể sử dụng Aspirin chính nó bởi vì sự phát triển dừng lại năm 2004 và thư viện không giao tiếp với các máy chủ thư rác hiện đại cứng một cách chính xác.

Phiên bản có thể nhúng của James sẽ thực hiện tác vụ. Nhưng tôi đã không tìm thấy tài liệu liên quan đến việc liệu điều này là có thể.

Hoặc có ai biết về các thư viện khác mà tôi có thể sử dụng không?

+0

Tôi rất tò mò, tại sao bạn không muốn sử dụng máy chủ thư của riêng mình để xử lý các thư và giảm tải công việc của bạn? – Joel

+0

Ứng dụng được cài đặt cho các khách hàng khác nhau trong các môi trường khác nhau. Họ sẽ gửi thư báo cáo đến địa chỉ email của chính họ. Tôi không muốn họ sử dụng máy chủ email "của chúng tôi" để gửi email "của họ". –

+3

Lưu ý rằng công việc trên Aspirin dường như đã khởi động lại. Nó được chuyển đến GitHub trong năm 2009 (http://github.com/masukomi/aspirin), và một bản phát hành được thực hiện vào tháng Chín. –

Trả lời

2

Đây là cách hoàn toàn sai để xử lý việc này.

Bất cứ ai kết nối với internet sẽ có một số loại "hợp pháp" máy chủ SMTP có sẵn để họ thực hiện việc nộp email - ISP của bạn, văn phòng của bạn, vv

Bạn muốn tận dụng bởi vì họ làm một vài mọi thứ cho bạn.

1) họ nhận thư của bạn và có trách nhiệm xử lý thư đó. Sau khi bạn thả nó đi, nó không còn là vấn đề của bạn nữa.

2) Mọi công nghệ gửi thư rác đều được máy chủ xử lý. Thậm chí tốt hơn, khi/nếu những công nghệ đó thay đổi (Domain keys any?), Máy chủ xử lý nó, chứ không phải mã của bạn.

3) Bạn, là khách hàng của hệ thống gửi thư đó, đã có bất kỳ thông tin đăng nhập nào bạn cần để nói chuyện với máy chủ đó. Máy chủ SMTP chính bị khóa qua xác thực, phạm vi IP, v.v.

4) Bạn không phát minh lại bánh xe.Tận dụng cơ sở hạ tầng bạn có. Bạn đang viết một ứng dụng hay một máy chủ thư? Thiết lập máy chủ thư là một công việc hàng ngày thường đơn giản để làm. Tất cả những người dùng "câm" bình thường trên internet đều đã quản lý để thiết lập email.

16

Một giải pháp có thể có: tự lấy bản ghi MX và sử dụng JavaMail API.

Bạn có thể nhận các bản ghi MX sử dụng dự án dnsjava:

Maven2 phụ thuộc:

<dependency> 
    <groupId>dnsjava</groupId> 
    <artifactId>dnsjava</artifactId> 
    <version>2.0.1</version> 
</dependency> 

Phương pháp MX hồi kỷ lục:

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]; 
} 

Gửi email thông qua mã 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); 
} 
+0

Tôi không nghĩ rằng điều này sẽ làm việc cho trường hợp hàng loạt. Không có nhiều quản trị viên sẽ định cấu hình máy chủ thư của họ ở chế độ chuyển tiếp mở. Bạn phải xác thực chính mình với máy chủ .. – Lazarin

+4

Đây không phải là tình huống chuyển tiếp. Chúng tôi gửi thư đến máy chủ thư chịu trách nhiệm về địa chỉ email. [email protected] sẽ được gửi tới gmail và gmail S accept chấp nhận thư nếu đó là địa chỉ gmail hợp lệ. Đây là cách hệ thống gửi email hoạt động. –

+1

Bạn nói đúng, bạn không mô tả một rơle. Nhưng, tôi nghĩ những gì Lazarin đang nhận được là một máy chủ được spam cứng sẽ đảm bảo rằng máy chủ gửi được liệt kê trong bản ghi MX cho miền của người gửi có mục đích. – erickson

2

Không.

Gửi email phức tạp hơn nhiều so với dường như. Máy chủ email nổi trội tại (hoặc nên nổi trội) giao hàng đáng tin cậy.

Thiết lập máy chủ email riêng nếu bạn cần - về cơ bản giống như thực hiện một trong Java (tôi nghi ngờ bạn sẽ tìm thấy thư viện cho tác vụ này - về cơ bản chúng sẽ hoàn thành máy chủ thư), nhưng đơn giản hơn nhiều .