2009-01-04 34 views
38

Tôi đã tìm thấy một số câu hỏi khác về SO liên quan đến API JavaMail và gửi thư qua máy chủ SMTP, nhưng không ai trong số chúng được thảo luận bằng cách sử dụng bảo mật TLS. Tôi đang cố gắng sử dụng JavaMail để gửi các cập nhật trạng thái cho bản thân thông qua máy chủ thư SMTP công việc của tôi, nhưng nó yêu cầu TLS và tôi không thể tìm thấy bất kỳ ví dụ nào trực tuyến về cách sử dụng JavaMail để truy cập máy chủ SMTP yêu cầu mã hóa TLS. Bất cứ ai có thể giúp đỡ với điều này?Sử dụng JavaMail với TLS

Trả lời

54

Chúng tôi thực sự có một số mã thông báo trong sản phẩm của chúng tôi sử dụng TLS để gửi thư nếu có.

Bạn sẽ cần đặt thuộc tính Thư Java. Bạn chỉ cần một TLS nhưng bạn có thể cần SSL nếu máy chủ SMTP của bạn sử dụng SSL.

Properties props = new Properties(); 
props.put("mail.smtp.starttls.enable","true"); 
props.put("mail.smtp.auth", "true"); // If you need to authenticate 
// Use the following if you need SSL 
props.put("mail.smtp.socketFactory.port", d_port); 
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
props.put("mail.smtp.socketFactory.fallback", "false"); 

Sau đó, bạn có thể chuyển điều này sang Phiên JavaMail hoặc bất kỳ trình thoại tức thời phiên nào khác như Session.getDefaultInstance(props).

+2

Cảm ơn rất nhiều! Nghĩa đen, tất cả những gì tôi làm là thêm props.put ("mail.smtp.starttls.enable", "true"); vào mã của tôi và nó hoạt động hoàn hảo! – dancavallaro

+1

Lưu ý rằng không cần thiết lập nhà máy ổ cắm với java.mail hiện đại: http://stackoverflow.com/questions/17581066/using-javamail-with-a-self-signed-certificate/17584714#17584714 – Vadzim

22

bài tốt, dòng

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 

là bắt buộc nếu máy chủ SMTP sử dụng SSL xác thực, giống như máy chủ Gmail SMTP không. Tuy nhiên, nếu máy chủ sử dụng Xác thực văn bản thuần túy trên TLS, không nên có mặt, vì Java Mail sẽ khiếu nại về kết nối ban đầu là bản rõ.

Cũng đảm bảo bạn đang sử dụng phiên bản Java Mail mới nhất. Gần đây tôi đã sử dụng một số lọ thư Java cũ từ một dự án trước và không thể làm cho mã hoạt động, bởi vì quá trình đăng nhập không thành công. Sau khi tôi đã nâng cấp lên phiên bản mới nhất của Java Mail, lý do của lỗi trở nên rõ ràng: đó là một javax.net.ssl.SSLHandshakeException, mà không được ném lên trong phiên bản cũ của lib.

8

Cài đặt từ ví dụ trên không hoạt động đối với máy chủ tôi đang sử dụng (authsmtp.com). Tôi tiếp tục gặp lỗi này:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? 

Tôi đã xóa thư.smtp.socketCài đặt gốc và mọi thứ đã hoạt động. Cài đặt cuối cùng là điều này (SMTP auth không được sử dụng và tôi đặt cổng ở nơi khác):

java.util.Properties props = new java.util.Properties(); 
props.put("mail.smtp.starttls.enable", "true"); 
6

Chỉ cần sử dụng mã sau đây. Nó thực sự hữu ích để gửi email qua Java, và nó hoạt động:

import java.util.*; 
import javax.activation.CommandMap; 
import javax.activation.MailcapCommandMap; 
import javax.mail.*; 
import javax.mail.Provider; 
import javax.mail.internet.*; 

public class Main { 

    public static void main(String[] args) { 
      final String username="[email protected]"; 
      final String password="password"; 
      Properties prop=new Properties(); 
      prop.put("mail.smtp.auth", "true"); 
      prop.put("mail.smtp.host", "smtp.gmail.com"); 
      prop.put("mail.smtp.port", "587"); 
      prop.put("mail.smtp.starttls.enable", "true"); 

      Session session = Session.getDefaultInstance(prop, 
      new javax.mail.Authenticator() { 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(username, password); 
      } 
     }); 
      try { 
       String body="Dear Renish Khunt Welcome"; 
       String htmlBody = "<strong>This is an HTML Message</strong>"; 
       String textBody = "This is a Text Message."; 
     Message message = new MimeMessage(session); 
     message.setFrom(new InternetAddress("[email protected]")); 
       message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("[email protected]")); 
     message.setSubject("Testing Subject"); 
     MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
     mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
     mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
     mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
     mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
     mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
     CommandMap.setDefaultCommandMap(mc); 
      message.setText(htmlBody); 
         message.setContent(textBody, "text/html"); 
      Transport.send(message); 

      System.out.println("Done"); 

     } catch (MessagingException e) { 
      e.printStackTrace(); 
     } 

    } 

} 
2

Với Simple Java Mail 5.0.0 (simplejavamail.org) nó rất đơn giản và thư viện sẽ chăm sóc của tất cả các thuộc tính phiên cho bạn.

Dưới đây là một ví dụ sử dụng máy chủ SMTP của Google:

Email email = EmailBuilder.startingBlank() 
     .from("lollypop", "[email protected]") 
     .to("C.Cane", "[email protected]") 
     .withSubject("hey") 
     .withPlainText("We should meet up!") 
     .withHTMLText("<b>We should meet up!</b>") 
     .buildEmail(); 

MailerBuilder.withSMTPServer("smtp.gmail.com", 25, "user", "pass", SMTP_TLS) 
     .buildMailer() 
     .sendMail(email); 

MailerBuilder.withSMTPServer("smtp.gmail.com", 587, "user", "pass", SMTP_TLS) 
     .buildMailer() 
     .sendMail(email); 

MailerBuilder.withSMTPServer("smtp.gmail.com", 465, "user", "pass", SMTP_SSL) 
     .buildMailer() 
     .sendMail(email); 

Nếu bạn có hai yếu tố đăng nhập bật, bạn cần phải tạo ra một application specific password từ tài khoản Google của bạn.

Các vấn đề liên quan