Вопрос

Я нашел несколько других вопросов по SO, касающихся API JavaMail и отправки почты через SMTP-сервер, но ни один из них не обсуждался с использованием безопасности TLS. Я пытаюсь использовать JavaMail для отправки обновлений статуса себе через мой рабочий почтовый SMTP-сервер, но для этого требуется TLS, и я не могу найти в Интернете примеров того, как использовать JavaMail для доступа к SMTP-серверу, который требует шифрования TLS. Кто-нибудь может помочь с этим?

Это было полезно?

Решение

На самом деле в нашем продукте есть некоторый код уведомления, который использует TLS для отправки почты, если он доступен.

Вам нужно будет установить свойства Java Mail. Вам нужен только TLS, но вам может понадобиться SSL, если ваш SMTP-сервер использует 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");

Затем вы можете передать его в сеанс JavaMail или в любой другой экземпляр сеанса, например, Session.getDefaultInstance (props) .

Другие советы

Хороший пост, строка

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

является обязательным, если SMTP-сервер использует SSL-аутентификацию , как SMTP-сервер GMail. Однако если сервер использует Аутентификацию в виде открытого текста по TLS , он не должен присутствовать, поскольку Java Mail будет жаловаться на то, что исходное соединение является открытым текстом.

Также убедитесь, что вы используете последнюю версию Java Mail. Недавно я использовал несколько старых jav-файлов Java Mail из предыдущего проекта и не мог заставить код работать, потому что процесс входа не удался. После того, как я обновился до последней версии Java Mail, причина ошибки стала ясна: это было исключение javax.net.ssl.SSLHandshakeException, которое не было выброшено в старой версии библиотеки.

Настройки из приведенного выше примера не работают для сервера, который я использовал ( authsmtp.com ) , Я продолжал получать эту ошибку:

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

Я удалил настройки mail.smtp.socketFactory и все заработало. Окончательные настройки были такими (SMTP-аутентификация не использовалась, и я установил порт в другом месте):

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

Просто используйте следующий код. Это действительно полезно для отправки электронной почты через Java, и это работает:

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="your@gmail.com";
            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("your@gmail.com"));
                 message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("receiver@gmail.com"));
        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();
        }

    }

}

С Simple Java Mail 5.0.0 (simplejavamail.org) это очень просто, и библиотека позаботится о все свойства сеанса для вас.

Вот пример использования SMTP-серверов Google:

Email email = EmailBuilder.startingBlank()
        .from("lollypop", "lol.pop@somemail.com")
        .to("C.Cane", "candycane@candyshop.org")
        .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);

Если у вас включен двухфакторный вход в систему, необходимо создать пароль для конкретного приложения из вашей учетной записи Google.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top