Programiranje

Hitri začetek JavaMail

V JavaMailu boste našli API-je in izvedbe ponudnikov, ki vam omogočajo razvoj popolnoma funkcionalnih aplikacij e-poštnih odjemalcev. "E-poštni odjemalski programi" opozarja na Microsoft Outlook; in ja, lahko bi napisali svojo lastno zamenjavo za Outlook. Toda e-poštni odjemalec sploh ni treba prebivati ​​na odjemalskem računalniku. Dejansko je to lahko strežniški programček ali EJB, ki se izvaja na oddaljenem strežniku in končnemu uporabniku omogoča dostop do e-pošte prek spletnega brskalnika. Pomislite na Hotmail (ja, lahko bi napisali tudi svojo različico Hotmaila). Lahko pa se popolnoma izognete uporabniškemu vmesniku. Kaj pa samodejni odzivnik, ki bere dohodna sporočila in pošilja odgovore, prilagojene glede na prvotnega pošiljatelja?

Govorni e-poštni odjemalec v mojem projektu za hišne ljubljenčke bere - torej govori - dohodna sporočila. Temelji na izpopolnitvi ideje, ki sem jo predstavil v "Talking Java!" Več o tem vam povem kasneje.

Zaenkrat začnite z namestitvijo in konfiguriranjem programske opreme JavaMail.

Nastaviti

Če uporabljate platformo Java 2, Enterprise Edition (J2EE) 1.3, imate srečo: vključuje JavaMail, zato dodatna namestitev ni potrebna. Če pa uporabljate platformo Java 2 Platform, Standard Edition (J2SE) 1.1.7 ali novejšo in želite za svoje aplikacije omogočiti e-pošto, prenesite in namestite naslednje:

  • JavaMail
  • JavaBeans Activation Framework

Če želite namestiti, preprosto razpakirajte prenesene datoteke in dodajte vsebovane datoteke jar v svojo učilno pot. Kot primer je tu moja učilnica za ta 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 

The mailapi.jar datoteka vsebuje osnovne razrede API, medtem ko pop3.jar in smtp.jar datoteke vsebujejo ponudniške izvedbe za ustrezne poštne protokole. (Ne bomo uporabili imap.jar datoteko v tem članku.) Namestitve ponudnikov so podobne gonilnikom JDBC (Java Database Connectivity), vendar za sporočilne sisteme in ne za zbirke podatkov. Kar zadeva mail.jar datoteka vsebuje vsako od zgornjih datotek jar, tako da lahko svojo pot predavanja omejite samo na mail.jar in aktivacija.jar datotek.

The aktivacija.jar datoteka vam omogoča obdelavo vrst MIME (Multipurpose Internet Mail Extensions), ki so dostopne prek binarnih podatkovnih tokov. Poiščite DataHandler razred v Ne samo navadno besedilo odsek kasneje.

Za zapis, preostanek tega članka ne ponuja celovitega kritja API; namesto tega se boste naučili s tem. Če gre za poglobljene informacije o API-ju, si oglejte datoteke PDF in Javadocs, vključene v ustrezne svežnje za prenos.

Ko namestite programsko opremo, morate dobiti podatke o e-poštnem računu, da zaženete primere, ki sledijo. Potrebovali boste ime strežnika SMTP (Simple Mail Transfer Protocol) vašega ponudnika internetnih storitev in ime strežnika POP (Post Office Protocol), ime za prijavo v vaš e-poštni račun in geslo za nabiralnik. Na sliki 1 so prikazane moje podrobnosti - ne resnične, razumete - kot jih uporablja Microsoft Outlook.

Pošiljanje e-pošte prek SMTP

Prvi primer prikazuje, kako lahko prek SMTP pošljete osnovno e-poštno sporočilo. Spodaj boste našli SimpleSender razred, ki iz ukazne vrstice vzame podrobnosti vašega sporočila in pokliče ločeno metodo - pošlji (...) - da ga pošljete:

paket com.lotontech.mail; uvoz javax.mail. *; uvoz javax.mail.internet. *; uvoz java.util. *; / ** * Preprost razred pošiljatelja e-pošte. * / javni razred SimpleSender {/ ** * Glavni način za pošiljanje sporočila iz ukazne vrstice. * / public static void main (String args []) {try {String smtpServer = args [0]; Niz v = args [1]; Niz iz = args [2]; Stvar niza = argumenti [3]; Telo niza = argumenti [4]; pošlji (smtpServer, to, from, subject, body); } catch (Izjema ex) {System.out.println ("Uporaba: java com.lotontech.mail.SimpleSender" + "smtpServer toAddress fromAddress subjectText bodyText"); } System.exit (0); } 

Nato teči SimpleSender kot spodaj. Zamenjati smtp.myISP.net z lastnim strežnikom SMTP, kot izhaja iz vaših nastavitev pošte:

> java com.lotontech.mail.SimpleSender smtp.myISP.net [email protected] [email protected] "Hello" "Samo za pozdrav." 

Če deluje, boste na sprejemnem koncu videli nekaj takega, kot je prikazano na sliki 2.

The pošlji (...) metoda dokonča SimpleSender razred. Najprej bom pokazal kodo, nato pa podrobno opisal teorijo:

 / ** * način pošiljanja sporočila. * / public static void send (String smtpServer, String to, String from, String subject, String body) {try {Properties props = System.getProperties (); // - Pripenjanje na privzeto sejo, ali pa bi lahko začeli novo - props.put ("mail.smtp.host", smtpServer); Seja seje = Session.getDefaultInstance (rekviziti, null); // - Ustvari novo sporočilo - Sporočilo sporočila = novo MimeMessage (seja); // - Nastavi polji FROM in TO - msg.setFrom (nov InternetAddress (od)); msg.setRecipients (Message.RecipientType.TO, InternetAddress.parse (do, false)); // - Lahko bi vključili tudi prejemnike CC - // if (cc! = Null) // msg.setRecipients (Message.RecipientType.CC //, InternetAddress.parse (cc, false)); // - Nastavitev predmeta in besedila - msg.setSubject (subject); msg.setText (telo); // - nastavite nekatere druge informacije o glavi - msg.setHeader ("X-Mailer", "LOTONtechEmail"); msg.setSentDate (nov datum ()); // - Pošlji sporočilo - Transport.send (msg); System.out.println ("Sporočilo poslano v redu."); } catch (izjema ex) {ex.printStackTrace (); }}} 

Najprej opazite, da prejemate poštno sejo (java.mail.Session), brez katerega ne morete storiti ničesar. V tem primeru kličete Session.getDefaultInstance (...) da dobite sejo v skupni rabi, ki jo lahko druge namizne aplikacije ponovno uporabijo; lahko nastavite tudi popolnoma novo sejo - prek Session.getInstance (...) metoda - to bi bilo edinstveno za vašo aplikacijo. Slednje bi se lahko izkazalo za pomembno za e-poštne odjemalce, ki niso ločeni od uporabnika, na primer spletni e-poštni sistem, implementiran s strežniškimi programčki.

Vzpostavitev seje zahteva nastavitev določenih lastnosti; potrebujete vsaj mail.smtp.host lastnost, če pošiljate sporočila prek SMTP. V dokumentaciji API-ja boste našli druge lastnosti.

Ko imate sejo, ustvarite sporočilo. V tem primeru nastavljate sporočilo iz in do e-poštni naslovi, predmet, in telo besedilo, vse prvotno vzeto iz ukazne vrstice. Nastavite lahko tudi nekatere podatke o glavi, vključno z datumom, in jih lahko določite cc prejemnike, če želite.

Na koncu pošljete sporočilo prek javax.mail.Transport razred. Če se sprašujete, kako ve o naši poštni seji, se oglejte v konstruktorju sporočila.

Ne samo navadno besedilo

The setText (...) priročna metoda v razredu javax.mail.Message (podedovano od javax.mail.Part vmesnik) nastavi vsebino sporočila na priloženi niz in nastavi vrsto MIME besedilo / navaden.

Vendar niste omejeni na navadno besedilo: druge vrste vsebine lahko pošljete prek setDataHandler (...) metoda. V večini primerov lahko "druge vrste vsebine" pomenijo priloge datotek, kot so Wordovi dokumenti, za nekaj bolj zanimivega pa si oglejte to kodo za pošiljanje Java serializiranega predmeta:

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

Ne boste našli DataHandler razred v javax.mail. * struktura paketa, ker pripada paketu JavaBeans Activation Framework (JAF) javax.aktivacija. Ne pozabite, da ste prenesli distribucijo JAF in tudi JavaMail. JAF ponuja mehanizem za ravnanje vtipkal podatkovne vsebine, kar za internetne vsebine pomeni vrste MIME.

In če resnično preizkusite zgornjo kodo za pošiljanje predmeta Java po e-pošti, boste imeli težave z iskanjem ByteArrayDataSource razred, kot niti mail.jar niti aktivacija.jar vključite ga. Poskusite poiskati demo imenik JavaMail!

Kar zadeva tiste priloge datotek, za katere boste bolj verjetno, da vas bodo sprva zanimale, bi ustvarili datoteko javax.activation.FileDataSource primer v DataHandlerje konstruktor. Seveda datoteke verjetno ne boste poslali sami; verjetno bo to priloga besedilnemu sporočilu. Za to morate razumeti koncept večdelnih sporočil, zato ga bom predstavil zdaj v okviru prejemanja e-pošte.

Prejmite e-pošto prek POP3

Prej sem predstavil javax.mail.Part vmesnik, ki ga izvaja javax.mail.Message. Zdaj bom razložil njene sporočilne dele, ki so pomembni v tem primeru. Za začetek si oglejte sliko 3.

Slika 3 prikazuje a Sporočilo kot je bilo ustvarjeno v prejšnjem primeru, ki je hkrati sporočilo in del sporočila, ker izvaja Del vmesnik. Za kateri koli del lahko dobite njegovo vsebino (kateri koli objekt Java), v primeru preprostega besedilnega sporočila pa je lahko predmet vsebine Vrvica. Za večdelno sporočilo bo vsebina vrste Večdelni, iz katerega se lahko dokopljemo do posameznih delov telesa, ki sami izvajajo Del vmesnik.

V praksi bodo vse postale očitne, ko boste stopili skozi kodo za SimpleReceiver razred, ki ga bom predstavil v treh razdelkih: prvič, opredelitev razreda in glavni (...) metoda, ki iz ukazne vrstice vzame podrobnosti o povezavi; drugič, prejeti(...) metoda, ki zajema in prečka dohodna sporočila; in končno printMessage (...) metoda, ki natisne informacije o glavi in ​​vsebino vsakega sporočila.

Tu je prvi razdelek:

paket com.lotontech.mail; uvoz javax.mail. *; uvoz javax.mail.internet. *; uvoz java.util. *; uvoz java.io. *; / ** * Preprost razred e-poštnih sprejemnikov. * / javni razred SimpleReceiver {/ ** * Glavna metoda za prejemanje sporočil od poštnega strežnika, določenega * kot argumente ukazne vrstice. * / public static void main (String args []) {try {String popServer = args [0]; String popUser = args [1]; Niz popPassword = args [2]; prejem (popServer, popUser, popPassword); } catch (izjema ex) {System.out.println ("Uporaba: java com.lotontech.mail.SimpleReceiver" + "popServer popUser popPassword"); } System.exit (0); } 

Kasneje vas bom popeljal skozi pravilno testno vožnjo, za zdaj pa je tu ukazna vrstica, da jo zaženete (ne pozabite nadomestiti ukaznih argumentov z nastavitvami pošte):

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

The prejeti(...) metoda - poklicana iz glavni (...) - odpre vaš POP3 INBOX in ob vsakem klicu zaporedno prečka sporočila printMessage (...). Tu je koda:

 / ** * metoda "sprejem" za pridobivanje sporočil in njihovo obdelavo. * / public static void receive (String popServer, String popUser, String popPassword) {Store store = null; Mapa mape = null; poskusite {// - zadržite privzeto sejo - lastnosti props = System.getProperties (); Seja seje = Session.getDefaultInstance (rekviziti, null); // - pridržite shrambo sporočil POP3 in se z njo povežite - store = session.getStore ("pop3"); store.connect (popServer, popUser, popPassword); // - Poskusite se dokopati do privzete mape - folder = store.getDefaultFolder (); če (mapa == null) vrže novo izjemo ("Ni privzete mape"); // - ... in njegova INBOX - mapa = folder.getFolder ("INBOX"); če (mapa == null) vrže novo izjemo ("No POP3 INBOX"); // - Odprite mapo samo za branje - folder.open (Folder.READ_ONLY); // - Pridobite ovojnice sporočil in jih obdelajte - Message [] msgs = folder.getMessages (); for (int msgNum = 0; msgNum <msgs.length; msgNum ++) {printMessage (msgs [msgNum]); }} catch (izjema ex) {ex.printStackTrace (); } končno {// - lepo zaprite - poskusite {if (mapa! = null) folder.close (false); if (store! = null) store.close (); } ulov (izjema ex2) {ex2.printStackTrace ();}}} 

Upoštevajte, da iz seje pridobite ovitek za shranjevanje sporočil POP3, nato pa se nanj povežete z nastavitvami pošte, prvotno naštetimi v ukazni vrstici.

Ko ste povezani, dobite ročico v privzeti mapi - dejansko koren drevesa map - in od tam mapo INBOX, ki vsebuje vhodna sporočila. INBOX odprete za dostop samo za branje; dobite sporočila in eno po eno prestopate med njimi.

Poleg tega se lahko vprašate, ali bi kdaj želeli odpreti INBOX piši dostop. Če bi sporočila nameravali označiti kot prejeta in / ali jih odstraniti s strežnika. V našem primeru gledate samo njih.

Nazadnje v zgornji kodi poskrbite za zapiranje mape in shrambe sporočil, ko končate, pri čemer ostane samo printMessage (...) metoda za dokončanje tega razreda.

Natisnite sporočila

V tem poglavju prej javax.mail.Part razprava o vmesniku postane pomembna.

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