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
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)
.
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.
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");
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();
}
}
}
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.
- 1. Sử dụng Javamail và Greenmail cho SMTPS/SSL
- 2. javax.net.ssl.SSLException khi gửi thư bằng cách sử dụng JavaMail
- 3. Cách đăng ký Javamail với DKIM
- 4. Sử dụng tls-extra cho smtp đơn giản
- 5. Sử dụng Gmails Outgoing SMTP từ DELPHI (Indy) bằng TLS
- 6. JavaMail - javax.mail.MessagingException
- 7. Tôi làm cách nào để định cấu hình máy chủ thư để sử dụng với JavaMail?
- 8. Cách sử dụng Phiên Javamail mặc định trong Websphere với GMail
- 9. Lấy tất cả các email chưa đọc bằng cách sử dụng javamail với giao thức POP3
- 10. Gửi email trong android sử dụng JavaMail API với smtp nhưng không có SSL
- 11. TLS với ổ cắm máy chủ php
- 12. An toàn trong Javamail
- 13. Kết nối với SMTP (SSL hoặc TLS) bằng cách sử dụng Python
- 14. Gửi javamail bằng Office365
- 15. Jenkins SMTP TLS
- 16. Thư Java qua TLS
- 17. Lỗi JavaMail BaseEncode64
- 18. Kênh Java.nio và TLS
- 19. Lỗi SSL - Nhận ngoại lệ SSL/TLS khi sử dụng HttpWebRequest với chứng chỉ ứng dụng khách
- 20. Cách thay đổi cổng JavaMail
- 21. JavaMail mail.smtp.ssl.enable không hoạt động
- 22. JavaMail: Giữ IMAPFolder.idle() còn sống
- 23. Ổ cắm TLS-PSK Java
- 24. Kết nối TLS sử dụng SSLSocket chậm trong Hệ điều hành Android
- 25. Gửi email có tệp đính kèm bằng cách sử dụng javamail API
- 26. Làm thế nào để sử dụng SSL3 thay vì TLS trong một HttpWebRequest cụ thể?
- 27. Gửi email từ chương trình Ruby với TLS
- 28. Sử dụng Javamail để kết nối với máy chủ SMTP smtp bỏ qua cổng được chỉ định và cố gắng sử dụng 25
- 29. Làm thế nào để quản lý lưu trữ cục bộ luồng (TLS) khi sử dụng TPL?
- 30. Cách tìm phiên bản SSL/TLS nào được sử dụng trong Java
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
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