Вне платформы Java SE, но включенной в JavaEE, пакет JavaMail предоставляет платформу для создания приложений почты и обмена сообщениями. Давайте рассмотрим пример.
Отправка простого текстового сообщения
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
|
// Common variables String host = "your_smtp_server" ; String from = "from_address" ; String to = "to_address" ; // Set properties Properties props = new Properties(); props.put( "mail.smtp.host" , host); props.put( "mail.debug" , "true" ); // Get session Session session = Session.getInstance(props); try { // Instantiate a message Message msg = new MimeMessage(session); // Set the FROM message msg.setFrom( new InternetAddress(from)); // The recipients can be more than one so we use an array but you can // use 'new InternetAddress(to)' for only one address. InternetAddress[] address = { new InternetAddress(to)}; msg.setRecipients(Message.RecipientType.TO, address); // Set the message subject and date we sent it. msg.setSubject( "Email from JavaMail test" ); msg.setSentDate( new Date()); // Set message content msg.setText( "This is the text for this simple demo using JavaMail." ); // Send the message Transport.send(msg); } catch (MessagingException mex) { mex.printStackTrace(); } |
В качестве альтернативы вместо использования:
1
|
msg.setText( "This is the text for this simple demo using JavaMail." ); |
Вы можете использовать рядом, чтобы установить содержание сообщения:
1
|
msg.setContent( "This is the text for this simple demo using JavaMail." , "text/plain" ); |
Проверка адреса электронной почты
Вот небольшая хитрость, чтобы проверить с помощью регулярного выражения, правильно ли сформирован адрес электронной почты:
1
2
3
4
|
Pattern rfc2822 = Pattern.compile( "^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$" ); if (rfc2822.matcher(EMAIL_ADDRESS).matches()) { // Well formed email } |
Составные сообщения
Это нормально, но обычно вы не отправляете простые текстовые сообщения. Вместо этого вы отправляете красивые текстовые сообщения HTML с жирным или курсивным текстом, изображениями и так далее.
ПРИМЕЧАНИЕ. См. Ниже в разделе «Ссылки», чтобы узнать о формате MIME, который расширяет данные, которые вы можете прикрепить к электронному письму, и разрешить использование нескольких частей, вложений и т. Д.
Когда вы пишете составное сообщение, содержимое состоит из разных частей, например, одна часть — это сообщение, написанное в виде простого текста, а вторая часть — с тем же сообщением, написанным расширенным способом с использованием HTML. Затем клиент, который читает сообщение, отвечает за визуализацию соответствующей части в зависимости от своих возможностей.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
... // Here create two parts and set as message contect // Create and fill first part MimeBodyPart part1 = new MimeBodyPart(); part1.setText( "This is part one of this multipart message." ); // Create and fill second part MimeBodyPart part2 = new MimeBodyPart(); part2.setText( "This is part two of this multipart message." ); // Create the Multipart. Multipart mp = new MimeMultipart(); mp.addBodyPart(part1); mp.addBodyPart(part2); // Set the message's content msg.setContent(mp); ... |
Отправка вложений
Потрясающе, мы знаем, как отправить текстовое электронное письмо и что-то более невероятное, например, составное сообщение с HTML-контентом. Следующим шагом является отправка электронного письма с приложением некоторых файлов.
Создание электронного письма с вложенным файлом аналогично созданию составного сообщения, в котором одна часть может быть текстом сообщения, а другая часть — вложенным файлом. Секрет в следующих строках:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
... // Create a new part for the attached file MimeBodyPart part3 = new MimeBodyPart(); // Put a file in the second part FileDataSource fds = new FileDataSource( "THE_FILE_NAME" ); part3.setDataHandler( new DataHandler(fds)); part3.setFileName(fds.getName()); // 'mp' is the previously created 'MimeMultipart' object mp.addBodyPart(part3); // 'msg' is the previously created 'Message' object msg.setContent(mp); ... |
HTML сообщения
Создать сообщение или составное сообщение с содержимым HTML очень просто, просто укажите тип MIME в методе setContent:
1
2
3
4
|
... MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent( "<h1>Sample</h1><p>This is a sample HTML part</p>" , "text/html" ); ... |
Прикрепление изображений в HTML-код
Если вы пишете насыщенное сообщение с использованием HTML, вы, конечно, можете добавлять изображения с помощью тега img. Если на изображение ссылаются с внешнего сервера, проблем не возникает, но: как прикрепить изображение к сообщению и отобразить в теле сообщения HTML?
Идея заключается в следующем:
- Сначала вам нужно прикрепить файл изображения и установить идентификатор и
- во-вторых, вам нужно написать свой HTML-код и ссылаться на идентификатор изображения в теге ‘img’.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
... // Create and fill html part MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent( "<h1>Sample</h1><p>This is a sample HTML part with an attached image</p>" + "<img src='cid:some_image_id'>" , "text/html" ); // Create a new part for the attached image and set the CID image identifier MimeBodyPart imagePart = new MimeBodyPart(); FileDataSource fds = new FileDataSource( "THE_IMAGE_FILE_NAME" ); imagePart.setDataHandler( new DataHandler(fds)); imagePart.setHeader( "Content-ID" , "some_image_id" ); mp.addBodyPart(htmlPart); mp.addBodyPart(imagePart); ... |
Что-нибудь еще сказать?
Прибыв к этому моменту вы практически мастер отправки писем. Вы знаете, как отправлять простые электронные письма, составные электронные письма с самым богатым HTML-контентом, а также прикреплять файлы и изображения к своему сообщению.
Что еще может желать программист?
Возможно, более простой в использовании API, и это то, что предлагает вам проект Apache Commons Email . См. Раздел «Руководство пользователя» http://commons.apache.org/email/userguide.html, чтобы понять, что я говорю. Он предлагает более абстрактный API, более близкий к людям, чем к протоколам.
Ресурсы
- JavaMail — домашняя страница проекта JavaMail.
- Apache Commons Email — подпроект Apache Commons для упрощения работы с JavaMail API. Смотрите раздел « Руководство пользователя ».
- MIME (Multipurpose Internet Mail Extensions) — описание формата MIME для составных электронных писем.
Ссылка: отправка электронных писем с Java от нашего партнера JCG блоге «Любопытное животное» .