Лабораторная работа №5. Отправка и получения почты средствами JavaMail 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лабораторная работа №5. Отправка и получения почты средствами JavaMail



Лабораторная работа №5. Отправка и получения почты средствами JavaMail

 

Полюзуясь приведенными выше рекомендациями, написать веб-приложения, использующие JavaMail, для отправки и получения электронной почты, используя mail-сервера протоколов pop, smtp, mime или imap (как минимум три jsp-страницы – одна отправляет сообщение на указанный ящик, другая отображает папку Inbox почтового аккаунта, третья отображает письмо, которыое выбрал пользователь на второй странице).

Приложение должно уметь отправлять и принимать бинарные вложения, а также работать с письмами, состоящими из нескольких частей (Multipart).

 

Работа с электронной почтой - общий обзор

Большинство пользователей компьютеров уже знакомы с электронной почтой, ко­торая намного опережает по популярности все остальные услуги, предоставляемые ин­тернетом. Сообщение электронной почты состоит из двух компонентов. Первый из них — заголовок, содержащий информацию о сообщении, включая адреса отправителе и получателя(лей). Второй компонент сообщения — его содержимое, которое, в свою очередь, может состоять из нескольких частей (например, текста и одного или более присоединенных файлов). Ниже приведен пример такого сообщения:

Received: from f45.lawl5.hotmail.com (64.4.23.45)

by mail01b.rapidsite.net (RS ver 1.0.60s) with SMTP id 032409761

for <reader@hotmail.con>;

Thu, 19 Jul 2001 05:07:14 -0400 (EOT)

Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC;

Thu, 19 Jul 2001 02:07:05 -0700

Received: from 193.250.45.34 by Iwl5fd.lawl5.hotmail.msn.com with HTTP;

Thu, 19 Jul 2001 09:07:04 GMT

X-Originating-IP: [193.250.45.34]

From: sender@hotmail.com

To: readerOhotmail.com

Вес:

Subject: Тебе стоит знать

Date: Thu, 19 Jul 2001 09:07:04

Mime-Versidn: 1.0

Content-Type: text/plain;

format=flowed

Message - ID: <F45ifWoqFXfyY0QUUBP0000040b@hotmail.com> X-OriginalArrivalTime: 19 Jul 2001 09:07:05.0117 (UTC) FILETIME=[2E1D5CDO:01C11032] X-Loop-Detect: 1

X-UIDL: Cbae30a3b2b484793e76dbbael863ead.9c PA:

Я согласен. JB

В этом сообщении заголовок и содержимое разделены пустой строкой. Каждый атрибут заголовка располагается в собственной строке, содержащей имя атрибута, от­деленное от его значения двоеточием.

Программа-почтовый клиент знает, как принимать и отправлять сообщения потому, что умеет работать с различными почтовыми протоколами. В их число входят Simple Mail Transfer Protocol (SMTP), применяющийся для отправки почты, и Post Office Protocol 3 (РОРЗ) или Internet Message Access Protocol 4 (IMAP4), использующиеся для приема почты. IMAP4 несколько превосходит РОРЗ по возможностям;

он, например, может работать с папками и маркерами состояния. Существует еще один протокол — Multipurpose Internet Mail Extensions (MIME), являющийся стандартным форматом передачи сообщений в интернете.

Что делает JavaMail?

API JavaMail представляет собой набор абстрактных API, являющихся надстройкой над системой поставщика услуг электронной почты. API JavaMail, как и другие API J2EE, создает для клиентских приложений Java стандартную и независимую среду, в которой они могут свободно пользоваться почтой, что позволяет разработчикам созда­вать с помощью J2EE программы, обеспечивающие следующие возможности:

Создание сообщений, в том числе и многокомпонентных, содержащих присое­диненные файлы

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

Получение сообщений и сохранение их в папках

Разработчику, использующему J2EE, нет необходимости разбираться в соответству­ющих протоколах. Основную работу с почтой выполняют провайдеры услуг, так как содержат обработчики почтовых протоколов (например РОРЗ, IMAP4, SMTP). В стан­дартом варианте JavaMail фирмы Sun имеются провайдеры для всех наиболее распро­страненных протоколов (SMTP, IMAP4, MIME). Кроме того, компанией Sun был создан отдельный провайдер для РОРЗ. Существуют и провайдеры сторонних производителей для приложений наподобие Microsoft Exchange и Lotus Notes, есть и возможность соб­ственноручного создания провайдеров.

Архитектура API JavaMail является открытой, так что она сможет работать с прото­колами и стандартами будущего. На рис. 14.1 изображено общение клиентского прило­жения Java с обработчиком протокола провайдера. Провайдеры могут обрабатывать протоколы двух типов. Первый — транспортный (Transport), отправляющий сообщения к пункту назначения. Наиболее распространенным транспортным протоколом является SMTP. Второй — архивный (Store), предоставляющий доступ к сообщениям, уже дос­тавленным в почтовый ящик. Наиболее распространенным архивным протоколом се­годня является РОРЗ, но все большую популярность завоевывает IMAP4.

Если клиентское приложение Java работает с пакетами API JavaMail, ему для чтения почты нужно сетевое соединение с сервером РОРЗ или IMAP4. При отправке почты нужно сетевое соединение с почтовым сервером SMTP. Услуги таких серверов предо­ставляются либо в локальной сети (например, в корпорациях или других организаци­ях), либо Internet-провайдером (ISP) (пользователям коммутируемых/кабельных/DSL каналов связи).

 

Реестр провайдеров

Как уже упоминалось выше, JavaMail является расширяемой системой. Это означа­ет, что если будут разработаны новые протоколы, созданные ранее приложения JavaMail смогут использовать их, когда те будут загружены в реестр провайдеров. Реестр провай­деров — это список доступных провайдеров, которые могут быть обнаружены приложе­ниями на базе JavaMail.

Провайдеры, в которые встроен интерфейс JavaMail, перечислены в java-mail.default.providers. При установке пакета, содержащего новый провайдер, в его пап­ке META-INF должен тоже быть создан файл javamail.providers.

Получить список доступных в вашей системе провайдеров можно, откомпилировав и запустив следующий код:

import javax.mail.*;

class ListProviders {

public static void main(String[] args) {

java.util.Properties props = System.getProperties();

Session sess = Session.getlnstance(props, null);

Provider[] provs = sess. getProviders ();

for (int i=0;i < provs. length;++i) {

System.out.println(provs[i]);

}

}

}

На выходе получится что-то вроде этого:

javax.mail.Provider[STORE,рорЗ],

com.sun.mail.рорЗ.POP3Store,Sun Microsystems, Inc] javax.mail.Provider[STORE,imap],

com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc] javax.mail.Provider[TRANSPORT,smtp],

com.sun.mail.smtp.SMTPTransport, Sun Microsystems, Inc]

Провайдер услуг создает абстрактные классы с учетом используемых протоколов или системы. Например, провайдер IMAP для реализации JavaMail API использует IMAP4. Клиентские приложения могут создаваться с учетом использования таковой реализации для работы с электронной почтой и ее папками.

Для того чтобы программой-провайдером могли пользоваться клиентские приложе­ния JavaMail, последняя должна храниться в пакете. Создать пакет можно следующим образом:

Дайте пакету имя. Общепринятой практикой для этого является использование корпоративных доменных имен, но в обратном порядке (например, провайдер РОРЗ компании UCNY Inc. называется com.ucny.mail.pops).

Определите классы как public. Это позволит JavaMail создавать экземпляры ваших классов.

Загрузите провайдер в JAR-файл. Этот файл должен быть добавлен к пути поиска классов (classpath) клиентского приложения.

Создайте для протокола запись в реестре провайдеров. Эта запись представляет собой простой список атрибутов, описывающих данную реализацию. В ней имеет­ся пять пар имя-значение (описывающих реализацию протокола), разделенных точ­ками с запятыми. Описание значений этих атрибутов приведено в табл. 14.1.

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

addressType — строка, возвращаемая методом getType() подкласса Address

protocol — значение атрибута protocol, которое вы определили на этапе 4

Например, запись, относящаяся к РОРЗ-провайдеру компании UCNY, Inc. выгля­дит так:

protocol=pop3;type=store;class=com.ucny.рорЗ.POP3Store;

vendor=UCNY, Inc.;version=l.3

Таблица 14.1. Атрибуты протоколов в реестре провайдеров

Атрибут Описание
protocol Имя протокола, например — рорЗ, imap или smtp
type Тип протокола (транспортный или архивный)
class Пакет и имя класса, реализующего протокол
vendor Производитель (необязательно)
version Номер версии (необязательно)

Пользователи или администраторы приложения JavaMail должны ввести в реестр соответствующую запись (вручную или с помощью программы настройки). Таким об­разом происходит подключение провайдера к системе JavaMail клиента. Реестр пред­ставляет собой набор файлов ресурсов, а файл, в котором содержатся сведения о про­вайдерах JavaMail, называется javamail.providers. При необходимости JavaMail ведет поиск ресурсных файлов провайдеров в следующем порядке:

java.home/lib/javamail.providers

META-INF/javamail.providers

Разработчики провайдеров должны обеспечивать и соответствующие записи для ре­естра и требовать, чтобы их вносили в один из этих файлов.

Пользователям или администраторам приложения JavaMail, кроме того, придется расположить в реестре address.map соответствия (вручную или с помощью программы настройки). Файл, в котором хранится соответствие, называется javamail.address.map Система JavaMail ищет ресурсные файлы address.map в следующем порядке:

java. home/lib/javamail. address, map

META-INF/javamail.address.map

Разработчики провайдеров должны также обеспечивать соответствия и требовать, чтобы их вносили в один из этих файлов.

 

Java Activation Framework

Работа JavaMail ощутимо зависит от API Java Activation Framework (JAF). JAF обес­печивает возможность стандартным образом работать с данными самых разных типов (например, с изображениями, аудио- и видеоданными). Когда приложению нужно об­работать данные определенного типа, эти объекты JAF можно "активизировать" и ис­пользовать для обработки. JavaMail пользуется JAF для работы с присоединенными файлами. Когда клиентская программа JavaMail получает почтовое сообщение, она может воспользоваться технологиями JAF для создания экземпляров компонентов JavaBean, которые могут обеспечить выполнение всех команд, необходимых клиенту для прочтения, просмотра, печати и любой другой обработки содержимого сообщения.

JAF предоставляет следующие услуги для приложения: в Определение типа содержимого сообщения.

Создание набора команд, или операций, которые могут выполняться над содер­жимым сообщения.

Создание экземпляра JavaBean, предоставляющего доступ к данным. Другими словами, этот компонент выполняет команды, или операторы.

javax.mail.Session

Класс javax.mail.Session является отправной точкой API JavaMail. Этот класс обес­печивает для приложения возможность задавать такие свойства, как транспортный ме­ханизм и почтовый сервер, а также загружать классы, представляющие реализации про­вайдеров для различных почтовых протоколов и управления ими. Ниже приведены описания некоторых наиболее широко используемых методов.

Static Session getDefaultlnstance(Properties props, Authenticator authenticator)

Метод getDefaultInstance() возвращает ссылку на экземпляр объекта Session в зави­симости от указанных свойств и аутентификатора (authenticator). При первом вызове этого метода в JVM создается экземпляр Session и возвращается ссылка на него. При последующих вызовах этого метода ссылки на Session возвращаются только в том слу­чае, если значение свойства Authenticator не отличается от отправленного с вызовом, создавшим этот экземпляр Session. Если же значение свойства Authenticator отличается от первого, генерируется исключение SecurityException.

Session getlnstance(Properties props, Authenticator authenticator)

Метод getlnstance() создает и возвращает новый экземпляр Session в зависимости от указанных значений Properties и Authenticator.

Store getStore(Java.lang.String protocol) throws NoSuchProviderException

Метод getStore() возвращает экземпляр объекта Store для указанного протокола (на­пример, getStore("РОРЗ") для INBOX протокола РОРЗ).

Объекты Properties и Session

Объект Properties, использующийся для получения экземпляра объекта Session, со­здается следующим образом:

Java.util.Properties props = System.getProperties();

props.put("mail, store.protocol", "рорЗ");

props.put("mail.рорЗ.host", "mail.mydomain.com");

Session sess = Session.getlnstance(props, null);

В табл. 14.2 приведены описания возможных свойств объекта Session.

Таблица 14.2. Свойства объекта Session JavaMail

Свойство Описание Пример Значение по умолчанию
mail.transport, protocol Транспортный протокол, возвращаемый методом getTransport() по умолчанию mail.transport, protocol=smtp Session. Первый сконфигурированный транспортный протокол

 

Свойство

Описание

Пример

Значение

по умолчанию

 

mail.store.protocol

Архивный протокол,

возвращаемый

методом

Session. getStore()

по умолчанию

mail.store.

protocol=pop3

или mail.store.

protocol=imap

Первый

сконфигурированный

архивный протокол

 

mail.host

Хост "по умолчанию"

для протоколов,

свойство host которых

не установлено

mail.host=ucny.com

Локальная машина

 

mail.user

Пользователь

"по умолчанию" для

протоколов, свойство

user которых не

установлено

mail.user=pallen

user.name

 
 

 

 

 

 

mail.from

Обратный

адрес e-mail

mail.from=

pallen@ucny.com

Usend@machine-name

 

mail.protocol.host

Хост указанного

протокола

mail.pop3.host=

ucny.com

mail.host

 

mail.protocol.user

Пользователь

указанного протокола

mail.pop3.user=

jbambara

mail.user

 

mail.debug

Настройка отладки

по умолчанию —

программное

переопределение

возможно с помощью

метода

mail.debug=true

false

 
                 

 

Javax.mail.Store

Класс javax.mail.Store реализуется провайдером и обычно представляет почтовый ящик пользователя. Основное предназначение данного класса — выступать в роли контейне­ра для объектов Folder. Не забывайте о том, что РОРЗ может работать только с одной папкой. Этот класс позволяет клиентскому приложению производить считывание, за­пись, мониторинг и поиск по определенному почтовому протоколу. Ниже приведены описания некоторых наиболее часто применяемых методов: Folder getDefaultFolder() throws MessagingException

Метод getDefaultFolder() возвращает экземпляр объекта Folder, представляющий собой корневую папку Store. Внимание: для работы с РОРЗ этот метод не используется.

Folder getFolder(Java.lang.String name) throws MessagingException

Метод getFolder() возвращает экземпляр объекта Folder для указанного имени (на­пример, getFolder("INBOX") - для РОРЗ).

 

Javax.mail.Folder

Провайдер услуг реализует и класс javax.mail.Folder. Этот класс содержит сообще­ния и вложенные папки в виде иерархии, подобно используемой в Windows Explorer.

Помните, что РОРЗ может работать только с одной папкой INBOX. Имя INBOX заре-ервировано, оно является признаком корневой папки. Эта папка, закрытая по умол­чанию, может быть открыта в режимах READONLY (только для чтения) или READWR1TE (для чтения и записи). Ниже приведены описания некоторых наиболее часто применяемых методов:

boolean create(int type) throws MessagingException

Метод create() создает в архиве папку указанного типа. В случае успеха операции метод возвращает значение true, и false — в случае неудачи. В табл. 14.3 приведен:лисок типов создаваемых папок.

 

Таблица 14.3. Типы папок

Тип Описание
Folder.HOLDS_MESSAGES Folder. HOLDS_FOLDERS Folder. HOLDS_MESSAGES + Folder. HOLDSFOLDERS В этой папке могут храниться только сообщения В этой папке могут храниться только папки В этой папке могут храниться сообщения и папки

 

boolean delete(boolean recurse) throws MessagingException

Метод delete() позволяет удалить из архива Store закрытую папку. При успешном удалении он возвращает значение true, и false — при возникновении ошибки. Если аргументу recurse задано значение true, все вложенные папки вместе с содержащимися в них сообщениями также удаляются. Если же значение этого аргумента — false, а в папке содержатся вложенные папки, удалены они не будут (сообщения же, в зависимо­сти от реализации метода, могут удаляться или нет).

Message[] expunge() throws MessagingException

Метод expunge() уничтожает все сообщения, помеченные как удаленные, и возвра­щает массив удаленных объектов Message.

Message[] getMessages() throws MessagingException

Метод getMessages() считывает все содержащиеся в папке сообщения. Если сообще­ний в папке нет, возвращается пустой массив.

void open(int mode) throws MessagingException

Метод open() открывает папку в указанном режиме. Режим может принимать зна­чения Folder. READ_ONLY или Folder. READWRITE. Этот метод может использовать­ся только при работе с папками, способными содержать сообщения (т.е. тип которых — Folder.HOLDSMESSAGES).

boolean renameTo(Folder f) throws MessagingException

Метод renameTo() переименовывает закрытые папки. В качестве аргумента этому методу передается объект Folder, представляющий новое имя папки.

Message[] search(SearchTerm term) throws MessagingException

Метод search() производит в папке поиск сообщений, соответствующих указанному критерию. Метод возвращает массив, содержащий найденные сообщения или пустой массив, если совпадений поискового контекста не обнаружено. Поиск производится путем применения метода search (term, getMessages()) ко всем сообщениям папки.

Message[] search(SearchTerm term, Message[] msgs) throws MessagingException

Эта форма метода search() позволяет произвести контекстный поиск в массиве выб­ранных сообщений. Метод возвращает массив, содержащий найденные сообщения или пустой массив, если совпадений поискового контекста не обнаружено. Поиск произво­дится путем циклического обхода массива сообщений и вызова метода match() с ука­занным контекстом поиска.

void setFlags(Message[] msgs, Flags flag, boolean value) throws MessagingException

Метод setFlags() присваивает меткам указанного массива сообщений указанное зна­чение (существуют переопределенные версии этого метода, позволяющие выбирать со­общения по-другому). Указанные объекты Message должны относиться к одной папке. Список используемых меток приведен в табл. 14.4.

Таблица 14.4. Типы меток

Тип Описание
Flags.Flag. ANSWERED На сообщение ответили.
Flags.Flag.DELETED Сообщение помечено как удаленное.
Flags.Flag.DRAFT Сообщение-черновик.
Flags.Flag.FLAGGED Сообщение помечено.
Flags.Flag.RECENT Свежее сообщение.
Flags.Flag.SEEN Сообщение было просмотрено.
Flags.Flag.USER Папка поддерживает пользовательские метки.

 

Javax.mail.search

Критерии поиска в JavaMail указываются в виде дерева поисковых терминов. В табл. 14.5 приведены классы пакета search.

 

Таблица 14.5. Классы пакета javax.mail.search

Класс Описание и метод Constructor
AddressStringTerm AddressTerm AndTerm Сравнивает адреса сообщений Message. Отличается от класса AddressTerm тем, что сравнивает адреса как текстовые строки, а не как объекты Address. Сравнивает адреса сообщений Message. Логический оператор "И" для объектов SearchTerm. AndTerm(SearchTerm[] t) Constructor принимает массив объектов SearchTerm. Положительный результат выдается при совпадении всех элементов. AndTerm(SearchTerm t1, SearchTerm t2) Constructor принимает два объекта SearchTerm. Положительный результат выдается при совпадении обоих элементов.

 

Класс Описание и метод Constructor
BodyTerm Сравнивает тела сообщений Message. BodyTerm (java.lang.String pattern) Поиск в тексте производится только для сообщений типа Text, состоящих из одного фрагмента или многофрагментных/смешанных сообщений, в первой части тела которых содержится текст.
ComparisonTerm Формирует оператор сравнения. Используются DateTerm, IntegerComparisonTerm, ReceivedDateTerm, SentDateTerm и SizeTerm для выполнения сравнения данных соответствующих типов. Определяет следующие константы: EQ (равняется), GE (больше или равняется), GT (больше), LE (меньше или равняется), LT (меньше) и NE (не равняется).
DateTerm Проводит сравнение дат с использованием констант ComparisonTerm (EQ, GE, GT, LE, LT и NE). DateTermfint comparison, java.util.Date date)
FlagTerm Проводит сравнение меток сообщений Message. FlagTerm (Flags flags, boolean setting) Положительный результат выдается, если метки включены (если значение setting равно true) или выключены (если значение setting — false).
FromStringTerm Проводит сравнение заголовков адресов Address. FromStringTerm (Java.lang.String pattern) Отличается от класса FromTerm тем, что сравнивает адреса как текстовые строки, а не как объекты Address. Чувствительность к регистру отсутствует.
FromTerm Проводит сравнение заголовков адресов. FromTerm(Address address)
HeaderTerm Проводит сравнение заголовков Message со строкой (чувствительность к регистру отсутствует). HeaderTerm (Java.lang.String headerName, java.lang.String pattern)
IntegerComparisonTerm Проводит сравнение целых чисел с использованием констант ComparisonTerm (EQ, GE, GT, LE, LT и NE). lntegerComparisonTerm(int comparison, int number)
MessagelDTerm Проводит сравнение полей Messageld интернет-сообщений. MessagelDTerm(java.lang.String msgid)
MessageNumberTerm Проводит сравнение номеров сообщений. MessageNumberTerm(int number)
NotTerm Логический оператор "НЕ". Положительный результат выдается, если совпадения с критерием поиска нет, и наоборот. NotTerm(SearchTerm t)
OrTerm Логический оператор "ИЛИ" для объектов SearchTerm. OrTerm(SearchTerm[] t) Constructor принимает массив объектов SearchTerm. Положительный результат выдается при совпадении любого элемента. OrTerm(SearchTerm tl, SearchTerm t2) Constructor принимает два объекта SearchTerm. Положительный результат выдается при совпадении любого из них.

 

Класс Описание и метод Constructor

ReceivedDateTerm

Проводит сравнение дат получения сообщений.
ReceivedDateTerm(int comparison, java.util.Date date)

RecipientStringTerm

Проводит сравнение адресов получателя.
RecipientStringTerm(Message.RecipientType type, Java.lang.String
pattern)
Отличается от класса RecipientTerm тем, что сравнивает адреса как
текстовые строки, а не как объекты Address. Чувствительность к
регистру отсутствует.

RecipientTerm

Проводит сравнение адресов получателя.
RecipientTerm (Message.RecipientType type, Address address)
SearchTerm Основной класс для всех элементов поиска.

SentDateTerm

Проводит сравнение дат отправки сообщений с использованием
констант ComparisonTerm (EQ, GE, GT, LE, LT и NE).
SentDateTerm (int comparison, java.util.Date date)

SizeTerm

Проводит сравнение объема сообщений с использованием констант
ComparisonTerm (EQ, GE, GT, LE, LT и NE).
SizeTerm(int comparison, int size)

StringTerm

Реализует метод match() для строк String.
StringTerm(java.lang.String pattern)
StringTerm(java.lang.String pattern, boolean ignoreCase)

SubjectTerm

Сравнивает заголовок subject сообщения (чувствительность к
регистру отсутствует),
boolean match(Message msg)

 

Ниже приведен пример кода, в котором используется пакет javax.mail.search:

if (msg-in.match(new AndTerm(

new SubjectTerm("стандарты разработки"), new BodyTerm("отправить")))) {

Message msg-out = msg-in.reply();

msg-out.setText("Стандарты разработки: запрос получен.");

Transport.send(msg-out);

}

 

Javax.mail.Address

Класс javax.mail.Address — абстрактный класс, определяющий адрес сообщения. В большинстве случаев вы будете сталкиваться с такими реализациями этого класса, как javax.mail.internet.InternetAddress (см. ниже).

javax.mail.internet.lnternetAddress

javax.mail.internet.InternetAddress является реализацией класса javax.mail.Address и представляет адрес электронной почты. Этот класс применяется для указания получа­телей сообщения. Создать InternetAddress можно двумя способами:

• InternetAddress("e-mail@domain"), при помощи метода Constructor.

• Вызовом метода InternetAddress.parse("e-maill@domain, e-mail2@domain, e-mail3@domain,..."), принимающего в качестве параметра строку String и воз­вращающего массив элементов типа InternetAddress. Адреса электронной почты в строке String разделяются запятой.

javax.mail. Message

Класс javax.mail.Message определяет сообщение электронной почты. Это абстракт­ный класс, являющийся реализацией интерфейса javax.mail.Part. Объект Message обла­дает такими атрибутами, как строка темы, отправитель, получатель (получатели), а также дата отправки. Эти атрибуты, представленные парами имя-значение, содержат необходимую для адресации информацию и определяют структуру содержимого сооб­щения (тип содержимого). Кроме того, класс Message включает в себя содержимое сообщения и метки, указывающие состояние папки (см. метод setFlags() класса Folder, описанного ранее). Сообщения могут содержать или один объект содержимого, или несколько таких объектов. В обоих случаях содержимое сообщения хранится в объекте DataHandler.

javax.mail. internet.MimeMessage

Класс javax.mail.internet.MimeMessage является наиболее часто используемой реали­зацией javax.mail.Message и представляет сообщение в MIME-кодировке (Multi-purpose Internet Mail Extensions). MIME-сообщение может содержать текст, изображение, аудио-, видеофрагмент или данные другого типа. На рис. 14.3 изображены компоненты объекта MimeMessage.

MimeMessage может работать с сообщениями, состоящими из нескольких частей. Таким образом создается возможность подсоединения к сообщениям файлов. Ниже описано большинство методов MimeMessage, которыми пользуются при работе с этим объектом:

MimeMessage(Session session)

Метод MimeMessage() является стандартным конструктором этого объекта, он со­здает экземпляр пустого объекта message для данного объекта Session. Заголовку и меткам присваивается значение пустого объекта internetHeaders и объекта Flags соот­ветственно.

void addFrom(Address[] addresses) throws MessagingException

Метод addFrom() вставляет в существующее поле From указанные адреса. Если та­кого поля нет, оно создается.

void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException

Метод addRecipients() вставляет в сообщение данные адреса указанного типа полу­чателя. См. табл. 14.6 — в ней приведено описание типов получателей.

Таблица 14.6. Типы получателей

Тип получателя Описание
Message. RecipientType.ТО Для основных получателей
Message. RecipientType. СС Для получателей копий
Message.RecipientType.ВСС Для получателей скрытых копий
MimeMessage. RecipientType. NEWSGROUPS Для сообщений MimeMessages,
  отправленных в телеконференцию

Java.util.Enumeration getAHHeaders () throws MessagingException

Метод getAllHeadersO возвращает все заголовки в виде перечисления объектов Header. Если эти заголовки содержат символы, не входящие в таблицу US-ASCII, они кодиру­ются и их нужно раскодировать.

Java.util.Enumeration getAHHeaderLines () throws MessagingException

Метод getAHHeaderLines () возвращает все заголовки в виде перечисления объектов String. Строка заголовка содержит названия и значения полей. Address [] getAHRecipients Q throws MessagingException Метод getAllRecipientsO возвращает все адреса получателей сообщения.

Java.lang.Object getContent() throws java.io.IOException, MessagingException

Метод getContent() возвращает содержимое сообщения в виде объекта Java. Тип данных этого объекта зависит от содержимого (например, объект типа String возвраща­ется для содержимого типа "text/plain", объект MimeMultipart — для сообщения с содер­жимым типа "multipart". Объект типа InputStream возвращается, если тип содержимого неизвестен системе DataHandler. Этот метод извлекает содержимое сообщения, исполь­зуя метод getDataHandler().getContent().

DataHandler getDataHandler() throws MessagingException

Метод getDataHandler() возвращает объект DataHandler для хранения содержимого сообщения.

Flags getFlags() throws MessagingException

Метод getFlags() возвращает объект Flags, содержащий все метки данного сообще­ния. Объект Flags является копией внутреннего объекта Flags сообщения, поэтому внесенные в него изменения не отразятся на метках сообщения.

Folder getFolder()

Метод getFolder() (унаследованный от объекта Message) возвращает ссылку на пап­ку, из которой было загружено сообщение. Если этот метод применить к новому сооб­щению, он возвращает пустую ссылку.

Address[] getFrom() throws MessagingException

Метод getFrom() возвращает значение поля From заголовка. Если этого поля в за­головке нет, вместо него используется поле Sender, если же и его нет — возвращается пустой указатель.

java.io.InputStream getlnputStream() throws java.io.IOException, Mes sagingException

Метод getlnputstream() возвращает декодированный входной поток содержимого сообщения. Этот метод получает поток от объекта DataHandler; т.е. вызывает метод getDataHandler().getInputstream().

java.lang.String getMessagelD() throws MessagingException

Метод getMessagelD() возвращает значение поля Message-ID заголовка. Если это поле недоступно или у него нет значения, возвращается пустой указатель.

int getMessageNumber()

Метод getMessageNumber() (унаследованный от класса Message) возвращает номер сообщения. Номер сообщения — позиция сообщения по отношению к папке. Вновь созданные или унаследованные сообщения получают номер 0 (ноль);

другие действи­тельные номера сообщений начинаются с 1. Номер сообщения может измениться во время сеанса при удалении или стирании других сообщений папки.

java.util.Date getReceivedDate() throws MessagingException

Метод getReceivedDate() возвращает дату получения сообщения. Для сообщений MimeMessage этот метод пока что всегда возвращает пустой указатель;

однако в других реализациях класса Message он может возвращать значение.

Address[] getRecipients(Message.RecipientType type) throws MessagingException

Метод getRecipients() возвращает список получателей указанного типа.

Address[] getReplyTo() throws MessagingException

Метод getReplyTo() возвращает значение поля Reply-To заголовка. Если это поле недоступно или у него нет значения, вызывается метод getFrom() и возвращается его значение.

java.util.Date getSentDate() throws MessagingException

Метод getSentDate () возвращает значение поля Date заголовка. Это дата отправки сообщения. Если это поле недоступно или у него нет значения, возвращается пустой указатель.

int getSize() throws MessagingException

Метод getSize() возвращает объем содержимого сообщения в байтах. Если объем не удается определить, возвращается значение -1. Обратите внимание: в возвращаемом значении может быть неточно отражен реальный объем содержимого сообщения, а также может быть учтена (либо не учтена) его кодировка.

Java.lang.String getSubjectO throws MessagingException

Метод getSubject() возвращает декодированное значение поля Subject заголовка. Если это поле недоступно или у него нет значения, возвращается пустой указатель.

boolean isExpunged()

Метод isExpunged() (унаследованный от класса Message) проверяет, было ли сооб­щение стерто. Ни один другой метод, кроме getMessageNumber(), не может применять­ся к стертым сообщениям.

boolean isSet(Flags.Flag flag) throws MessagingException

Метод isSet() проверяет, установлено ли значение true для указанной в аргументе метки. Если это так, метод возвращает значение true, если же нет — false.

boolean match(SearchTerm term) throws MessagingException

Метод match() (унаследованный от класса Message) возвращает положительный ре­зультат, если сообщение соответствует указанному критерию поиска SearchTerm и от­рицательный — если нет.

Message reply(boolean replyToAll) throws MessagingException

Метод reply() создает объект Message и присваивает всем его заголовкам и атрибу­там значения, соответствующие ответу. В новом сообщении нет никакого содержимого;

его должен создать вызывающий этот метод объект. Поле Subject будет скопировано из оригинала письма и к нему будет добавлен префикс Re:. Если этот префикс уже име­ется, новый не создается.

Если это сообщение снабжено заголовком Message-Id, к нему присоединяется и заголовок In-Reply-To. Метке ANSWERED оригинала присваивается значение true. Если условию replyToAll присвоено значение true, новое сообщение будет адресовано всем получателям. Если же нет, то оно будет отправлено только отправителю оригинала (адрес которого будет получен вызовом метода getReplyTo()).

void saveChanges() throws MessagingException

Метод saveCnanges() обновляет соответствующие заголовки сообщения и приводит их в соответствие с его содержимым. В его функции входит и создание уникальных идентификаторов для новых сообщений. Если сообщение хранится в папке, все внесен­ные в него изменения сохраняются в этой папке.

При изменении любой части сообщения (заголовка или содержимого) необходимо вызвать метод saveChanges(), чтобы все изменения были сохранены. Если этого не сделать, изменения могут и не сохраниться (это зависит от реализации папки).

Сообщения, полученные из папок, открытых как READONLY, не должны моди­фицироваться — а значит, и метод saveChanges() также не должен вызываться.

void setContent(Java.lang.Object о,

Java.lang.String type) throws MessagingException

Этот вариант метода setContent() устанавливает содержимое и MIME-тип содержи­мого сообщения (например, setContent ("my content", "text/html")). Содержимое со­храняется в объекте DataHandler. Класс DataContentHandler для соответствующего типа данных должен быть установлен и доступен системе JavaMail — иначе этот метод не сможет корректно работать. Например, присоединить файл Acrobat PDF к сообщению при помощи вызова метода setContent (mypdf, "application/pdf') можно только если доступен класс DataContentHandler для типа "application/pdf.

void setContent(Multipart mp) throws MessagingException

Этот вариант метода setContent () присваивает содержимому сообщения значение содержимого объекта Multipart.

void setExpunged(boolean expunged)

Метод setExpunged () (унаследованный от класса Message) присваивает метке expunged объекта Message указанное значение.

void setFlags(Flags flag, boolean set) throws MessagingException

Метод setFlags() присваивает меткам сообщения указанные значения.

void setFrom() throws MessagingException

Этот вариант метода setFrom() присваивает полю From заголовка значение, возвра­щаемое методом InternetAddress.getLocalAddressO, замещая любое имевшееся ранее зна­чение.

void setFrom(Address address) throws MessagingException

Этот вариант метода setFrom() присваивает полю заголовка From значение данного адреса, замещая любое имевшееся ранее значение. Если массив адресов, передаваемый методу в качестве параметра, пуст, поле заголовка From удаляется.

void setRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException

Метод setRecipients() присваивает адреса получателей указанному типу. Описание типов получателей приведено в табл. 14.6.

void setReplyTo(Address[] addresses) throws MessagingException

Метод setReplyTo() устанавливает значение поля заголовка Reply-To. Если адрес, передаваемый методу в качестве параметра, пуст, это поле заголовка удаляется, void setSentDatefjava.util.Date date) throws MessagingException

Метод setSentDate() устанавливает значение поля заголовка Date. В этом поле хра­нится дата окончания письма и подготовки его к отправке. Если дата, передаваемая методу в качестве параметра, пуста, поле заголовка Date удаляется.

void setSubject(java.lang.String subject) throws MessagingException

void setSubject(java.lang.String subject, java.lang.String charset) throws MessagingException

Методы setSubject() устанавливают значение поля заголовка subject. Если в этом поле содержатся только символы таблицы US-ASCII, указывать применяемый набор символов не нужно. Если в этом поле содержатся символы, не входящие в таблицу US-ASCII, нужно указать используемый набор символов, и для поля будет установлена соответствующая кодировка. Если параметр, передаваемый этому методу, пуст, поле заголовка Subject удаляется.

void setText(java.lang.String text) throws MessagingException

Этот вариант метода setText() присваивает содержимому сообщения значение ука­занного объекта String, с MIME-типом text/plain. Производительность данного метода при работе с большими объемами текста невелика, так как он проверяет все символы текста, определяя, какой набор символов нужно использовать.

void setText(Java.lang.String text,

Java.lang.String charset) throws MessagingException

Этот вариант метода setText() присваивает содержимому сообщения значение ука­занного объекта String с MIME-типом text/plain. Содержимое объекта String при этом кодируется с использованием указанного набора символов.

javax.mail.Transport

Класс javax.mail.Transport также реализуется провайдером. Применяется он только с одной целью — для отправки сообщений с использованием указанного протокола. Сообщение отправляется вызовом статического метода send() (например send(Message msg, Address[] addresses)). Ниже приведено описание его наиболее часто использую­щихся методов:

void send(Message msg) throws MessagingException



Поделиться:


Последнее изменение этой страницы: 2020-03-02; просмотров: 179; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.129.70.157 (0.205 с.)