Избранное | Русский | Войти

Использование JavaMail

API Java для службы Mail поддерживает интерфейс JavaMail (javax.mail) для отправки сообщений по электронной почте.

Дополнительную информацию можно получить в справочном руководстве по API JavaMail от Sun.

Отправка сообщений по электронной почте

Чтобы отправить сообщение по электронной почте, приложение подготавливает объект MimeMessage, затем отправляет его, вызывая статический метод send() для класса Transport. Сообщение создается с помощью объекта Session JavaMail. Объекты Session и Transport работают в службе Mail App Engine без дополнительной конфигурации.

import java.util.Properties;
import javax.mail.AddressException;
import javax.mail.InternetAddress;
import javax.mail.MessagingException;
import javax.mail.MimeMessage;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;

// ...
        Properties props = new Properties();
        Session session = Session.getDefaultInstance(props, null);

        String msgBody = "...";

        try {
            Message msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress("admin@example.com"));
            msg.addRecipient(Message.RecipientType.TO,
                             new InternetAddress("user@example.com"));
            msg.setSubject("Your Example.com account has been activated");
            msg.setText(msgBody);
            Transport.send(msg);

        } catch (AddressException e) {
            // ...
        } catch (MessagingException e) {
            // ...
        }

Вызовы к службе Mail асинхронны, ответ возвращается сразу. Служба Mail управляет процессом взаимодействия с почтовыми серверами получателей и доставкой сообщения. В случае проблем с доставкой сообщения получателю или при возврате сообщения почтовым сервером получателем отправитель получает сообщение об ошибке.

Отправители и получатели

В JavaMail электронные адреса отправителя и получателей представлены в виде экземпляров класса InternetAddress. Конструктор получает адрес электронной почты в виде строки и вызывает исключение AddressException , если адрес не похож на действительный.

Чтобы задать адрес отправителя, приложение вызывает метод setFrom() для объекта MimeMessage. Отправитель должен быть представлен в виде адреса зарегистрированного разработчика приложения или адреса пользователя для текущего запроса, выполнившего вход с помощью аккаунта Google.

Задать получателей сообщения можно с помощью нескольких методов для объекта MimeMessage. Метод addRecipient() берет тип получателя и адрес и добавляет его к списку получателей данного типа. Получатели могут быть следующих типов: Message.RecipientType.TO, Message.RecipientType.CC и Message.RecipientType.BCC.

С помощью метода setReplyTo() можно указать ответный адрес.

Сообщения и заголовки

Содержание сообщения можно указать, вызвав методы на объекте MimeMessage. Метод setSubject() устанавливает тему, а метод setText() – тело сообщения в виде обычного текста.

В целях безопасности служба Mail запрещает задавать произвольные сообщения для исходящих электронных сообщений. Некоторые заголовки переопределяются службой, например, дата отправки сообщения. Другие добавляемые к исходящему сообщению заголовки удаляются.

Сообщения, состоящие из нескольких частей

Благодаря сообщениям, состоящим из нескольких частей, можно отправлять сообщения с приложениями или HTML-телом сообщения в дополнение к обычному тексту. Можно создать объект MimeMultipart, который будет содержать все необходимые части, затем создать для каждого приложения или дополнительного тела сообщения объект MimeBodyPart и включить его в контейнер. Наконец, установить контейнер в качестве содержания объекта MimeMessage.

import javax.mail.MimeBodyPart;
import javax.mail.MimeMultipart;
import javax.mail.Multipart;
import javax.activation.DataHandler;

// ...
        String htmlBody;        // ...
        byte[] attachmentData;  // ...

        Multipart mp = new MimeMultipart();

        MimeBodyPart htmlPart = new MimeBodyPart();
        htmlPart.setContent(htmlBody, "text/html");
        mp.addBodyPart(htmlPart);

        MimeBodyPart attachment = new MimeBodyPart();
        attachment.setFileName("manual.pdf");
        attachment.setContent(attachmentData, "application/pdf");
        mp.addBodyPart(attachment);

        message.setContent(mp);

В целях безопасности части сообщения должны быть допустимого типа и названия файлов должны заканчиваться расширением, соответствующим данному типу. Список допустимых типов и расширений файлов приведен в статье Обзор: вложения.

Неподдерживаемые функции JavaMail

Приложение не может получать электронные сообщения.

Приложение не может использовать интерфейс JavaMail для связи с другими почтовыми серверами с целью отправки или получения электронных сообщений. Добавляемая в объект Transport или Session конфигурация игнорируется.

Функции низкоуровневого API

В интерфейсе JavaMail доступны все функции низкоуровневого API службы Mail.

Низкоуровневой API предоставляет удобный метод для отправки почты всем администраторам приложения. Для этого в JavaMail нужно использовать в качестве получателя admin@. ("admin", собака и точка).