Как отправить Email в Java?

Давайте разберемся, как отправить email в Java используя почтовый сервер Google Gmail.

Как я уже говорил отправлять мы будем через почтовый сервер Gmail.

Для этого нам нужны данные Outgoing Mail (SMTP) Server:

Host: smtp.gmail.com
Use Authentication: Yes
Port for TLS/STARTTLS: 587
Port for SSL: 465

И уже с их помощью мы можем обращаться к серверу Gmail.

Тут можно ознакомится с кратким описанием https://support.google.com/mail/answer/13287?hl=en

Немного теории Wiki

TLS (Transport Layer Security) — криптографические протоколы, обеспечивающие защищённую передачу данных между узлами в сети Интернет, TLS и SSL используют асимметричную криптографию для обмена ключами, симметричное шифрование для конфиденциальности и коды аутентичности сообщений для сохранения целостности сообщений.

SSL (Secure Sockets Layer — уровень защищённых сокетов) — криптографический протокол, который обеспечивает безопасность связи. Он использует асимметричную криптографию для аутентификации ключей обмена, симметричное шифрование для сохранения конфиденциальности, коды аутентификации сообщений для целостности сообщений. Протокол широко используются для обмена мгновенными сообщениями и передачи голоса через IP, в таких приложениях, как электронная почта, Интернет-факс и др.

Мы попробуем отправить сообщение оба способами.

Шаг 1

Создаем maven проект и называем его SendMail.

И добавляем в него зависимость библиотеки JavaMail API:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4</version>
</dependency>

Шаг 2

После создаем в нем пакет com.devcolibri.tls и тут создадим класс Sender.java:

package com.devcolibri.tls;

import java.util.Properties;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class Sender {

    private String username;
    private String password;
    private Properties props;

    public Sender(String username, String password) {
        this.username = username;
        this.password = password;

        props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");
    }

    public void send(String subject, String text, String fromEmail, String toEmail){
        Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            Message message = new MimeMessage(session);
            //от кого
            message.setFrom(new InternetAddress(username));
            //кому
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail));
            //Заголовок письма
            message.setSubject(subject);
            //Содержимое
            message.setText(text);

            //Отправляем сообщение
            Transport.send(message);
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}

В строке 21 мы активируем протокол TLS.

Шаг 3

Теперь попробуем написать отправку по протоколу SSL.

Создаем пакет com.devcolibri.ssl и тут создадим класс Sender.java:

package com.devcolibri.ssl;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class Sender {

    private String username;
    private String password;
    private Properties props;

    public Sender(String username, String password) {
        this.username = username;
        this.password = password;

        props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");
    }

    public void send(String subject, String text, String fromEmail, String toEmail){
        Session session = Session.getDefaultInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            Message message = new MimeMessage(session);
            //от кого
            message.setFrom(new InternetAddress(username));
            //кому
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail));
            //тема сообщения
            message.setSubject(subject);
            //текст
            message.setText(text);

            //отправляем сообщение
            Transport.send(message);
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}

В строке 21 мы указываем, что будем использовать для отправки протокол SSL.

Шаг 4

Тестируем отправку сообщение оба протоколами:

package com.devcolibri;

public class Main {
    private static com.devcolibri.tls.Sender tlsSender = new com.devcolibri.tls.Sender("<ваш email на gmail>", "<ваш пароль>");
    private static com.devcolibri.ssl.Sender sslSender = new com.devcolibri.ssl.Sender("<ваш email на gmail>", "<ваш пароль>");

    public static void main(String[] args){
        tlsSender.send("This is Subject", "TLS: This is text!", "support@devcolibri.com", "alex@devcolibri.com");
        sslSender.send("This is Subject", "SSL: This is text!", "support@devcolibri.com", "alex@devcolibri.com");
    }
}

В результате вы увидите на посте следующее:

И содержимое этих писем:

Урок создан: 06 июня 2013 | Просмотров: 24392 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

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

  • 25 октября 2013 в 20:35

    pit

    спасибо за инф, но как прицепить к этому делу файл (допустим пдф жпег)???

  • 11 ноября 2013 в 18:34

    Akim

    В message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail)); intellij ругается на второй аргумент и просит создать экземпляр.
    Еще в аргументах передаем fromEmail, но никак его не используем — непорядок! :)

    • 18 мая 2014 в 13:08

      Artem

      Ну так не пиши его в объявлении метода, все равно будет работать.
      А по поводу, что ругается на второй параметр, что конкретно говорит. я вообще пишу под линуксом, так пакета на нетбинк javax.mail вообще нет, скачал с официального сайта его, заработало все с первого раза, ну по тестам хочу сказать, отправку мессаги, пускайте в потоке, ибо может ненадолго подвесить ваше приложение, особенно, если у вас медленное инет соединение!

  • 18 мая 2014 в 13:05

    Artem

    Ох пасибки!!!! Вы сохранили много мегабайт моих нервов! Респект и Уважуха!

  • 08 октября 2014 в 20:00

    Дмитрий

    А можно как-то подпись к письму приделать? А то в спам попадают)))

  • 25 декабря 2015 в 11:30

    Serge D.

    В tls надо сейчас еще добавить
    props.put(«mail.smtp.ssl.trust», «smtp.gmail.com»)
    Без него сыпался эррор.

  • 13 марта 2016 в 16:07

    Garo

    а как отправить емайл без аутентификации?

  • 08 июня 2016 в 14:56

    Николай

    В файлах tls.Sender и ssl.Sender есть опечатка в строке 36

    //от кого
    message.setFrom(new InternetAddress(username));

    Необходимо использовать
    message.setFrom(new InternetAddress(fromEmail));

    Иначе, если в имени присутствует домен, например td\ivanov то будет exception.

  • 18 июля 2016 в 21:31

    Dmitry

    Вроде все сделал как показано.. но получаю ошибку
    javax.mail.AuthenticationFailedException

    username и password точно веры, проверял

    • 18 июля 2016 в 21:47

      Dmitry

      Вопрос снят, оказалось это настройки безопасности Google были всему виной.

      • 24 августа 2016 в 22:32

        Dan

        Дима, так как ты гугл поборол? у меня таже проблема:)

  • 28 августа 2016 в 13:00

    Сергей

    Рожаю ёжиков, пока роды проходят очень трудно, выбивает javax.mail.MessagingException: Exception reading response — подскажите в чем проблема может быть?