2013-07-09 29 views
5

Tôi muốn tạo một phương thức tiện ích trong ứng dụng của mình chấp nhận thông báo email làm đối số và biết cách gửi nó. Phương thức tiện ích này sẽ chịu trách nhiệm cho việc biết máy chủ SMTP nào sử dụng thông tin đăng nhập nào cần sử dụng để kết nối với nó.Tạo một email trong Java mà không có phiên thư

Vấn đề mà tôi đang chạy vào với javax.mail là lớp javax.mail.Message và lớp javax.mail.MimeMessage mong đợi một đối tượng javax.mail.Session như một cuộc tranh cãi với các nhà xây dựng. Vì vậy, tôi không thể có một phương pháp chữ ký như

private static void sendMail(javax.mail.Message); 

vì lớp khách hàng của tôi sẽ không thể để constuct các tin nhắn mà không cần tất cả các chi tiết mà tôi đang cố gắng để tóm tắt đi. Họ sẽ phải biết cách tạo một phiên bằng cách kết nối với máy chủ thư.

Có cách nào để tạo một Tin nhắn không có phiên, hoặc cách khác là lớp đóng gói một email không yêu cầu phiên?

+1

bạn đã xem xét các gói email Apache Commons ở tất cả, hoặc bạn đang đặt trên 'javax.mail'? – thatidiotguy

+0

Tôi sử dụng Apache commons. Tôi rất hài lòng với giải pháp liên quan đến gói nguồn mở. –

Trả lời

4

Sử dụng Apache Commons Email, bất kỳ mã nào sau đây có thể được thêm vào phương thức sendMail tùy thuộc vào nơi bạn muốn mọi thứ được đặt.

HtmlEmail email = new HtmlEmail(); 
    //email.setDebug(debugMode); 
    email.setBounceAddress("[email protected]"); 
    email.setHostName("mySMTPHost"); 


    email.setFrom("[email protected]"); 
    email.addTo(emailAddress); 
    email.addBcc("bccAddres"); 

    email.setSubject("Your Subject"); 
    email.setAuthentication("[email protected]rg", "password"); 
    email.setSSL(true); 
    email.setSmtpPort(465); 
    email.setHtmlMsg(html); 

public static void sendMail(org.apache.commons.mail.HtmlEmail email) 
{  
    email.send(); 
} 
+1

Các thư viện được sử dụng trong ví dụ này là từ Apache Commons: http://commons.apache.org/. HTMLEmail là một lớp trong thành phần email commons của các thư viện này: http://commons.apache.org/proper/commons-email/ –

0

Thay vì để mỗi khách hàng tự tạo lớp thông báo, hãy để họ lấy đối tượng tin nhắn từ lớp tiện ích của bạn. Sau đó, lớp tiện ích có thể xây dựng đối tượng tin nhắn với thông tin phiên bạn muốn.

+0

Có một đối tượng tiện ích tin nhắn nào đã được xây dựng trong một số thư viện hay không, hoặc đây có phải là thứ tôi muốn phải tạo ra? –

+0

Tôi nghĩ bạn cần tạo ra nó. Ngay cả mùa xuân cũng sử dụng đối tượng phiên trong JavaMailSenderImpl. http://static.springsource.org/spring/docs/2.0.8/api/org/springframework/mail/javamail/JavaMailSenderImpl.html – mmirwaldt

+0

Câu trả lời này thiếu một ví dụ về mã hoặc ít nhất nó nên được chỉ ra rõ ràng về tiện ích nào lớp bạn đang nói về (-1) –

5

Lớp MimeMessage sẽ chấp nhận một phiên không. Nếu bạn tạo một thông báo như vậy, Transport.send có thể không gửi được MimeMessage Để giải quyết sự cố mà bạn chỉ phải quản lý phiên của riêng bạn và các đối tượng truyền tải, sau đó sử dụng phương thức không tĩnh Transport.sendMessage.

public void forward(Session session, Message m) throws MessagingException { 
    Address[] all = m.getAllRecipients(); 
    if (all == null) { //Don't pass null to sendMessage. 
     all = new InternetAddress[0]; 
    } 

    Transport t; 
    try { 
     if (all.length != 0) { 
      t = session.getTransport(all[0]); 
     } else { 
      t = session.getTransport("smtp"); 
     } 
    } catch (NoSuchProviderException tryDefault) { 
     try { 
      t = session.getTransport(); 
     } catch (NoSuchProviderException fail) { 
      if (fail.setNextException(tryDefault)) { 
       throw fail; 
      } else { 
       tryDefault.setNextException(fail); 
       throw tryDefault; 
      } 
     } 
    } 


    m.saveChanges(); 

    t.connect("host", 25, "user", "pass"); 
    try { 
     t.sendMessage(m, all); 
    } finally { 
     try { 
      t.close(); 
     } catch (MessagingException warning) { 
     } 
    } 
} 
+0

Bạn có thể đưa ra hoặc trỏ đến bất kỳ mã mẫu nào không? –

+1

Đã thêm mã mẫu. – jmehrens

1

Nếu bạn đang sử dụng khởi động Spring framework/mùa xuân, bạn có thể tiêm một JavaMailSenderImpl mùa xuân vào lớp học của bạn, và làm (rõ ràng bạn sẽ cần các thuộc tính máy chủ SMTP tiêm vào người gửi email quá):

MimeMessage mimeMessage = javaMailSender.createMimeMessage(); 

bạn cần phải thêm phụ thuộc sau đây để ứng dụng của bạn để làm việc này:

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-mail</artifactId> 
    </dependency> 
Các vấn đề liên quan