410013796724260
• Webmoney
R335386147728
Z369087728698
Работа с сообщениями JavaMailСвободно распространяемая библиотека JavaMail предназначена для подключения к почтовым серверам с целью получения и отправки электронной почты с использованием протоколов SMTP, POP3 и IMAP. Библиотека позволяет отправлять сообщения с вложениями и удалять их на почтовом сервере. Протоколы JavaMail API
Отправка сообщения по протоколу SMTPСоздадим класс подготовки и отправки сообщения SendEmail.java. В классе определим поля сервера SMTP, поля авторизации на сервере и дополнительные поля вложения файла FILE_PATH и адресата для ответа REPLY_TO. Конструктор класса SendEmail.java, настройка SMTP SSLpublic class SendEmail { private Message message = null; protected static String SMTP_SERVER = null; protected static String SMTP_Port = null; protected static String SMTP_AUTH_USER = null; protected static String SMTP_AUTH_PWD = null; protected static String EMAIL_FROM = null; protected static String FILE_PATH = null; protected static String REPLY_TO = null; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public SendEmail(final String emailTo, final String thema) { // Настройка SMTP SSL Properties properties = new Properties(); properties.put("mail.smtp.host" , SMTP_SERVER); properties.put("mail.smtp.port" , SMTP_Port ); properties.put("mail.smtp.auth" , "true" ); properties.put("mail.smtp.ssl.enable" , "true" ); properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); try { Authenticator auth = new EmailAuthenticator(SMTP_AUTH_USER, SMTP_AUTH_PWD); Session session = Session.getDefaultInstance(properties,auth); session.setDebug(false); InternetAddress email_from = new InternetAddress(EMAIL_FROM); InternetAddress email_to = new InternetAddress(emailTo ); InternetAddress reply_to = (REPLY_TO != null) ? new InternetAddress(REPLY_TO) : null; message = new MimeMessage(session); message.setFrom(email_from); message.setRecipient(Message.RecipientType.TO, email_to); message.setSubject(thema); if (reply_to != null) message.setReplyTo (new Address[] {reply_to}); } catch (AddressException e) { System.err.println(e.getMessage()); } catch (MessagingException e) { System.err.println(e.getMessage()); } } } Конструктор класса SendEmail.java включает два параметра : email получателя и тему сообщения. Первоначально в конструкторе определяются свойства сервера; подключение к серверу будет выполняться по защищенному каналу SSL с авторизацией пользователя. Для этого создается класс авторизации auth типа Authenticator и формируется сессия класса javax.mail.Session, которой в качестве параметров передаются свойства properties и auth. На следующем шаге формируется сообщение для отправки. Предварительно создаются адресаты (тип InternetAddress) email_from, email_to, reply_to . Адресат сообщения reply_to используется для случая, когда получатель должен отвечать не непосредственно отправителю email_from, который играет роль сервера перессылки. Данную опцию должен поддерживать сервер получателя, чтобы при нажатии на кнопку «Ответить» пользователю открывалось новое письмо с подстановкой в поле адресата «Кому» значения reply_to, а не email_from. Конструктор объекта сообщения message типа MimeMessage в качестве параметра получает значение созданной защищенной с сервером SMTP сессии session. Листинг аутентификатора EmailAuthenticator.javaКласс Authenticator обеспечивает доступ к защищенным почтовым ресурсам на сервере. В примерах этот класс используется для установления сессии с сервером. Когда потребуется авторизация, библиотека JavaMail будет вызывать метод getPasswordAuthentication. public class EmailAuthenticator extends javax.mail.Authenticator { private String login ; private String password; public EmailAuthenticator (final String login, final String password) { this.login = login; this.password = password; } public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(login, password); } } Вложение файла в сообщение, MimeBodyPartДля вложения файла в сообщение необходимо создать объект типа MimeBodyPart, в котором в качестве параметров указать путь к файлу и наименование файла. Следующий листинг представляет функцию формирования объекта MimeBodyPart с содержимом файла, который можно вкладывать в сообщение. private MimeBodyPart createFileAttachment(String filepath) throws MessagingException { // Создание MimeBodyPart MimeBodyPart mbp = new MimeBodyPart(); // Определение файла в качестве контента FileDataSource fds = new FileDataSource(filepath); mbp.setDataHandler(new DataHandler(fds)); mbp.setFileName(fds.getName()); return mbp; } Отправка сообщения, MultipartФункция sendMessage завершает оформление сообщения. Для этого создается объект mmp типа MimeMultipart, в который можно вложить другие объекты типа MimeBodyPart (текст, файл). Метод сообщения setContent, которому в качестве параметра передается объект MimeMultipart, определяет содержимое сообщения. public boolean sendMessage (final String text) { boolean result = false; try { // Содержимое сообщения Multipart mmp = new MimeMultipart(); // Текст сообщения MimeBodyPart bodyPart = new MimeBodyPart(); bodyPart.setContent(text, "text/plain; charset=utf-8"); mmp.addBodyPart(bodyPart); // Вложение файла в сообщение if (FILE_PATH != null) { MimeBodyPart mbr = createFileAttachment(FILE_PATH); mmp.addBodyPart(mbr); } // Определение контента сообщения message.setContent(mmp); // Отправка сообщения Transport.send(message); result = true; } catch (MessagingException e){ // Ошибка отправки сообщения System.err.println(e.getMessage()); } return result; } Для отправки сообщения используется метод send класса Transport, который имеет следующие перегруженные методы send : static void send(Message message) throws MessagingException static void send(Message message, Address[] addresses) throws MessagingException Первый метод send отправит сообщение получателям, указанным в сообщении. Второй метод отправит сообщение всем получателям, определенным в массиве addresses за исключением тех, которые определены в сообщении. Пример отправки сообщенияДля отправки сообщения создадим файл свойств email.properties, в котором определим все необходимые параметры сервера SMTP и параметры подключения. В примере используем почтовый сервер Yandex, хотя настройки позволяют использовать и другие известные почтовые сервера. # # Параметры сервера SMTP # server=smtp.yandex.ru port=465 # # email отправителя # from=...@yandex.ru user=... pass=... # # email получателя # to=...@yandex.ru # # email для ответа # replyto=java-online@mail.ru # # Сообщение : тема и текст # thema=Пересылка сообщения text=Тестовое сообщение для перессылки В файле свойств необходимо заполнить 4 поля, значения которых определены в виде многоточий. Если, к примеру, почтовый адрес в Yandex'e имеет вид qwerty@yandex.ru, то пользователь user будет иметь значение qwerty. Следующий класс EmailTest используется для отправки сообщения. Сначала из файла свойств читаются параметры почтового сервера и параметры подключения. Для чтения файла используется класс InputStream, более подробно о котором сказано на странице Потоки ввода. После этого создается объект SendEmail и выполняется отправка сообщения. public class EmailTest { private final static String PROPS_FILE = "email.properties"; public static void main(String[] args) { try { InputStream is = new FileInputStream(PROPS_FILE); if (is != null) { Reader reader = new InputStreamReader(is, "UTF-8"); Properties pr = new Properties(); pr.load(reader); SendEmail.SMTP_SERVER = pr.getProperty ("server" ); SendEmail.SMTP_Port = pr.getProperty ("port" ); SendEmail.EMAIL_FROM = pr.getProperty ("from" ); SendEmail.SMTP_AUTH_USER = pr.getProperty ("user" ); SendEmail.SMTP_AUTH_PWD = pr.getProperty ("pass" ); SendEmail.REPLY_TO = pr.getProperty ("replyto"); SendEmail.FILE_PATH = PROPS_FILE; String emailTo = pr.getProperty ("to" ); String thema = pr.getProperty ("thema"); String text = pr.getProperty ("text" ); is.close(); SendEmail se = new SendEmail(emailTo, thema); se.sendMessage(text); System.out.println ("Сообщение отправлено"); } } catch (IOException e) { e.printStackTrace(); } } } Представленный пример с небольшими изменениями можно использовать для рассылки сообщений. Чтение сообщений по протоколу IMAPКак было отмечено выше протокол IMAP следует использовать для чтения почтовых сообщений. При использовании протокола IMAP программа должна подключиться к серверу и получить доступ к папке INBOX. Для настройки сессии подключения по протоколу IMAP необходимо указать следующие данные :
Для доступа к почтовому серверу также необходимо указать логин и пароль пользователя. Если для получение почты (подключения к почтовому серверу) используется ящик вида «login@yandex.ru», то логином является часть адреса до знака «@». Листинг примера чтения почтовых сообщенийВ следующем примере сначала настраивается сессия с почтовым сервером для работы по «закрытому» каналу связи. После этого выполняется чтение последнего сообщения папки «INBOX», которое было отправлено в предыдущем примере. В консоль выводится информация этого последнего сообщения. Чтобы пример сработал необходимо вместо многоточий подставить реальные логин и пароль. public class ReadEmail { String IMAP_AUTH_EMAIL = "...@yandex.ru" ; String IMAP_AUTH_PWD = "..." ; String IMAP_Server = "imap.yandex.ru"; String IMAP_Port = "993" ; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public ReadEmail() { Properties properties = new Properties(); properties.put("mail.debug" , "false" ); properties.put("mail.store.protocol" , "imaps" ); properties.put("mail.imap.ssl.enable", "true" ); properties.put("mail.imap.port" , IMAP_Port); Authenticator auth = new EmailAuthenticator(IMAP_AUTH_EMAIL, IMAP_AUTH_PWD); Session session = Session.getDefaultInstance(properties, auth); session.setDebug(false); try { Store store = session.getStore(); // Подключение к почтовому серверу store.connect(IMAP_Server, IMAP_AUTH_EMAIL, IMAP_AUTH_PWD); // Папка входящих сообщений Folder inbox = store.getFolder("INBOX"); // Открываем папку в режиме только для чтения inbox.open(Folder.READ_ONLY); System.out.println("Количество сообщений : " + String.valueOf(inbox.getMessageCount())); if (inbox.getMessageCount() == 0) return; // Последнее сообщение; первое сообщение под номером 1 Message message = inbox.getMessage(inbox.getMessageCount()); Multipart mp = (Multipart) message.getContent(); // Вывод содержимого в консоль for (int i = 0; i < mp.getCount(); i++){ BodyPart bp = mp.getBodyPart(i); if (bp.getFileName() == null) System.out.println(" " + i + ". сообщение : '" + bp.getContent() + "'"); else System.out.println(" " + i + ". файл : '" + bp.getFileName() + "'"); } } catch (NoSuchProviderException e) { System.err.println(e.getMessage()); } catch (MessagingException e) { System.err.println(e.getMessage()); } catch (IOException e) { System.err.println(e.getMessage()); } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public static void main(String[] args) { new ReadEmail(); System.exit(0); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } В примере используются абстрактные классы
В консоль будет выведено следующее сообщение. Конечно, количество сообщений в почтовом ящике «INBOX» будет другим. Количество сообщений : 30 0. сообщение : 'Тестовое сообщение для перессылки' 1. файл : 'email.properties' Скачать примеры использования JavaMailИсходные коды рассмотренных примеров использования библиотеки JavaMail в виде проекта Eclipse можно скачать здесь (930 Кб). |