Бърз старт на JavaMail

В JavaMail ще намерите API и внедрявания на доставчици, които ви позволяват да разработите напълно функционални приложения за имейл клиенти. „Имейл клиентски приложения“ извиква мисли за Microsoft Outlook; и да, можете да напишете своя собствена подмяна на Outlook. Но имейл клиентът изобщо не трябва да се намира на клиентска машина. Всъщност това може да бъде сървлет или EJB, работещ на отдалечен сървър, предоставящ на крайния потребител достъп до имейл чрез уеб браузър. Помислете за Hotmail (да, можете да напишете и вашата собствена версия на Hotmail). Или можете изобщо да избегнете потребителски интерфейс. Какво ще кажете за автоматичен отговор, който чете входящи съобщения и изпраща отговори, персонализирани според оригиналния подател?

В моя собствен проект за домашни любимци говорещ имейл клиент чете - тоест говори - входящи съобщения. Базира се на усъвършенстване на идея, която въведох в "Talking Java!" Ще ви разкажа повече за това по-късно.

Засега започнете с инсталиране и конфигуриране на софтуера JavaMail.

Настройвам

Ако използвате Java 2 Platform, Enterprise Edition (J2EE) 1.3, имате късмет: той включва JavaMail, така че не се изисква допълнителна настройка. Ако обаче използвате Java 2 Platform, Standard Edition (J2SE) 1.1.7 и по-нови версии и искате да имате възможност за имейл за вашите приложения, изтеглете и инсталирайте следното:

  • JavaMail
  • Рамка за активиране на JavaBeans

За да инсталирате, просто разархивирайте изтеглените файлове и добавете съдържащите се jar файлове към вашия път на класа. Като пример, ето моята пътека за клас за този проект:

.; C: \ Apps \ Java \ javamail-1.2 \ mail.jar; C: \ Apps \ Java \ javamail-1.2 \ mailapi.jar; C: \ Apps \ Java \ javamail-1.2 \ pop3.jar; C: \ Приложения \ Java \ javamail-1.2 \ smtp.jar; C: \ Apps \ Java \ jaf-1.0.1 \ activation.jar 

Най- mailapi.jarфайл съдържа основните класове API, а pop3.jarи smtp.jarфайловете съдържат внедряванията Доставчика за съответните протоколи поща. (Няма да използваме imap.jarфайла в тази статия.) Помислете за внедряванията на доставчиците като за подобни на драйверите JDBC (Java Database Connectivity), но за системи за съобщения, а не за бази данни. Що се отнася до mail.jarфайл, той съдържа всеки един от посочените по-горе буркан файлове, така че бихте могли да ограничите CLASSPATH само до mail.jarи activation.jarфайлове.

В activation.jarдосието ви дава възможност да се справят с MIME (Multipurpose Internet Mail Extensions) типове достъпни чрез двоични потоци от данни. Потърсете DataHandlerкласа в раздела Не просто обикновен текст по-късно.

За протокола, останалата част от тази статия не предлага изчерпателно API покритие; по-скоро ще се научите като правите. Ако това е задълбочена информация за API, която търсите, тогава погледнете PDF файловете и Javadocs, включени в съответните пакети за изтегляне.

След като инсталирате софтуера, трябва да получите подробности за имейл акаунта, за да стартирате примерите, които следват. Ще ви трябват имена на SMTP (Simple Mail Transfer Protocol) на вашия доставчик на интернет услуги и име на POP (Post Office Protocol) сървър, ваше име за вход в имейл акаунта и парола за вашата пощенска кутия. Фигура 1 показва моите данни - не истинските, разбирате ли - както се използват от Microsoft Outlook.

Изпращане на имейл чрез SMTP

Първият пример показва как да изпратите основно имейл съобщение чрез SMTP. По-долу ще намерите SimpleSenderкласа, който взема данните за вашето съобщение от командния ред и извиква отделен метод - send(...)- за да го изпрати:

пакет com.lotontech.mail; импортиране на javax.mail. *; импортиране на javax.mail.internet. *; импортиране на java.util. *; / ** * Прост клас на подател на имейл. * / публичен клас SimpleSender {/ ** * Основен метод за изпращане на съобщение, дадено в командния ред. * / public static void main (String args []) {try {String smtpServer = args [0]; Низ до = аргументи [1]; Низ от = args [2]; Тема на низа = аргументи [3]; Низово тяло = аргументи [4]; изпращане (smtpServer, към, от, предмет, тяло); } catch (Изключение ex) {System.out.println ("Usage: java com.lotontech.mail.SimpleSender" + "smtpServer toAddress fromAddress subjectText bodyText"); } System.exit (0); }

След това изпълнете, SimpleSenderкакто е показано по-долу. Заменете smtp.myISP.netсъс собствен SMTP сървър, както е извлечено от настройките ви за поща:

> java com.lotontech.mail.SimpleSender smtp.myISP.net [email protected] [email protected] "Здравей" "Само за поздрав." 

И ако работи, в приемащия край ще видите нещо като това, което е показано на фигура 2.

В send(...)метода завършва SimpleSenderкласа. Първо ще покажа кода, след което ще детайлизирам теорията:

/ ** * метод "изпращане" за изпращане на съобщението. * / публично изпращане на статично невалидно (String smtpServer, String to, String from, String subject, String body) {try {Properties props = System.getProperties (); // - Прикачване към сесията по подразбиране, или бихме могли да стартираме нова - props.put ("mail.smtp.host", smtpServer); Сесийна сесия = Session.getDefaultInstance (реквизит, нула); // - Създаване на ново съобщение - Съобщение на съобщение = ново MimeMessage (сесия); // - Задаване на полетата FROM и TO - msg.setFrom (нов InternetAddress (от)); msg.setRecipients (Message.RecipientType.TO, InternetAddress.parse (до, false)); // - Можем да включим и получатели на CC - // if (cc! = Null) // msg.setRecipients (Message.RecipientType.CC //, InternetAddress.parse (cc, false)); // - Задаване на темата и основния текст - msg.setSubject (subject); msg.setText (тяло);// - Задайте друга информация за заглавката - msg.setHeader ("X-Mailer", "LOTONtechEmail"); msg.setSentDate (нова дата ()); // - Изпращане на съобщението - Transport.send (msg); System.out.println („Съобщението е изпратено добре.“); } catch (Изключение ex) {ex.printStackTrace (); }}}

Първо, забележете, че получавате пощенска сесия ( java.mail.Session), без която не можете да направите нищо. В този случай се обаждате, за Session.getDefaultInstance(...)да получите споделена сесия, която други настолни приложения могат да използват повторно; можете също да настроите изцяло нова сесия - чрез Session.getInstance(...)метода - която би била уникална за вашето приложение. Последното може да се окаже важно за имейл клиенти, които не са изолирани за всеки потребител, като уеб базирана система за електронна поща, реализирана със сървлети.

Създаването на сесия изисква да зададете определени свойства; минимумът ви е необходим, mail.smtp.hostако изпращате съобщения чрез SMTP. Ще намерите други свойства, описани в документацията за API.

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

Накрая изпращате съобщението чрез javax.mail.Transportкласа. Ако се чудите откъде знае за нашата пощенска сесия, погледнете назад към конструктора на съобщението.

Не само обикновен текст

В setText(...)метода удобство в клас javax.mail.Message(наследен от javax.mail.Partинтерфейса) определя съдържанието на съобщението за предоставения низ и определя MIME типа на text/plain.

Въпреки това не сте ограничени до обикновен текст: можете да изпращате други типове съдържание чрез setDataHandler(...)метода. В повечето случаи можете да приемате „други типове съдържание“ като прикачени файлове, като документи на Word, но за нещо малко по-интересно проверете този код за изпращане на Java сериализиран обект:

ByteArrayOutputStream byteStream = нов ByteArrayOutputStream (); ObjectOutputStream objectStream = нов ObjectOutputStream (byteStream); objectStream.writeObject (theObject); msg.setDataHandler (нов DataHandler (нов ByteArrayDataSource (byteStream.toByteArray (), "lotontech / javaobject"))));

Няма да намерите DataHandlerкласа в javax.mail.*структурата на пакета, защото той принадлежи към пакета за активиране на JavaBeans (JAF) javax.activation. Не забравяйте, че сте изтеглили JAF дистрибуцията, както и JavaMail. JAF предоставя механизъм за обработка на типизирано съдържание на данни, което за интернет съдържание означава MIME типове.

И ако наистина опитате кода по-горе за изпращане на Java обект по имейл, ще имате проблеми с намирането на ByteArrayDataSourceкласа, тъй като нито го включвате, mail.jarнито activation.jarго включвате. Опитайте да погледнете демо директорията на JavaMail!

Що се отнася до тези прикачени файлове, от които е по-вероятно да се интересувате първоначално, бихте създали javax.activation.FileDataSourceекземпляр в DataHandlerконструктора на. Разбира се, няма вероятност да изпратите файл сами; по-скоро вероятно ще бъде прикачен файл към текстово съобщение. За това трябва да разберете концепцията за многочастни съобщения, така че ще я въведа сега в контекста на получаване на имейл.

Получавайте имейл чрез POP3

По-рано представих javax.mail.Partинтерфейса, изпълнен от javax.mail.Message. Сега ще обясня неговите части за съобщения, които са важни в този пример. За начало погледнете фигура 3.

Figure 3 shows a Message as created in the previous example that is both a message and message part, because it implements the Part interface. For any part, you can get its content (any Java object), and, in the case of a simple text message, the content object may be a String. For a multipart message, the content will be of type Multipart, from which we can get hold of the individual body parts, which themselves implement the Part interface.

In practice, all will become apparent as you step through the code for a SimpleReceiver class, which I'll present in three sections: first, the class definition and the main(...) method that takes connection details from the command line; second, the receive(...) method that captures and steps through the incoming messages; and finally, the printMessage(...) method that prints the header information and content of each message.

Here's the first section:

package com.lotontech.mail; import javax.mail.*; import javax.mail.internet.*; import java.util.*; import java.io.*; /** * A simple email receiver class. */ public class SimpleReceiver { /** * Main method to receive messages from the mail server specified * as command line arguments. */ public static void main(String args[]) { try { String popServer=args[0]; String popUser=args[1]; String popPassword=args[2]; receive(popServer, popUser, popPassword); } catch (Exception ex) { System.out.println("Usage: java com.lotontech.mail.SimpleReceiver" +" popServer popUser popPassword"); } System.exit(0); } 

I'll take you through a proper test drive later, but for now here is the command line to run it (remember to replace the command arguments with your mail settings):

> java com.lotontech.mail.SimpleReceiver pop.myIsp.net myUserName myPassword 

The receive(...) method -- called from main(...) -- opens your POP3 INBOX and steps through the messages in turn, each time calling printMessage(...). Here is the code:

 /** * "receive" method to fetch messages and process them. */ public static void receive(String popServer, String popUser , String popPassword) { Store store=null; Folder folder=null; try { // -- Get hold of the default session -- Properties props = System.getProperties(); Session session = Session.getDefaultInstance(props, null); // -- Get hold of a POP3 message store, and connect to it -- store = session.getStore("pop3"); store.connect(popServer, popUser, popPassword); // -- Try to get hold of the default folder -- folder = store.getDefaultFolder(); if (folder == null) throw new Exception("No default folder"); // -- ...and its INBOX -- folder = folder.getFolder("INBOX"); if (folder == null) throw new Exception("No POP3 INBOX"); // -- Open the folder for read only -- folder.open(Folder.READ_ONLY); // -- Get the message wrappers and process them -- Message[] msgs = folder.getMessages(); for (int msgNum = 0; msgNum < msgs.length; msgNum++) { printMessage(msgs[msgNum]); } } catch (Exception ex) { ex.printStackTrace(); } finally { // -- Close down nicely -- try { if (folder!=null) folder.close(false); if (store!=null) store.close(); } catch (Exception ex2) {ex2.printStackTrace();} } } 

Notice that you're obtaining a POP3 message-store wrapper from the session, then connecting to it using the mail settings originally supplied on the command line.

Once connected, you get a handle on the default folder -- effectively the root of the folder tree -- and, from there, the INBOX folder that holds the inbound messages. You open the INBOX for read-only access; you get hold of the messages and step through them one by one.

As an aside, you might wonder if you would ever want to open the INBOX for write access. You would if you intended to mark the messages as received and/or remove them from the server. In our example, you're only looking at them.

И накрая, в горния код се грижите да затворите папката и хранилището за съобщения, когато приключите, което оставя само printMessage(...)метода за завършване на този клас.

Отпечатайте съобщенията

В този раздел по-ранното javax.mail.Partобсъждане на интерфейса става актуално.