суббота, 15 октября 2016 г.

Почтовое сообщение по протоколу SMTP из Java с использованием SSL

Собственно нужно было послать. Из программы. С почтового ящика на Yandex. А Яндекс перешёл на SSL

Что характерно копи-паст из интернета ничего не дал. Все время вылазили исклчючения. Или письма вроде как уходили, но в ящик не приходили.
Полез сюда в раздел Programming на oracle.com. Нашёл вот такое:

Q: What are some of the most common mistakes people make when using JavaMail? A: Unfortunately, the internet is full of copy and paste programmers who don't understand the code they're using, which has resulted in a lot of unnecessarily complex and often incorrect examples. The most common mistakes are:
  • Use of Session.getDefaultInstance. Almost all code should use Session.getInstanceinstead, as described below
  • Calling the send method on a Transport instance variable. As described belowsend is a static method and ignores the Transport instance you use to call it.
  • Setting various socketFactory properties. Long, long ago JavaMail didn't have built in support for SSL connections, so it was necessary to set these properties to use SSL. This hasn't been the case for years; remove these properties and simplify your code. The easiest way to enable SSL support in current versions of JavaMail is to set the property "mail.smtp.ssl.enable" to "true". (Replace "smtp" with "imap" or "pop3" as appropriate.)
  • Using an Authenticator just to supply a username and password. There's really nothing wrong with using an Authenticator, it's just unnecessarily complex. A more straightforward approach is to call the connect method that takes a username and password when connecting to a Store. When sending a message, use the static Transport.send method that takes a username and password.
что характерно, прямо про меня.
Последовал рекомендациям и о чудо все получилось. Приведу функцию полностью как она работает у меня:
    public void sendMail(String paramTo, String paramSubject, String paramBody)
    {
        try
        {
            Properties props = new Properties();
            props.put("mail.smtp.host", "smtp.yandex.ru");
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.port", "465");
            props.put("mail.smtp.ssl.enable","true");
            Session session = Session.getInstance(props);
           
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("my_mailbox@yandex.ru"));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(paramTo.trim()));
            message.setContent("This is a test", "text/plain");
            message.setSubject(paramSubject);
            message.setText(paramBody);
            Transport.send(message,"user_name", "user_password");
            System.out.println("Sent message successfully....");
        } catch (Exception mex)
        {
            System.out.println("******* ERROR sending Email *******");
            mex.printStackTrace();
        }
    }
Тащемта всё.



Лучший поставщик комплектующих

Комментариев нет:

Отправить комментарий