2010-01-11 19 views
10

Tôi đọc trên một số trang web, khi sử dụng API JavaMail, để đặt thuộc tính mail.smtp.ssl.enable thành true. Tôi có một số mã như sau:JavaMail mail.smtp.ssl.enable không hoạt động

props.put("mail.smtp.host", "exchangemail1.example.com"); 
props.put("mail.from", "[email protected]"); 
props.put("mail.smtp.starttls.enable", "true"); 
// I tried this by itself and also together with ssl.enable) 
props.put("mail.smtp.ssl.enable", "true"); 

Session session = Session.getInstance(props, null); 
MimeMessage msg = new MimeMessage(session); 
msg.setFrom(); 
msg.setRecipients(Message.RecipientType.TO, "[email protected]"); 
    // also tried @gmail.com 
msg.setSubject("JavaMail ssl test"); 
msg.setSentDate(new Date()); 
msg.setText("Hello, world!\n"); 
props.put("mail.smtp.auth", "false"); 

Transport trnsport; 
trnsport = session.getTransport("smtp"); 
trnsport.connect(); 
msg.saveChanges(); 
trnsport.sendMessage(msg, msg.getAllRecipients()); 
trnsport.close(); 

này gửi thư điện tử, nhưng:

  1. khi tôi làm chụp giao thông, tôi thấy nó không được mã hóa
  2. Khi sử dụng debug (props.put("mail.debug", "true")), tôi thấy rằng "isSSL false"

(tôi cũng đã cố gắng trên thêm trong props.put("mail.smtp.auth","true") + người dùng/mật khẩu ....)

Bất kỳ ý tưởng nào tôi đang làm sai?

Trả lời

2

Tôi khuyên bạn nên sử dụng Apache commons-email. Nó có các bộ định cư cho các thuộc tính được sử dụng nhiều nhất (bao gồm cả SSL/TLS) và thân thiện hơn với việc sử dụng và đặt ontop của API JavaMail.

Cập nhật: Tôi đã nhìn vào mã commons-email, và nhìn thấy những dòng này:

properties.setProperty("mail.smtp.starttls.enable", this.tls); 
properties.setProperty("mail.smtp.auth", "true"); 

như vậy, cung cấp cho các đặc tính này một thử là tốt.

11

Để sử dụng SSL, bạn nên thay đổi giao thức của bạn từ SMTP để SMTPS bằng cách thay đổi

trnsport = session.getTransport("smtp"); 

để

trnsport = session.getTransport("smtps"); 
+0

Tôi vừa triển khai gửi qua SSL và khi tôi gọi session.getTransport ("smtps"); nó hoạt động ok. Vì vậy, câu trả lời này là hợp lệ. –

+0

Điều này không được chấp nhận, với thông báo: 'Phương thức gửi tĩnh (Message) từ loại Transport nên được truy cập theo cách tĩnh' Có cách nào hiện đại hơn để chỉ định' smtps' không? –

5

Mẫu các Java Doc:

Lưu ý rằng nếu bạn đang sử dụng giao thức "smtps" để truy cập SMTP qua SSL, tất cả các thuộc tính sẽ là tên d "mail.smtps. *".

3

Hãy thử

props.put("mail.smtp.auth", "true"); 
props.setProperty("mail.smtp.**ssl.enable", "true"); 
props.setProperty("mail.smtp.**ssl.required", "true"); 
2

Đây là từ tài liệu SSLNOTES từ JavaMail (nhấn mạnh thêm):

Đầu tiên, và có lẽ là đơn giản nhất, là để thiết lập một tài sản để cho phép sử dụng của SSL. Ví dụ: để bật sử dụng SSL cho kết nối SMTP, hãy đặt thuộc tính "mail.smtp.ssl.enable" thành "true".

Hoặc, bạn có thể định cấu hình JavaMail để sử dụng một trong số các tên giao thức SSL được bật SSL được bật SSL. Ngoài các giao thức JavaMail không phải SSL "imap", "pop3" và "smtp", các giao thức "imaps", "pop3s" và "smtps" có thể được sử dụng để kết nối với các dịch vụ tương ứng bằng kết nối SSL .

- STARTTLS hỗ trợ

Sự hỗ trợ STARTTLS có sẵn trong các tiêu chuẩn "imap" và "smtp" giao thức, nhưng phải được kích hoạt bằng cách thiết lập chiếm đoạt tài sản, mail.imap.starttls.enable hoặc mail.smtp.starttls.enable, thành "true". Khi được đặt, nếu máy chủ hỗ trợ lệnh STARTTLS, nó sẽ được sử dụng sau khi thực hiện kết nối và trước khi gửi bất kỳ thông tin đăng nhập nào.

Vì vậy, khi sử dụng STARTTLS, có vẻ như không cần phải đặt giao thức thành smtps.

+0

Theo [JavaMail README] (https://javaee.github.io/javamail/docs/README.txt) bằng cách sử dụng cơ chế STARTTLS cũng yêu cầu sử dụng giao thức 'smtp'. Đây là một chút phản trực giác. Giao thức 'smtps' dành cho kết nối SSL trực tiếp không yêu cầu STARTTLS. – MikeOnline