Статьи

Отправка электронной почты в Java с помощью Spring — пример SMTP-сервера GMail

Для отправки электронной почты в Java стандартным решением является JavaMail API . Как говорится на официальной веб-странице, «API JavaMail предоставляет независимую от платформы и протокол-независимую структуру для создания приложений почты и обмена сообщениями». Необходимые классы включены в платформу JavaEE, но для использования ее в автономном приложении JavaSE вам необходимо скачать соответствующий JAR отсюда .

Примечание. Если вы не используете Java SE 6, вам также понадобится расширение JavaBeans Activation Framework (JAF), предоставляющее пакет javax.activation. Мы предлагаем вам использовать последнюю версию JAF 1.1.1. JAF включен в Java SE 6.

JavaMail, к сожалению, может быть немного громоздким и сложным в настройке и использовании. Если вы применили среду Spring для своих приложений, вы будете рады узнать, что Spring предоставляет уровень абстракции почты. Как говорится в справочной документации : «Spring Framework предоставляет полезную служебную библиотеку для отправки электронной почты, которая защищает пользователя от особенностей базовой почтовой системы и отвечает за низкоуровневую обработку ресурсов от имени клиента». Отлично, теперь посмотрим, как использовать эту библиотеку.

Сначала создайте новый проект Eclipse с именем «SpringMailProject». В пути к классам проекта обязательно включите следующие библиотеки (обратите внимание, что использовалась версия 3.0.2.RELEASE Spring):

  • mail.jar (основные классы JavaMail)
  • org.springframework.asm-3.0.2.RELEASE.jar
  • org.springframework.beans-3.0.2.RELEASE.jar
  • org.springframework.context.support-3.0.2.RELEASE.jar
  • org.springframework.core-3.0.2.RELEASE.jar
  • org.springframework.expression-3.0.2.RELEASE.jar
  • com.springsource.org.apache.commons.logging-1.1.1.jar

Примечание 1: библиотека регистрации общих файлов от Apache необходима и была включена в classpath
Примечание 2: Вам также понадобится Java Activation Framework, если вы используете Java 1.5 или более раннюю версию

Мы будем использовать MailSender , интерфейс Spring, который определяет стратегию отправки простых писем. Поскольку это всего лишь интерфейс, нам нужна конкретная реализация, которая поставляется в форме JavaMailSenderImpl . Этот класс поддерживает как JavaMail MimeMessage, так и Spring SimpleMailMessage .

Мы создадим простой сервис Spring, который будет использоваться для отправки почты. Один метод создаст SimpleMailMessage на месте, а другой будет использовать предварительно сконфигурированное сообщение по умолчанию. Исходный код сервиса:

01
02
03
04
05
06
07
08
09
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
package com.javacodegeeks.spring.mail;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service;
 
@Service("mailService")
public class MailService {
     
    @Autowired
    private MailSender mailSender;
    @Autowired
    private SimpleMailMessage alertMailMessage;
     
    public void sendMail(String from, String to, String subject, String body) {
         
        SimpleMailMessage message = new SimpleMailMessage();
          
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(body);
        mailSender.send(message);
         
    }
     
    public void sendAlertMail(String alert) {
         
        SimpleMailMessage mailMessage = new SimpleMailMessage(alertMailMessage);
        mailMessage.setText(alert);
        mailSender.send(mailMessage);
         
    }
     
}

Класс — это просто POJO, а его имя сервиса — «mailService», помеченное аннотацией сервиса стереотипа. Используемая стратегия подключения бобов — это автоматическая проводка , поэтому используется аннотация Autowired . Обратите внимание, что автоматическое подключение может выполняться как по имени, так и по типу компонента.

Соответствующий XML-файл Spring, который загружает контейнер, выглядит следующим образом:

01
02
03
04
05
06
07
08
09
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
<?xml version="1.0" encoding="UTF-8"?>
 
    xsi:schemaLocation="
>
 
    <context:component-scan base-package="com.javacodegeeks.spring.mail" />   
     
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="smtp.gmail.com"/>
        <property name="port" value="25"/>
        <property name="username" value="[email protected]"/>
        <property name="password" value="mypassword"/>
        <property name="javaMailProperties">
            <props>
                <!-- Use SMTP transport protocol -->
                <prop key="mail.transport.protocol">smtp</prop>
                <!-- Use SMTP-AUTH to authenticate to SMTP server -->
                <prop key="mail.smtp.auth">true</prop>
                <!-- Use TLS to encrypt communication with SMTP server -->
                <prop key="mail.smtp.starttls.enable">true</prop>
                <prop key="mail.debug">true</prop>
            </props>
        </property>
    </bean>
     
    <bean id="alertMailMessage" class="org.springframework.mail.SimpleMailMessage">
        <property name="from">           
            <value>[email protected]</value>
        </property>
        <property name="to">           
            <value>[email protected]</value>
        </property>
        <property name="subject" value="Alert - Exception occurred. Please investigate"/>
    </bean>
     
</beans>

Это довольно простой конфигурационный файл Spring. Некоторые вещи, чтобы упомянуть, хотя:

  • Базовый пакет, с которого начинается сканирование контекста, объявляется и имеет значение «com.javacodegeeks.spring.mail».
  • Bean-компонент «mailSender» объявлен, и набор его свойств настроен соответствующим образом (используйте свои собственные атрибуты конфигурации SMTP-сервера и учетные данные).
  • «AlertMailMessage» — это предварительно сконфигурированный Spring SimpleMailMessage, который будет внедрен в класс «MailService» с помощью «по имени автоподключения».

Если вы хотите использовать SMTP-сервер Gmail, убедитесь, что следующие свойства JavaMail настроены соответствующим образом:

1
2
3
4
5
6
7
host=smtp.gmail.com
port=25
username=your-gmail-username
password=your-gmail-password
mail.transport.protocol=smtp
mail.smtp.auth=true
mail.smtp.starttls.enable=true

На этапе разработки установите для mail.debug значение true, если вы хотите, чтобы почтовый клиент генерировал информативные журналы. Тем не менее, не забывайте устанавливать это значение на «ложь» при работе, потому что количество журналов может ухудшить производительность приложения и / или заполнить ваши жесткие диски.

Наконец, мы создаем класс, который будет использоваться для создания контейнера Spring и тестирования простого почтового сервиса, который мы создали. Исходный код следующий:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
package com.javacodegeeks.spring.mail;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
 
public class MailServiceTest {
 
    public static void main(String[] args) {
         
        ApplicationContext context = new FileSystemXmlApplicationContext("conf/spring.xml");
 
        MailService mailService = (MailService) context.getBean("mailService");
         
        mailService.sendMail("[email protected]", "[email protected]", "Testing123", "Testing only \n\n Hello Spring Email Sender");
         
        mailService.sendAlertMail("Exception occurred");
         
    }
     
}

Класс FileSystemXmlApplicationContext используется в качестве ApplicationContext . Мы передаем расположение XML-файла Spring в конструкторе, и класс создает контейнер, создает экземпляры bean-компонентов и заботится о зависимостях. Разве ты не любишь весну? Затем мы получаем ссылку на наш сервис «MailService», используя метод « getBean », и вызываем оба метода.

Это все. Как всегда, вы можете скачать полный проект Eclipse здесь .

Статьи по Теме :