JavaMail brzi početak

U JavaMailu pronaći ćete API-je i implementacije dobavljača koji vam omogućavaju da razvijete potpuno funkcionalne klijentske aplikacije e-pošte. "Klijentske aplikacije e-pošte" pozivaju se na Microsoft Outlook; i, da, mogli biste sami napisati zamjenu za Outlook. Ali klijent e-pošte uopće ne mora boraviti na klijentskom stroju. Zapravo, to bi mogao biti servlet ili EJB pokrenut na udaljenom poslužitelju, pružajući krajnjim korisnicima pristup e-pošti putem web preglednika. Razmislite o Hotmailu (da, mogli biste napisati i svoju verziju Hotmaila). Ili biste mogli potpuno izbjeći korisničko sučelje. Što kažete na automatski odgovor koji čita dolazne poruke i šalje odgovore, prilagođene izvornom pošiljatelju?

U mom vlastitom projektu za kućne ljubimce klijent e-pošte koji govori čita - odnosno govori - dolazne poruke. Temelji se na usavršavanju ideje koju sam uveo u "Talking Java!" O tome ću vam reći kasnije.

Za sada počnite s instaliranjem i konfiguriranjem softvera JavaMail.

Postaviti

Ako koristite Java 2 Platform, Enterprise Edition (J2EE) 1.3, imate sreće: uključuje JavaMail, pa nije potrebno dodatno postavljanje. Ako, međutim, koristite Java 2 Platform, Standard Edition (J2SE) 1.1.7 i novije verzije i želite za svoje aplikacije mogućnost e-pošte, preuzmite i instalirajte sljedeće:

  • JavaMail
  • JavaBeans Activation Framework

Da biste instalirali, jednostavno otpakirajte preuzete datoteke i dodajte sadržane jar datoteke u svoj put predavanja. Kao primjer, evo moje staze za ovaj projekt:

.; 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: \ Aplikacije \ Java \ javamail-1.2 \ smtp.jar; C: \ Apps \ Java \ jaf-1.0.1 \ activation.jar 

mailapi.jarDatoteka sadrži osnovne API klase, dok su pop3.jarte smtp.jardatoteke sadrže pružateljem implementacije za odgovarajućim protokolima pošte. (Nećemo koristiti imap.jardatoteku u ovom članku.) Zamislite da su implementacije dobavljača slične upravljačkim programima JDBC (Java Database Connectivity), ali za sustave za razmjenu poruka, a ne za baze podataka. Što se tiče mail.jardatoteku, ona sadrži svaki od navedenih jar datoteke, tako da bi mogao ograničiti CLASSPATH se samo na mail.jarte activation.jardatoteke.

activation.jarDatoteka omogućuje da obrađuju MIME (Multipurpose Internet Mail Extensions) vrste dostupne preko binarnih podataka potoci. Potražite DataHandlerrazred kasnije u odjeljku Ne samo običan tekst .

Da zabilježimo, ostatak ovog članka ne nudi sveobuhvatnu pokrivenost API-jem; nego ćete učiti radeći. Ako se radi o detaljnim informacijama o API-ju, pogledajte PDF datoteke i Javadocs koji su uključeni u odgovarajuće pakete za preuzimanje.

Nakon što instalirate softver, morate dobiti detalje računa e-pošte da biste pokrenuli primjere koji slijede. Trebat će vam ime poslužitelja SMTP (Simple Mail Transfer Protocol) i naziv poslužitelja POP (Post Office Protocol), ime za prijavu na vaš račun e-pošte i lozinka vašeg poštanskog sandučića. Na slici 1. prikazani su moji detalji - ne oni stvarni, razumijete - kako ih koristi Microsoft Outlook.

Slanje e-pošte putem SMTP-a

Prvi primjer pokazuje kako poslati osnovnu e-poruku putem SMTP-a. Ispod ćete pronaći SimpleSenderklasu koja uzima detalje vaše poruke iz naredbenog retka i poziva zasebnu metodu - send(...)- da bi je poslala:

paket com.lotontech.mail; uvoz javax.mail. *; uvoz javax.mail.internet. *; uvoz java.util. *; / ** * Jednostavna klasa pošiljatelja e-pošte. * / public class SimpleSender {/ ** * Glavna metoda za slanje poruke zadane u naredbenom retku. * / public static void main (String args []) {try {String smtpServer = args [0]; Niz do = args [1]; Niz iz = args [2]; Niz predmeta = argumenti [3]; Tijelo niza = args [4]; poslati (smtpServer, do, od, subjekta, tijela); } catch (Iznimka ex) {System.out.println ("Upotreba: java com.lotontech.mail.SimpleSender" + "smtpServer toAddress fromAddress subjectText bodyText"); } System.exit (0); }

Zatim pokrenite SimpleSenderkao dolje. Zamijenite smtp.myISP.netvlastitim SMTP poslužiteljem, kako je izvedeno iz vaših postavki pošte:

> java com.lotontech.mail.SimpleSender smtp.myISP.net [email protected] [email protected] "Hello" "Just to say Hello." 

I, ako uspije, na kraju primanja vidjet ćete nešto poput onoga što je prikazano na slici 2.

send(...)Metoda upotpunjuje SimpleSenderklase. Prvo ću pokazati kod, a zatim detaljno objasniti teoriju:

/ ** * metoda "pošalji" za slanje poruke. * / public static void send (String smtpServer, String to, String from, String subject, String body) {try {Svojstva props = System.getProperties (); // - Priključivanje na zadanu sesiju ili bismo mogli pokrenuti novu - props.put ("mail.smtp.host", smtpServer); Sjednica sesije = Session.getDefaultInstance (rekviziti, null); // - Stvaranje nove poruke - Poruka poruke = nova MimeMessage (sesija); // - Postavite polja FROM i TO - msg.setFrom (nova Internet adresa (od)); msg.setRecipients (Message.RecipientType.TO, InternetAddress.parse (to, false)); // - Mogli bismo uključiti i primatelje CC-a - // if (cc! = Null) // msg.setRecipients (Message.RecipientType.CC //, InternetAddress.parse (cc, false)); // - Postavljanje predmeta i teksta tijela - msg.setSubject (subject); msg.setText (tijelo);// - Postavite neke druge informacije o zaglavlju - msg.setHeader ("X-Mailer", "LOTONtechEmail"); msg.setSentDate (novi datum ()); // - Pošaljite poruku - Transport.send (msg); System.out.println ("Poruka je poslana u redu."); } catch (Iznimka ex) {ex.printStackTrace (); }}}

Prvo primijetite da primate sesiju pošte ( java.mail.Session) bez koje ništa ne možete učiniti. U ovom slučaju zovete Session.getDefaultInstance(...)da biste dobili zajedničku sesiju, koju bi druge stolne aplikacije mogle ponovno upotrijebiti; možete postaviti i potpuno novu sesiju - putem Session.getInstance(...)metode - koja bi bila jedinstvena za vašu aplikaciju. Potonje bi se moglo pokazati važnim za klijente e-pošte koji nisu izolirani po korisniku, kao što je mrežni sustav e-pošte implementiran s servletima.

Uspostavljanje sesije zahtijeva postavljanje određenih svojstava; mail.smtp.hostsvojstvo vam je potrebno najmanje ako šaljete poruke putem SMTP-a. Pronaći ćete i druga svojstva opisana u API dokumentaciji.

Nakon što imate sesiju, stvorite poruku. U ovom primjeru, vi ste postavljanje poruka je iz te do e-mail adrese, na temu, i tijelo teksta, a sve uzima izvorno iz naredbenog retka. Također postavljate neke informacije o zaglavlju, uključujući datum, a ako želite, možete odrediti primatelje kopija .

Napokon, poruku šaljete putem javax.mail.Transportpredavanja. Ako se pitate otkud zna za našu sesiju pošte, osvrnite se na konstruktor poruke.

Ne samo običan tekst

Način setText(...)pogodnosti u klasi javax.mail.Message(naslijeđen od javax.mail.Partsučelja) postavlja sadržaj poruke na isporučeni niz i postavlja tip MIME na text/plain.

Ipak niste ograničeni na običan tekst: putem setDataHandler(...)metode možete slati druge vrste sadržaja . U većini slučajeva možete pod "drugim vrstama sadržaja" podrazumijevati privitke datoteka, poput Wordovih dokumenata, ali za nešto malo zanimljivije pogledajte ovaj kod za slanje Java serijskog objekta:

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

DataHandlerKlasu nećete pronaći u javax.mail.*strukturi paketa jer pripada paketu JavaBeans Activation Framework (JAF) javax.activation. Zapamtite, preuzeli ste JAF distribuciju kao i JavaMail. JAF pruža mehanizam za rukovanje tipkanim sadržajem podataka, što za internetski sadržaj znači MIME vrste.

A ako zaista isprobate gornji kod za slanje Java objekta e-poštom, imat ćete problema s lociranjem ByteArrayDataSourceklase, jer je mail.jarniti activation.jaruključujete. Pokušajte potražiti demo direktorij JavaMail!

Što se tiče privitaka datoteka za koje ćete vjerojatnije biti zainteresirani, stvorili biste javax.activation.FileDataSourceinstancu u DataHandlerkonstruktoru. Naravno, vjerojatno nećete poslati datoteku sami; nego će to vjerojatno biti privitak tekstnoj poruci. Za to morate razumjeti koncept višedijelnih poruka, pa ću ga sada predstaviti u kontekstu primanja e-pošte.

Primite e-poštu putem POP3

Ranije sam predstavio javax.mail.Partsučelje koje je implementirao javax.mail.Message. Sada ću objasniti njegove dijelove poruke koji su važni u ovom primjeru. Za početak pogledajte sliku 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.

Konačno, u gornjem kodu vodite računa da zatvorite mapu i spremište poruka kada završite, što ostavlja samo printMessage(...)metodu za dovršetak ove klase.

Ispišite poruke

U ovom odjeljku javax.mail.Partpostaje relevantna ranija rasprava o sučelju.