Programavimas

Greita „JavaMail“ pradžia

„JavaMail“ rasite API ir teikėjų diegimus, leidžiančius kurti visiškai veikiančias el. Pašto kliento programas. „El. Pašto programos“ sukelia mintis apie „Microsoft Outlook“; ir taip, galite parašyti savo „Outlook“ pakaitalą. Bet el. Pašto klientas visiškai neturi gyventi kliento mašinoje. Iš tiesų, tai gali būti servletas arba EJB, veikiantis nuotoliniame serveryje, suteikiantis galutiniam vartotojui prieigą prie el. Pašto per interneto naršyklę. Pagalvokite apie „Hotmail“ (taip, galėtumėte parašyti ir savo „Hotmail“ versiją). Arba galite visiškai išvengti vartotojo sąsajos. Kaip būtų su automatiniu atsakikliu, kuris skaito gaunamus pranešimus ir siunčia atsakymus, pritaikytus pagal pradinį siuntėją?

Mano paties augintinių projekte kalbantis el. Pašto klientas skaito - tai yra kalba - gaunamus pranešimus. Tai paremta idėjos, kurią pristatiau „Kalbant Java!“, Patobulinimu. Aš jums pasakysiu daugiau apie tai vėliau.

Dabar pradėkite diegdami ir sukonfigūruodami „JavaMail“ programinę įrangą.

Sąranka

Jei naudojate „Java 2 Platform, Enterprise Edition (J2EE) 1.3“, jums pasisekė: jame yra „JavaMail“, todėl nereikia jokių papildomų sąrankų. Vis dėlto, jei naudojate „Java 2 Platform“, „Standard Edition“ (J2SE) 1.1.7 ir naujesnes versijas ir norite savo el. Pašto galimybės, atsisiųskite ir įdiekite šiuos veiksmus:

  • „JavaMail“
  • „JavaBeans“ aktyvinimo sistema

Norėdami įdiegti, paprasčiausiai išpakuokite atsisiųstus failus ir pridėkite esančius „jar“ failus prie savo klasės kelio. Pavyzdžiui, štai mano klasės kelias į šį 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: \ Programos „Java“ javamail-1.2 \ smtp.jar; C: „Apps“ Java “jaf-1.0.1 \ activation.jar 

mailapi.jar faile yra pagrindinės API klasės, o pop3.jar ir smtp.jar failuose yra teikėjo įdiegti atitinkami pašto protokolai. (Mes nenaudosime imap.jar failą šiame straipsnyje.) Pagalvokite apie tiekėjų diegimus, panašius į JDBC („Java Database Connectivity“) tvarkykles, tačiau pranešimų sistemoms, o ne duomenų bazėms. Kalbant apie paštas.jar failą, jame yra visi aukščiau nurodyti failai, todėl galite apriboti savo klasės kelią tik paštas.jar ir aktyvinimas.jar failus.

aktyvinimas.jar failas leidžia tvarkyti MIME (daugiafunkcinius interneto pašto plėtinius), pasiekiamus per dvejetainius duomenų srautus. Ieškokite „DataHandler“ klasėje Ne tik paprastas tekstas skyrių vėliau.

Turime omenyje, kad likusioje šio straipsnio dalyje nėra išsamios API aprėpties; verčiau išmoksi darydamas. Jei tai yra išsami API informacija, kurios ieškote, peržiūrėkite PDF failus ir „Javadocs“, esančius atitinkamuose atsisiuntimo rinkiniuose.

Įdiegę programinę įrangą, turite gauti išsamią el. Pašto paskyros informaciją, kad galėtumėte vykdyti toliau pateiktus pavyzdžius. Jums reikės IPT SMTP (paprasto pašto siuntimo protokolo) serverio pavadinimo ir POP (pašto tarnybos protokolo) serverio pavadinimo, el. Pašto paskyros prisijungimo vardo ir pašto dėžutės slaptažodžio. 1 paveiksle parodytos mano detalės, o ne tikrosios, suprantate, kaip naudoja „Microsoft Outlook“.

Siunčiamas el. Paštas per SMTP

Pirmasis pavyzdys parodo, kaip siųsti pagrindinį el. Laišką per SMTP. Žemiau rasite „SimpleSender“ klasė, kuri ima jūsų pranešimo informaciją iš komandinės eilutės ir iškviečia atskirą metodą - siųsti (...) - išsiųsti:

paketas com.lotontech.mail; importuoti javax.mail. *; importuoti javax.mail.internet. *; importuoti java.util. *; / ** * Paprasta el. Pašto siuntėjų klasė. * / public class SimpleSender {/ ** * Pagrindinis būdas išsiųsti pranešimą, pateiktą komandinėje eilutėje. * / public static void main (String args []) {try {String smtpServer = args [0]; Stygos į = args [1]; Stygos iš = args [2]; Stygos subjektas = args [3]; Styginių kūnas = args [4]; siųsti (smtpServer, to, from, subjektas, kūnas); } sugauti (Išimtis ex) {System.out.println ("Naudojimas: java com.lotontech.mail.SimpleSender" + "smtpServer toAddress fromAddress subjectText bodyText"); } System.exit (0); } 

Kitas, paleisti „SimpleSender“ kaip nurodyta žemiau. Pakeiskite smtp.myISP.net su savo SMTP serveriu, kaip nustatyta jūsų pašto nustatymuose:

> java com.lotontech.mail.SimpleSender smtp.myISP.net [email protected] [email protected] "Sveiki" "Tiesiog noriu pasakyti labas". 

Jei tai veikia, priėmimo gale pamatysite kažką panašaus į tai, kas parodyta 2 paveiksle.

siųsti (...) metodas užbaigia „SimpleSender“ klasė. Pirmiausia parodysiu kodą, tada paaiškinsiu teoriją:

 / ** * „siųsti“ būdas išsiųsti pranešimą. * / public static void send (String smtpServer, String to, String from, String Subject, String body) {try {Properties props = System.getProperties (); // - prisijungimas prie numatytojo seanso, arba mes galime pradėti naują - props.put ("mail.smtp.host", smtpServer); Sesijos sesija = Session.getDefaultInstance (rekvizitai, nulis); // - Sukurti naują pranešimą - Message msg = new MimeMessage (session); // - nustatykite laukus FROM ir TO - msg.setFrom (new InternetAddress (from)); msg.setRecipients (Message.RecipientType.TO, InternetAddress.parse (to, false)); // - Mes taip pat galėtume įtraukti CC gavėjus - // if (cc! = Null) // msg.setRecipients (Message.RecipientType.CC //, InternetAddress.parse (cc, false)); // - Nustatykite temą ir pagrindinį tekstą - msg.setSubject (subject); msg.setText (body); // - nustatykite kitą antraštės informaciją - msg.setHeader ("X-Mailer", "LOTONtechEmail"); msg.setSentDate (nauja data ()); // - siųsti pranešimą - Transport.send (msg); System.out.println ("Pranešimas išsiųstas gerai."); } sugauti (Išimtis ex) {ex.printStackTrace (); }}} 

Pirmiausia atkreipkite dėmesį, kad gaunate el. Pašto sesiją (java.mail.Sesija), be kurio jūs nieko negalite padaryti. Šiuo atveju jūs skambinate Session.getDefaultInstance (...) gauti bendrą sesiją, kurią kitos darbalaukio programos gali naudoti pakartotinai; taip pat galite nustatyti visiškai naują seansą - per Session.getInstance (...) metodas - tai būtų unikalu jūsų programai. Pastarasis gali pasirodyti svarbus el. Pašto klientams, kurie nėra izoliuoti kiekvienam vartotojui, pavyzdžiui, žiniatinklio el. Pašto sistemai, įdiegtai su servletais.

Norint nustatyti sesiją, reikia nustatyti tam tikras ypatybes; bent jau jums reikia paštas.smtp.host nuosavybę, jei siunčiate pranešimus per SMTP. Rasite kitų ypatybių, aprašytų API dokumentacijoje.

Kai turėsite sesiją, sukurkite pranešimą. Šiame pavyzdyje jūs nustatote pranešimą nuo ir į pašto adresus, tema, ir kūnas tekstas, visas paimtas iš komandinės eilutės. Taip pat nustatote tam tikrą antraštės informaciją, įskaitant datą, ir galite nurodyti cc gavėjai, jei norite.

Galiausiai, jūs išsiųsite pranešimą per javax.mail.Transportas klasė. Jei įdomu, kaip jis žino apie mūsų pašto seansą, atsigręžkite į pranešimo kūrėją.

Ne tik paprastas tekstas

„setText“ (...) patogumo metodas klasėje javax.mail. Žinutė (paveldėta iš javax.mail.dalis sąsaja) nustato pranešimo turinį pagal pateiktą eilutę ir MIME tipą tekstas / paprastas.

Vis dėlto jūs neapsiribojate paprastu tekstu: galite siųsti kitus turinio tipus naudodami „setDataHandler“ (...) metodas. Daugeliu atvejų failų priedus, pvz., „Word“ dokumentus, reiškia „kiti turinio tipai“, bet norėdami sužinoti šiek tiek įdomesnių dalykų, patikrinkite šį kodą, jei norite siųsti „Java“ serijinį objektą:

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

Jūs nerasite „DataHandler“ klasę javax.mail. * paketo struktūrą, nes ji priklauso „JavaBeans Activation Framework“ (JAF) paketui javax.aktyvinimas. Atminkite, kad atsisiuntėte JAF platinimą ir „JavaMail“. JAF pateikia tvarkymo mechanizmą spausdinta duomenų turinys, kuris interneto turiniui reiškia MIME tipus.

Ir jei jūs tikrai bandysite anksčiau pateiktą kodą, norėdami siųsti „Java“ objektą el. Paštu, jums bus sunku rasti „ByteArrayDataSource“ klasė, nes nė viena paštas.jar nei aktyvinimas.jar įtraukite jį. Pabandykite ieškoti „JavaMail“ demonstraciniame kataloge!

Kalbant apie tuos failų priedus, kurie iš pradžių labiau domina, turėtumėte sukurti javax.activation.FileDataSource pavyzdžiui, „DataHandler“konstruktorius. Žinoma, jūs greičiausiai nesiųsite failo vieni; veikiausiai tai bus teksto pranešimo priedas. Tam jums reikia suprasti daugiadalių pranešimų sąvoką, todėl aš pristatysiu šią koncepciją dabar el. Pašto gavimo kontekste.

Gaukite el. Laišką per POP3

Anksčiau aš pristatiau javax.mail.dalis sąsaja, įdiegta javax.mail. Žinutė. Dabar paaiškinsiu jo pranešimo dalis, kurios yra svarbios šiame pavyzdyje. Norėdami pradėti, pažvelkite į 3 paveikslą.

3 paveiksle parodyta a Pranešimas kaip sukurta ankstesniame pavyzdyje, kuri yra ir žinutė, ir pranešimo dalis, nes ji įgyvendina Dalis sąsaja. Bet kuriai daliai galite gauti jos turinį (bet kurį „Java“ objektą), o paprasto teksto pranešimo atveju turinio objektas gali būti Stygos. Kelių dalių pranešimo turinys bus tipo Daugiasluoksnis, iš kurių galime sulaikyti atskiras kūno dalis, kurios pačios įgyvendina Dalis sąsaja.

Praktiškai viskas paaiškės, kai pereisite a kodą „SimpleReceiver“ klasė, kurią pateiksiu trijuose skyriuose: pirma, klasės apibrėžimas ir pagrindinis (...) metodas, kuris paima ryšio informaciją iš komandinės eilutės; antra, gauti (...) metodas, kuris fiksuoja ir peržiūri gaunamus pranešimus; ir pagaliau printMessage (...) metodas, kuris spausdina kiekvieno pranešimo antraštės informaciją ir turinį.

Čia yra pirmasis skyrius:

paketas com.lotontech.mail; importuoti javax.mail. *; importuoti javax.mail.internet. *; importuoti java.util. *; importuoti java.io. *; / ** * Paprasta el. Pašto imtuvų klasė. * / public class SimpleReceiver {/ ** * Pagrindinis būdas gauti pranešimus iš pašto serverio nurodytas * kaip komandinės eilutės argumentai. * / public static void main (String args []) {try {String popServer = args [0]; Stygos popUser = args [1]; Eilutė popPassword = args [2]; gauti (popServer, popUser, popPassword); } sugauti (Išimtis ex) {System.out.println ("Naudojimas: java com.lotontech.mail.SimpleReceiver" + "popServer popUser popPassword"); } System.exit (0); } 

Vėliau pervesiu jus į tinkamą bandomąjį važiavimą, bet kol kas čia yra komandinė eilutė, skirta jai paleisti (nepamirškite pakeisti komandos argumentų savo pašto parametrais):

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

gauti (...) metodas - vadinamas iš pagrindinis (...) - atidaro POP3 INBOX ir paeiliui peržiūri pranešimus, kiekvieną kartą skambindamas printMessage (...). Štai kodas:

 / ** * „gauti“ metodas pranešimams gauti ir juos apdoroti. * / public static void gauti (String popServer, String popUser, String popPassword) {Store store = null; Aplanko aplankas = null; pabandykite {// - Gauti numatytąjį seansą - Ypatybės rekvizitai = System.getProperties (); Sesijos sesija = Session.getDefaultInstance (rekvizitai, nulis); // - Paimkite POP3 pranešimų saugyklą ir prisijunkite prie jos - store = session.getStore ("pop3"); store.connect (popServer, popUser, popPassword); // - Pabandykite surasti numatytąjį aplanką - folder = store.getDefaultFolder (); if (aplankas == null) mesti naują išimtį ("Nėra numatytojo aplanko"); // - ... ir jo INBOX - aplankas = folder.getFolder ("GAMINYS"); if (aplankas == null) mesti naują išimtį ("No POP3 INBOX"); // - atidarykite aplanką tik skaitymui - folder.open (Folder.READ_ONLY); // - Gaukite pranešimų paketus ir juos apdorokite - Pranešimas [] msgs = folder.getMessages (); for (int msgNum = 0; msgNum <msgs.length; msgNum ++) {printMessage (msgs [msgNum]); }} sugauti (Išimtis ex) {ex.printStackTrace (); } pagaliau {// - gražiai užsidarykite - pabandykite {if (aplankas! = null) aplanką.uždaryti (klaidinga); if (parduotuvė! = null) parduotuvė.uždaryti (); } sugavimas (ex2 išimtis) {ex2.printStackTrace ();}}} 

Atkreipkite dėmesį, kad iš seanso gaunate POP3 pranešimų saugyklos pakuotę, tada prisijungiate prie jo naudodami pašto parametrus, kurie iš pradžių buvo pateikti komandinėje eilutėje.

Prisijungę gausite numatytojo aplanko rankenėlę - faktiškai aplankų medžio šaknį - ir iš ten aplanką INBOX, kuriame laikomi gaunami pranešimai. Atidarote „INBOX“, kad galėtumėte tik skaityti; susigaudote žinutėse ir žengiate po jas vienas po kito.

Nepaisant to, galite pagalvoti, ar kada norėtumėte atidaryti „INBOX“ rašyti prieiga. Jūs norėtumėte pažymėti pranešimus kaip gautus ir (arba) pašalinti juos iš serverio. Mūsų pavyzdyje jūs žiūrite tik į juos.

Galiausiai, aukščiau esančiame kode pasirūpinsite uždaryti aplanką ir pranešimų saugyklą, kai paliksite tik printMessage (...) metodas užbaigti šią klasę.

Atspausdinkite pranešimus

Šiame skyriuje, anksčiau javax.mail.dalis sąsajos diskusija tampa aktuali.