Programmering

JavaMail rask start

I JavaMail finner du APIer og leverandørimplementeringer som lar deg utvikle fullt funksjonelle e-postklientapplikasjoner. "E-postklientapplikasjoner" påkaller tanker om Microsoft Outlook; og ja, du kan skrive din egen Outlook-erstatning. Men en e-postklient trenger ikke å bo på en klientmaskin i det hele tatt. Det kan faktisk være en servlet eller en EJB som kjører på en ekstern server, og gir sluttbrukernes tilgang til e-post via en nettleser. Tenk på Hotmail (ja, du kan også skrive din egen versjon av Hotmail). Eller du kan unngå et brukergrensesnitt helt. Hva med en autosvar som leser innkommende meldinger og sender svar, tilpasset i henhold til den opprinnelige avsenderen?

I mitt eget kjæledyrprosjekt leser en snakkende e-postklient - det vil si snakker - innkommende meldinger. Den er basert på en forbedring av en idé jeg introduserte i "Talking Java!" Jeg forteller deg mer om det senere.

For nå, start med å installere og konfigurere JavaMail-programvaren.

Oppsett

Hvis du bruker Java 2 Platform, Enterprise Edition (J2EE) 1.3, har du flaks: den inkluderer JavaMail, så det kreves ingen ekstra oppsett. Hvis du imidlertid kjører Java 2 Platform, Standard Edition (J2SE) 1.1.7 og oppover, og du vil ha e-postfunksjonalitet for applikasjonene dine, kan du laste ned og installere følgende:

  • JavaMail
  • JavaBeans Activation Framework

For å installere pakker du bare ut de nedlastede filene og legger til de inneholdte jar-filene på klassestien din. Som et eksempel, her er klassestien min for dette prosjektet:

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

De mailapi.jar filen inneholder de viktigste API-klassene, mens pop3.jar og smtp.jar filer inneholder leverandørimplementeringene for de respektive postprotokollene. (Vi bruker ikke imap.jar fil i denne artikkelen.) Tenk på leverandørimplementeringene som ligner på JDBC-drivere (Java Database Connectivity), men for meldingssystemer i stedet for databaser. Når det gjelder mail.jar filen inneholder den hver av de ovennevnte jar-filene, slik at du kan begrense klassestien din til bare mail.jar og aktivering.jar filer.

De aktivering.jar filen lar deg håndtere MIME-typer (Multipurpose Internet Mail Extensions) som er tilgjengelige via binære datastrømmer. Se etter DataHandler klasse i Ikke bare vanlig tekst delen senere.

For ordens skyld tilbyr ikke resten av denne artikkelen omfattende API-dekning; heller vil du lære ved å gjøre. Hvis det er grundig API-informasjon du leter etter, kan du se på PDF-filene og Javadoc-ene som er inkludert i de respektive nedlastingspakker.

Når du har installert programvaren, må du få detaljer om e-postkontoer for å kjøre eksemplene som følger. Du trenger Internett-leverandørens SMTP (Simple Mail Transfer Protocol) servernavn og POP (Post Office Protocol) servernavn, påloggingsnavnet for e-postkontoen og postkassepassordet ditt. Figur 1 viser detaljene mine - ikke de virkelige, forstår du - slik de brukes av Microsoft Outlook.

Sender e-post via SMTP

Det første eksemplet viser hvordan du sender en grunnleggende e-postmelding via SMTP. Nedenfor finner du SimpleSender klasse, som tar meldingens detaljer fra kommandolinjen og kaller en egen metode - sende(...) - for å sende den:

pakke com.lotontech.mail; importere javax.mail. *; importere javax.mail.internet. *; importer java.util. *; / ** * En enkel senderklasse for e-post. * / public class SimpleSender {/ ** * Hovedmetode for å sende en melding gitt 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, kropp); } catch (Exception ex) {System.out.println ("Bruk: java com.lotontech.mail.SimpleSender" + "smtpServer toAddress fromAddress subjectText bodyText"); } System.exit (0); } 

Neste, løp SimpleSender som Nedenfor. Erstatte smtp.myISP.net med din egen SMTP-server, som avledet av e-postinnstillingene dine:

> java com.lotontech.mail.SimpleSender smtp.myISP.net [email protected] [email protected] "Hallo" "Bare for å si hei." 

Og hvis det fungerer, vil du i mottakersiden se noe som det som er vist i figur 2.

De sende(...) metoden fullfører SimpleSender klasse. Jeg skal vise koden først, så detaljere teorien:

 / ** * "send" -metode for å sende meldingen. * / public static void send (String smtpServer, String to, String from, String subject, String body) {try {Properties props = System.getProperties (); // - Vedlegg til standardøkt, eller vi kan starte en ny - props.put ("mail.smtp.host", smtpServer); Sessionsøkt = Session.getDefaultInstance (rekvisitter, null); // - Opprett en ny melding - Melding msg = ny MimeMessage (økt); // - Sett FROM og TO feltene - msg.setFrom (ny InternetAddress (fra)); msg.setRecipients (Message.RecipientType.TO, InternetAddress.parse (to, false)); // - Vi kan også inkludere CC-mottakere - // if (cc! = Null) // msg.setRecipients (Message.RecipientType.CC //, InternetAddress.parse (cc, false)); // - Angi emne og brødtekst - msg.setSubject (subject); msg.setText (body); // - Angi annen topptekstinformasjon - msg.setHeader ("X-Mailer", "LOTONtechEmail"); msg.setSentDate (ny dato ()); // - Send meldingen - Transport.send (msg); System.out.println ("Melding sendt OK."); } fange (Unntak ex) {ex.printStackTrace (); }}} 

Legg først merke til at du får en e-postøkt (java.mail. sesjon), uten hvilken du ikke kan gjøre noe. I dette tilfellet ringer du Session.getDefaultInstance (...) for å få en delt økt, som andre stasjonære applikasjoner kan bruke på nytt; Du kan også sette opp en helt ny økt - via Session.getInstance (...) metode - det ville være unikt for applikasjonen din. Sistnevnte kan vise seg å være viktig for e-postklienter som ikke er isolert per bruker, for eksempel et webbasert e-postsystem implementert med servlets.

Å etablere en økt krever at du angir visse egenskaper; i det minste trenger du mail.smtp.host eiendom hvis du sender meldinger via SMTP. Du finner andre egenskaper beskrevet i API-dokumentasjonen.

Når du har en økt, kan du opprette en melding. I dette eksemplet setter du meldingen fra og til e-postadresser, Emne, og kropp tekst, alt hentet opprinnelig fra kommandolinjen. Du setter også inn litt topptekstinformasjon, inkludert dato, og du kan spesifisere cc mottakere hvis du vil.

Til slutt sender du meldingen via javax.mail.Transport klasse. Hvis du lurer på hvordan den vet om e-postøkten vår, kan du se tilbake på meldingens konstruktør.

Ikke bare ren tekst

De setText (...) praktisk metode i klassen javax.mail. melding (arvet fra javax.mail. del grensesnitt) setter meldingsinnholdet til den medfølgende strengen og setter MIME-typen til tekst / vanlig.

Du er ikke begrenset til ren tekst, skjønt: du kan sende andre innholdstyper via setDataHandler (...) metode. I de fleste tilfeller kan du ta "andre innholdstyper" til å bety filvedlegg, for eksempel Word-dokumenter, men for noe litt mer interessant, sjekk ut denne koden for å sende et Java-seriell objekt:

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

Du finner ikke DataHandler klasse innen javax.mail. * pakkestruktur fordi den tilhører JavaBeans Activation Framework (JAF) -pakken javax. aktivering. Husk at du lastet ned JAF-distribusjonen samt JavaMail. JAF gir en mekanisme for håndtering skrevet datainnhold, som for Internett-innhold betyr MIME-typer.

Og hvis du virkelig prøver koden ovenfor for å sende et Java-objekt via e-post, har du problemer med å finne ByteArrayDataSource klasse, som ingen av dem mail.jar heller ikke aktivering.jar inkluderer det. Prøv å se i JavaMail-demo-katalogen!

Når det gjelder de filvedleggene som du er mer sannsynlig å være interessert i, ville du lage et javax.activation.FileDataSource eksempel i DataHandlersin konstruktør. Selvfølgelig vil du sannsynligvis ikke sende en fil alene; heller vil det sannsynligvis være et vedlegg til en tekstmelding. For det må du forstå begrepet flerdelt meldinger, så jeg introduserer det konseptet nå, i sammenheng med å motta e-post.

Motta e-post via POP3

Tidligere introduserte jeg javax.mail. del grensesnitt implementert av javax.mail.Melding. Jeg forklarer nå meldingsdelene, som er viktige i dette eksemplet. For å starte, ta en titt på figur 3.

Figur 3 viser a Beskjed som opprettet i forrige eksempel som både er en melding og en melding, fordi den implementerer Del grensesnitt. For hvilken som helst del kan du få innholdet (hvilket som helst Java-objekt), og i tilfelle en enkel tekstmelding kan innholdsobjektet være et String. For en flerdelt melding vil innholdet være av typen Flerdelt, hvorfra vi kan få tak i de enkelte kroppsdelene, som selv implementerer Del grensesnitt.

I praksis vil alt bli tydelig når du går gjennom koden for en Enkel mottaker klasse, som jeg vil presentere i tre seksjoner: først, klassedefinisjonen og hoved(...) metode som tar tilkoblingsdetaljer fra kommandolinjen; andre, den motta(...) metode som fanger og går gjennom innkommende meldinger; og til slutt, printMessage (...) metode som skriver ut topptekstinformasjonen og innholdet i hver melding.

Her er den første delen:

pakke com.lotontech.mail; importere javax.mail. *; importere javax.mail.internet. *; importer java.util. *; importer java.io. *; / ** * En enkel e-postmottakerklasse. * / public class SimpleReceiver {/ ** * Hovedmetode for å motta meldinger fra spesifisert e-postserver * som kommandolinjeargumenter. * / public static void main (String args []) {try {String popServer = args [0]; String popUser = args [1]; Streng popPassword = args [2]; motta (popServer, popUser, popPassword); } fange (Unntak ex) {System.out.println ("Bruk: java com.lotontech.mail.SimpleReceiver" + "popServer popUser popPassword"); } System.exit (0); } 

Jeg tar deg gjennom en skikkelig testkjøring senere, men for nå er her kommandolinjen for å kjøre den (husk å erstatte kommandoargumentene med e-postinnstillingene dine):

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

De motta(...) metode - kalt fra hoved(...) - åpner POP3-innboksen og går gjennom meldingene hver gang du ringer printMessage (...). Her er koden:

 / ** * "motta" metode for å hente meldinger og behandle dem. * / offentlig statisk ugyldig mottakelse (String popServer, String popUser, String popPassword) {Store store = null; Mappemappe = null; prøv {// - Få tak i standardøkten - Egenskaper rekvisitter = System.getProperties (); Sessionsøkt = Session.getDefaultInstance (rekvisitter, null); // - Få tak i en POP3-meldingsbutikk, og koble til den - store = session.getStore ("pop3"); store.connect (popServer, popUser, popPassword); // - Prøv å få tak i standardmappen - folder = store.getDefaultFolder (); hvis (mappe == null) kaster nytt unntak ("Ingen standardmappe"); // - ... og dens INBOX - folder = folder.getFolder ("INBOX"); hvis (mappe == null) kaster nytt unntak ("No POP3 INBOX"); // - Åpne mappen for skrivebeskyttet - folder.open (Folder.READ_ONLY); // - Få meldingsinnpakningene og behandle dem - Message [] msgs = folder.getMessages (); for (int msgNum = 0; msgNum <msgs.length; msgNum ++) {printMessage (msgs [msgNum]); }} fange (Unntak ex) {ex.printStackTrace (); } til slutt {// - Lukk pent - prøv {if (folder! = null) folder.close (false); hvis (store! = null) store.close (); } fange (Unntak ex2) {ex2.printStackTrace ();}}} 

Legg merke til at du får en POP3-innpakning for meldingsbutikk fra økten, og deretter kobler du til den ved hjelp av e-postinnstillingene som opprinnelig ble gitt på kommandolinjen.

Når du er koblet til, får du tak i standardmappen - effektivt roten til mappetreet - og derfra innboksen som inneholder de innkommende meldingene. Du åpner innboksen for skrivebeskyttet tilgang; du får tak i meldingene og går gjennom dem en etter en.

Som en side, kan du lure på om du noen gang ønsker å åpne innboksen for skrive adgang. Det ville du gjort hvis du hadde tenkt å merke meldingene som mottatt og / eller fjerne dem fra serveren. I vårt eksempel ser du bare på dem.

Til slutt, i koden ovenfor, passer du på å lukke mappen og meldingsbutikken når du er ferdig, som bare etterlater printMessage (...) metode for å fullføre denne klassen.

Skriv ut meldingene

I denne delen, den tidligere javax.mail. del grensesnitt diskusjon blir relevant.

$config[zx-auto] not found$config[zx-overlay] not found