Подключение библиотеки 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();
}
}
}
Комментариев нет:
Отправить комментарий