Подключение библиотеки java.mail
Пакет java.mail не является стандартным пакетом java. Поэтому, чтобы начать с ним работать, прежде всего необходимо подключить его к проекту. Делается это по разному в зависимости от типа проекта. К примеру, для проекта на maven нужно добавить следующую зависимость
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4</version> </dependency>
Создание сессии
Прежде чем приступить к отправке сообщений необходимо создать объект класса javax.mail.Session. Создать сессию можно статическими методами Session.getInstance и Session.getDefaultInstance. Эти методы принимают в качестве параметра настройки SMTP клиента в виде объекта класса java.util.Properties.
При первом вызове метода Session.getDefaultInstance будет создан синглтон-экземпляр сессии с Properties, которые были переданы в качестве параметра. При дальнейших вызовах этого метода параметр Properties не будет оказывать никакого влияния на возвращаемый экземпляр сессии, а возвращаться будет всегда экземпляр, созданный при первом вызове. Если в вашем приложении предполагается оперировать с одним SMTP сервером с одинаковыми настройками для отправки всех сообщений - то можно использовать метод Session.getDefaultInstance, если будут производиться операции с несколькими SMTP серверами с разными настройками Properties - то следует использовать Session.getInstance.
Значения Properties обычно выставляются в зависимости от используемого SMTP сервера и типа соединения (SSL, TLS).
Например, для SMTP сервера Amazon можно использовать следующие параметры:
Properties emailProperties = new Properties(); emailProperties.put("mail.transport.protocol", "smtp"); emailProperties.put("mail.smtp.auth", "true"); emailProperties.put("mail.smtp.starttls.enable", "true"); emailProperties.put("mail.smtp.starttls.required", "true");
Также, используя Properties, можно включить режим отладки почтового клиента.
emailProperties.put("mail.debug", "true");
В этом случае, при отправке email, в System.out будет дополнительно записываться отладочная информация.
Создание и инициализация сообщения
В java для представления email сообщения используется класс MimeMessage. При создании его можно связать с сессией (javax.mail.Session), передав её экземпляр в качестве параметра.
MimeMessage message = new MimeMessage(mailSession);
Основные методы этого класса следующие:
- setSubject - задает тему сообщения
- setContent - задает контент сообщения. Имеется 2 перегруженных метода: setContent(Object o, String type) и setContent(Multipart mp). В общем случае, метод setContent(Object o, String type) позволяет передавать контент, помещенный в объект DataHandler.
Проще всего задать контент сообщения передав его в виде HTML строки, например:
String messageBody = "This is the body of message"; message.setContent(messageBody, "text/html;charset=\"UTF-8\"");
Однако, следует иметь ввиду, что чаще всего спам-фильтры снижают Spam Score сообщениям, у которых отсутствует альтернативная текстовая (text/plain) часть сообщения. Поэтому сообщения с контентом, представленным выше, будут иметь невысокий Spam Score, и, соответственно, с высокой вероятностью попадать в папку Спам получателя. Для увеличения Spam Score требуется, чтобы письма с контентом типа HTML содержали также текстовый вариант контента.
Письмо с несколькими альтернативными контентами можно создать, используя класс MimeMultipart, передав в его конструктор строку "alternative".
Multipart messageBody = new MimeMultipart("alternative"); MimeBodyPart textPart = new MimeBodyPart(); textPart.setContent(messageTextBody, "text/plain"); messageBody.addBodyPart(textPart); MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(messageHtmlBody, "text/html;charset=\"UTF-8\""); messageBody.addBodyPart(htmlPart); message.setContent(messageBody);
При создании таких сообщений важно, чтобы тестовая часть сообщения была осмысленной, т.к. предполагается, что она будет показана пользователю в случае, если по каким либо причинам отобразить HTML часть сообщения окажется невозможно.
Отправка сообщения происходит с использованием класса Transport. Чтобы создать объект класса Transport, использующий значения Properties заданные в Session, используется метод mailSession.getTransport. Подключение к серверу происходит c использованием метода Transport.connect. Отправка сообщения производится после подключения методом Transport.sendMessage. После окончания работы с объектом класса Transport важно всегда освобожать ресурсы используя метод Transport.close.
Ниже приведен пример класса, который осуществляет отправку email сообщения на указанный адрес, с указанными текстовым и html вариантами тела сообщения.
import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.util.Properties; /** * Простой класс для отправки email сообщений * @author Cloud */ public class EmailMessageSender { private String mailServerHostName; private int mailServerPort; private String mailServerUsername; private String mailServerPassword; private String senderName; private String senderEmail; public EmailMessageSender(String mailServerHostName, int mailServerPort, String mailServerUsername, String mailServerPassword, String senderName, String senderEmail) { this.mailServerHostName = mailServerHostName; this.mailServerPort = mailServerPort; this.mailServerUsername = mailServerUsername; this.mailServerPassword = mailServerPassword; this.senderName = senderName; this.senderEmail = senderEmail; } private Properties emailProperties = new Properties(); { //emailProperties нужно выставить в соответствии с требованиями используемого SMTP сервера emailProperties.put("mail.transport.protocol", "smtp"); emailProperties.put("mail.smtp.auth", "true"); emailProperties.put("mail.smtp.starttls.enable", "true"); emailProperties.put("mail.smtp.starttls.required", "true"); } public void sendEmail(String recipientEmail, String subject, String messageTextBody, String messageHtmlBody) throws MessagingException, UnsupportedEncodingException { Session mailSession = Session.getInstance(emailProperties); Transport transport = null; try { //region Создание multipart контента Multipart content = new MimeMultipart("alternative"); MimeBodyPart textPart = new MimeBodyPart(); textPart.setContent(messageTextBody, "text/plain"); content.addBodyPart(textPart); MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(messageHtmlBody, "text/html;charset=\"UTF-8\""); //endregion //region Инициализация MimeMessage MimeMessage message = new MimeMessage(mailSession); message.setSubject(subject, StandardCharsets.UTF_8.name()); content.addBodyPart(htmlPart); message.setContent(content); message.setFrom(new InternetAddress(senderName, senderEmail)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipientEmail)); //endregion transport = mailSession.getTransport(); transport.connect(mailServerHostName, mailServerPort, mailServerUsername, mailServerPassword); transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO)); } finally { if (transport != null) { try { transport.close(); } catch (MessagingException e) { System.out.println("Ошибка при закрытии transport " + e.toString()); } } } } public static void main(String[] args) { EmailMessageSender emailMessageSender = new EmailMessageSender("mailServerHostName", 587, "mailServerUsername", "mailServerPassword", "senderName@gmail.com", "Sender Name"); try { emailMessageSender.sendEmail("recipientEmail@gmail.com", "test subject", "test body", "html body"); } catch (MessagingException | UnsupportedEncodingException e) { e.printStackTrace(); } } }
Комментариев нет:
Отправить комментарий