Programmering

JavaMail hurtig start

I JavaMail finder du API'er og implementeringsudbydere, så du kan udvikle fuldt funktionelle e-mail-klientapplikationer. "E-mail-klientapplikationer" påberåber tanker om Microsoft Outlook; og ja, du kan skrive din egen Outlook-erstatning. Men en e-mail-klient behøver slet ikke at være på en klientmaskine. Faktisk kan det være en servlet eller en EJB, der kører på en ekstern server, der giver slutbrugeradgang til e-mail via en webbrowser. Tænk på Hotmail (ja, du kan også skrive din egen version af Hotmail). Eller du kan helt undgå en brugergrænseflade. Hvad med en autosvar, der læser indgående beskeder og sender svar, tilpasset i henhold til den oprindelige afsender?

I mit eget kæledyrsprojekt læser en talende e-mail-klient - det vil sige taler - indgående beskeder. Det er baseret på en forbedring af en idé, jeg introducerede i "Talking Java!" Jeg fortæller dig mere om det senere.

Start nu med at installere og konfigurere JavaMail-softwaren.

Opsætning

Hvis du bruger Java 2 Platform, Enterprise Edition (J2EE) 1.3, har du held og lykke: det inkluderer JavaMail, så der kræves ingen yderligere opsætning. Hvis du imidlertid kører Java 2 Platform, Standard Edition (J2SE) 1.1.7 og opefter, og du vil have e-mail-kapacitet til dine applikationer, skal du downloade og installere følgende:

  • JavaMail
  • JavaBeans Activation Framework

For at installere skal du blot pakke de downloadede filer ud og tilføje de indeholdte jar-filer til din klassesti. Som et eksempel er her min klassesti til dette 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: \ Apps \ Java \ javamail-1.2 \ smtp.jar; C: \ Apps \ Java \ jaf-1.0.1 \ aktivering.jar 

Det mailapi.jar filen indeholder de centrale API-klasser, mens pop3.jar og smtp.jar filer indeholder udbyderimplementeringer for de respektive mailprotokoller. (Vi bruger ikke imap.jar fil i denne artikel.) Tænk på udbyderimplementeringer, der ligner JDBC-drivere (Java Database Connectivity), men til messaging-systemer snarere end databaser. hvad angår mail.jar fil, den indeholder hver af de ovennævnte jar-filer, så du kan begrænse din klassesti til bare mail.jar og aktivering.jar filer.

Det aktivering.jar -fil giver dig mulighed for at håndtere MIME-typer (Multipurpose Internet Mail Extensions), der er tilgængelige via binære datastrømme. Se efter DataHandler klasse i Ikke bare almindelig tekst sektion senere.

For ordens skyld tilbyder resten af ​​denne artikel ikke omfattende API-dækning; snarere vil du lære ved at gøre. Hvis det er dybdegående API-oplysninger, du leder efter, skal du se på PDF-filer og Javadocs inkluderet i de respektive downloadbunker.

Når du har installeret softwaren, skal du få e-mail-kontooplysninger for at køre de følgende eksempler. Du skal bruge din internetudbyders SMTP (Simple Mail Transfer Protocol) servernavn og POP (Post Office Protocol) servernavn, dit e-mail-loginnavn og din mailboksadgangskode. Figur 1 viser mine detaljer - ikke de rigtige, forstår du - som brugt af Microsoft Outlook.

Afsendelse af e-mail via SMTP

Det første eksempel viser, hvordan du sender en grundlæggende e-mail-besked via SMTP. Nedenfor finder du SimpleSender klasse, der tager din meddelelses detaljer fra kommandolinjen og kalder en separat metode - sende(...) - at sende det:

pakke com.lotontech.mail; import javax.mail. *; import javax.mail.internet. *; importer java.util. *; / ** * En simpel e-mail-afsenderklasse. * / public class SimpleSender {/ ** * Hovedmetode til at sende en besked på kommandolinjen. * / public static void main (String args []) {try {String smtpServer = args [0]; Streng til = args [1]; Streng fra = args [2]; Strengemne = args [3]; Strenglegeme = args [4]; send (smtpServer, til, fra, emne, krop); } catch (Exception ex) {System.out.println ("Usage: java com.lotontech.mail.SimpleSender" + "smtpServer toAddress fromAddress subjectText bodyText"); } System.exit (0); } 

Kør derefter SimpleSender som nedenfor. Erstatte smtp.myISP.net med din egen SMTP-server som afledt af dine mailindstillinger:

> java com.lotontech.mail.SimpleSender smtp.myISP.net [email protected] [email protected] "Hej" "Bare for at sige Hej." 

Og hvis det virker, i den modtagende ende kan du se noget som det, der er vist i figur 2.

Det sende(...) metoden fuldender SimpleSender klasse. Jeg viser koden først og beskriver derefter teorien:

 / ** * "send" metode til at sende beskeden. * / public static void send (String smtpServer, String to, String from, String subject, String body) {prøv {Properties props = System.getProperties (); // - Vedhæftning til standardsession, eller vi kunne starte en ny - props.put ("mail.smtp.host", smtpServer); Session session = Session.getDefaultInstance (rekvisitter, null); // - Opret en ny besked - Besked msg = ny MimeMessage (session); // - Indstil FROM- og TO-felterne - msg.setFrom (ny InternetAddress (fra)); msg.setRecipients (Message.RecipientType.TO, InternetAddress.parse (to, false)); // - Vi kunne også inkludere CC-modtagere - // if (cc! = Null) // msg.setRecipients (Message.RecipientType.CC //, InternetAddress.parse (cc, false)); // - Indstil emne og brødtekst - msg.setSubject (emne); msg.setText (body); // - Indstil nogle andre headeroplysninger - msg.setHeader ("X-Mailer", "LOTONtechEmail"); msg.setSentDate (ny dato ()); // - Send beskeden - Transport.send (msg); System.out.println ("Besked sendt OK."); } fange (Undtagelse ex) {ex.printStackTrace (); }}} 

Bemærk først, at du får en mailsession (java.mail.Session), uden hvilken du ikke kan gøre noget. I dette tilfælde ringer du Session.getDefaultInstance (...) for at få en delt session, som andre desktop-applikationer kan genbruge; du kan også oprette en helt ny session - via Session.getInstance (...) metode - det ville være unikt for din applikation. Sidstnævnte kan vise sig at være vigtig for e-mail-klienter, der ikke er isoleret pr. Bruger, såsom et webbaseret e-mail-system implementeret med servlets.

Etablering af en session kræver, at du indstiller bestemte egenskaber; i det mindste har du brug for mail.smtp.host ejendom, hvis du sender beskeder via SMTP. Du finder andre egenskaber beskrevet i API-dokumentationen.

Når du har en session, skal du oprette en besked. I dette eksempel indstiller du beskedens fra og til e-mail-adresser emne, og legeme tekst, alt taget oprindeligt fra kommandolinjen. Du indstiller også nogle overskriftsoplysninger, inklusive datoen, og du kan angive cc modtagere, hvis du vil.

Endelig sender du beskeden via javax.mail.Transport klasse. Hvis du spekulerer på, hvordan den ved om vores mailsession, skal du se tilbage på meddelelsens konstruktør.

Ikke bare almindelig tekst

Det setText (...) bekvemmelighed metode i klassen javax.mail.Meddelelse (arvet fra javax.mail. del interface) indstiller meddelelsesindholdet til den medfølgende streng og indstiller MIME-typen til tekst / almindelig.

Du er dog ikke begrænset til almindelig tekst: du kan sende andre indholdstyper via setDataHandler (...) metode. I de fleste tilfælde kan du tage "andre indholdstyper" til at betyde filvedhæftninger, såsom Word-dokumenter, men for noget lidt mere interessant, tjek denne kode for at sende et Java-seriel objekt:

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

Du finder ikke DataHandler klasse inden for javax.mail. * pakkestruktur, fordi den hører til JavaBeans Activation Framework (JAF) -pakken javax. aktivering. Husk, du downloadede JAF-distributionen samt JavaMail. JAF giver en mekanisme til håndtering skrevet dataindhold, som for internetindhold betyder MIME-typer.

Og hvis du virkelig prøver koden ovenfor for at sende et Java-objekt via e-mail, har du problemer med at finde ByteArrayDataSource klasse, som ingen af ​​dem mail.jar heller ikke aktivering.jar inkluderer det. Prøv at kigge i JavaMail-demo-biblioteket!

Med hensyn til de vedhæftede filer, som du mere sandsynligt er interesseret i oprindeligt, opretter du en javax.activation.FileDataSource eksempel i DataHandlers konstruktør. Selvfølgelig vil du sandsynligvis ikke sende en fil alene; snarere vil det sandsynligvis være en vedhæftet fil til en tekstbesked. Til det er du nødt til at forstå begrebet multipart-meddelelser, så jeg introducerer dette koncept nu i forbindelse med modtagelse af e-mail.

Modtag e-mail via POP3

Tidligere introducerede jeg javax.mail. del interface implementeret af javax.mail.Meddelelse. Jeg forklarer nu dens meddelelsesdele, som er vigtige i dette eksempel. For at starte skal du se på figur 3.

Figur 3 viser a Besked som oprettet i det foregående eksempel, der både er en meddelelses- og meddelelsesdel, fordi den implementerer En del interface. For enhver del kan du hente dets indhold (ethvert Java-objekt), og i tilfælde af en simpel tekstbesked kan indholdsobjektet være et Snor. For en meddelelse med flere dele er indholdet af typen Multipart, hvorfra vi kan få fat i de enkelte kropsdele, som selv implementerer En del interface.

I praksis vil alt blive tydeligt, når du går igennem koden for en Enkel modtager klasse, som jeg præsenterer i tre sektioner: For det første klassedefinitionen og vigtigste (...) metode, der tager forbindelsesoplysninger fra kommandolinjen; for det andet modtage(...) metode, der fanger og gennemgår de indgående meddelelser; og til sidst printMessage (...) metode, der udskriver headerinformation og indhold af hver besked.

Her er det første afsnit:

pakke com.lotontech.mail; import javax.mail. *; import javax.mail.internet. *; importer java.util. *; import java.io. *; / ** * En simpel e-mail-modtager klasse. * / public class SimpleReceiver {/ ** * Hovedmetode til at modtage meddelelser fra den specificerede mailserver * som kommandolinjeargumenter. * / public static void main (String args []) {try {String popServer = args [0]; Streng popUser = args [1]; Streng popPassword = args [2]; modtage (popServer, popUser, popPassword); } fange (Undtagelse ex) {System.out.println ("Brug: java com.lotontech.mail.SimpleReceiver" + "popServer popUser popPassword"); } System.exit (0); } 

Jeg tager dig igennem et ordentligt testdrev senere, men for nu er her kommandolinjen til at køre den (husk at udskifte kommandoargumenterne med dine mailindstillinger):

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

Det modtage(...) metode - kaldet fra vigtigste (...) - åbner din POP3 INBOX og går gennem beskederne igen, hver gang du ringer printMessage (...). Her er koden:

 / ** * "modtag" metode til at hente beskeder og behandle dem. * / offentlig statisk ugyldig modtagelse (String popServer, String popUser, String popPassword) {Store store = null; Folder folder = null; prøv {// - Få fat i standardsessionen - Egenskaber rekvisitter = System.getProperties (); Session session = Session.getDefaultInstance (rekvisitter, null); // - Få fat i en POP3-meddelelsesbutik, og opret forbindelse til den - store = session.getStore ("pop3"); store.connect (popServer, popUser, popPassword); // - Prøv at få fat i standardmappen - folder = store.getDefaultFolder (); hvis (mappe == null) smider ny undtagelse ("Ingen standardmappe"); // - ... og dens INBOX - folder = folder.getFolder ("INBOX"); hvis (mappe == null) smider ny undtagelse ("Ingen POP3 INBOX"); // - Åbn mappen til skrivebeskyttet - folder.open (Folder.READ_ONLY); // - Hent beskedindpakningerne og behandle dem - Besked [] msgs = folder.getMessages (); for (int msgNum = 0; msgNum <msgs.length; msgNum ++) {printMessage (msgs [msgNum]); }} fange (Undtagelse ex) {ex.printStackTrace (); } endelig {// - Luk pænt - prøv {if (folder! = null) folder.close (false); hvis (store! = null) store.close (); } fange (Undtagelse ex2) {ex2.printStackTrace ();}}} 

Bemærk, at du henter en POP3-meddelelsesbutikindpakning fra sessionen og derefter opretter forbindelse til den ved hjælp af de mailindstillinger, der oprindeligt blev leveret på kommandolinjen.

Når du er tilsluttet, får du hånd om standardmappen - effektivt roden til mappetræet - og derfra den INBOX-mappe, der indeholder de indgående meddelelser. Du åbner indbakken for skrivebeskyttet adgang; du får fat i beskederne og træder igennem dem en efter en.

Som en side, kan du måske spekulerer på, om du nogensinde vil åbne INBOX til skrive adgang. Det ville du gøre, hvis du havde til hensigt at markere meddelelserne som modtagne og / eller fjerne dem fra serveren. I vores eksempel ser du kun på dem.

Endelig skal du i koden ovenfor passe på at lukke mappen og meddelelseslageret, når du er færdig, hvilket kun efterlader printMessage (...) metode til at gennemføre denne klasse.

Udskriv beskederne

I dette afsnit, jo tidligere javax.mail. del interface diskussion bliver relevant.