Предположим, что у нас есть учётная запись mail.ru с логином uhb0f84h@mail.ru и паролем dhg9j49h0gnj904h и учётная запись gmail.com с логином ciwh39ht9dxjs94h@gmail.com и паролем as8o40tn4. В этой статье я подробно распишу настройку org.springframework.mail.javamail.JavaMailSenderImpl для отправки почты через эти сервисы.
JavaMailSenderImpl реализует интерфейс org.springframework.mail.javamail.JavaMailSender и служит для отправки почты по протоколу SMTP (это такой протокол для отправки сообщений электронной почты, использующийся почтовыми клиентами).
Для начала нужно создать структуру для Maven. В качестве groupId будет использоваться ru.urvanov.javaexamples , а в качестве artifactId — spring-java-mail-sender-impl.
Теперь нужно подключить Spring Framework и тот его артефакт, в котором содержится JavaMailSenderImpl. Это весьма странно, но пакет org.springframework.mail содержится в артефакте spring-context-support. По названию тут, конечно, никак не догадаешься:
1 2 3 4 5 6 |
<!-- Это весьма странно, но JavaMailSenderImpl находится в spring-context-support --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${org.springframework-version}</version> </dependency> |
В раздел properties, разумеется, нужно добавить переменную с версией Spring Framework:
1 2 3 4 5 |
<properties> ... <org.springframework-version>4.2.2.RELEASE</org.springframework-version> ... </properties> |
Также для отправки почты нужно подключить библиотеку JavaMail:
1 2 3 4 5 |
<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.5.4</version> </dependency> |
Полный pom.xml получился таким:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ru.urvanov.javaexamples</groupId> <artifactId>spring-java-mail-sender-impl</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>java-mail-sender-impl</name> <url>http://maven.apache.org</url> <properties> <java-version>1.8</java-version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <org.springframework-version>4.2.2.RELEASE</org.springframework-version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- Это весьма странно, но JavaMailSenderImpl находится в spring-context-support --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.5.4</version> </dependency> </dependencies> <build> <plugins> <!-- Компиляция --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <configuration> <source>${java-version}</source> <target>${java-version}</target> <encoding>${project.build.sourceEncoding}</encoding> <compilerArgument>-Xlint:all</compilerArgument> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> </configuration> </plugin> <!-- Сборка JAR-файла --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>ru.urvanov.javaexamples.springjavamailsenderimpl.App</mainClass> <addClasspath>true</addClasspath> <classpathPrefix>data/lib/</classpathPrefix> </manifest> </archive> </configuration> </plugin> <plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <phase>install</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/data/lib</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </project> |
Настройки для учётной записи mail.ru расположим в src/main/resources/mail.ru.properties:
1 2 3 4 5 6 7 |
mail.host=smtp.mail.ru mail.port=465 mail.username=uhb0f84h@mail.ru mail.password=dhg9j49h0gnj904h mail.from=uhb0f84h@mail.ru mail.protocol=smtps mail.smtps.auth=true |
Для учётной записи gmail.com в src/main/resources/gmail.com.properties:
1 2 3 4 5 6 7 |
mail.host=smtp.gmail.com mail.port=465 mail.username=ciwh39ht9dxjs94h@gmail.com mail.password=as8o40tn4 mail.from=uciwh39ht9dxjs94h@gmail.com mail.protocol=smtps mail.smtps.auth=true |
Все эти настройки легко находятся в справочных системах этих сервисов. Можно настроить отправку почты через любой другой сервис, поддерживающий SMTP.
В контексте приложения нужно создать два бина: JavaMailSender и шаблон письма. Бин JavaMailSender необходимо инициализировать настройками своей учётной записи из соответствующего файла, а в шаблоне письма достаточно заполнить поле From. Полный applicationContext.xml выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- Настройки почтового сервера храним в файлах src/main/resources/mail.ru.properties и src/main/resources/gmail.com.properties --> <!-- Убедитесь, что вы заменили mail.username, mail.password и mail.from в src/main/resources/mail.properties на настройки своей учётной записи почты.--> <!-- Настройки mail.ru --> <!-- <context:property-placeholder location="classpath:mail.ru.properties" ignore-unresolvable="true" />--> <!-- Настройки gmail.com --> <context:property-placeholder location="classpath:gmail.com.properties" ignore-unresolvable="true" /> <!-- Класс для отправки писем. --> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="javaMailProperties"> <props> <prop key="mail.smtps.auth">${mail.smtps.auth}</prop> </props> </property> <property name="host" value="${mail.host}" /> <property name="port" value="${mail.port}" /> <property name="username" value="${mail.username}" /> <property name="password" value="${mail.password}" /> <property name="protocol" value="${mail.protocol}" /> </bean> <!-- Шаблон письма --> <bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage"> <property name="from" value="${mail.from}" /> <property name="subject" value="Mail subject" /> </bean> </beans> |
Этот файл должен лежать по пути src/main/resources/applicationContext.xml. Обратите внимание, что в приведённом примере context:property-placeholder , загружающий настройки для mail.ru закомментирован, и настройки загружаются из gmail.com.properties. Чтобы отправлять письма через mail.ru вам нужно раскомментировать соответствующую строку и закомментировать строку для gmail.com
Осталось написать сам код, который будет инициализировать контейнер бинов Spring Framework, вытаскивать mailSender, templateMessage и отправлять сообщение на какой-нибудь e-mail.
Файл src/main/java/ru/urvanov/javaexamples/springjavamailsenderimpl.App.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
package ru.urvanov.javaexamples.springjavamailsenderimpl; import org.springframework.context.support.GenericXmlApplicationContext; import org.springframework.mail.MailException; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; /** * Пример отправки писем с помощью JavaMailSenderImpl через почтовые * сервис mail.ru и gmail.com. Убедитесь, что вы заменили mail.username, mail.password * и mail.from в файле конфигурации (src/main/resources/mail.ru.properties или * в src/main/resources/gmail.com.properties, смотря что включено * в applicationContext.xml) * на настройки своей учётной записи почты. * * @author Urvanov Fedor * <p><a href="https://urvanov.ru">https://urvanov.ru</a> * </p> * */ public class App { public static void main( String[] args ) { try (GenericXmlApplicationContext context = new GenericXmlApplicationContext()) { context.load("classpath:applicationContext.xml"); context.refresh(); JavaMailSender mailSender = context.getBean("mailSender", JavaMailSender.class); SimpleMailMessage templateMessage = context.getBean("templateMessage", SimpleMailMessage.class); // Создаём потокобезопасную копию шаблона. SimpleMailMessage mailMessage = new SimpleMailMessage(templateMessage); //TODO: Сюда напишите свой e-mail получателя. mailMessage.setTo("ouhb93u4hng9hndf9@mail.ru"); mailMessage.setText("Привет, товарищи. Присылаю вам письмо..."); try { mailSender.send(mailMessage); System.out.println("Mail sended"); } catch (MailException mailException) { System.out.println("Mail send failed."); mailException.printStackTrace(); } } } } |
Готово. Теперь можно запустить App.java на компиляцию и исполнение в IDE и письмо отправится. Можно также в включить опцию mail.debug в true в свойстве javaMailProperties у объекта JavaMailSenderImpl, и тогда в консоль будет попадать отладочный вывод, что позволит узнать, что произошло на самом деле, если при отправке почты возникает исключение.
Исходники примера на GitHub (поставьте звезду, пожалуйста)
Скачать исходники проекта в виде ZIP-архива (spring-java-mail-sender-impl)