J2EE
útikalauz Java programozóknak

JavaMail

Balázs Iván József

A példaprogramok sorait az azonosítás céljából megszámoztuk: a sorszámok nyilván nem tartoznak a programokhoz, és a kedvezőbb tördelhetőség és a helytakarékosság kedvéért helyenként eltértünk az egyébként használatos kódolási, zárójelezési szokásainktól. A kivételek kezelésére egy kényelmesen programozható, de nem minden esetben követendő módszert alkalmaztunk: minden szóba jöhető metódust úgy deklaráltunk, mint amelyik Exception típusú kivételt dobhat, a main metódus pedig elkapja és kiíratja a program végrehajtása során esetleg keletkezett kivételt. Egy nagyobb programkörnyezetben nyilván nem a névtelen csomagba tennénk az osztályainkat, következetesebb névadással élnénk s így tovább. Mindazonáltal a példaprogramok nem öncélúak, hanem használhatóak is. Éppen a használhatóságot szolgálják az opciómegadási lehetőségek, amelyek a kód mennyiségét egy kicsit megnövelik ugyan, de amelyek a gyakorlatban hasznosnak bizonyultak.

A példaprogramokat vagy az 1.2.2-es fejlesztőkészlet és az 1.2.1-es J2EE, vagy az Activation Framework-kel (activation.jar) és a SUN-féle ingyenes JavaMail-implementációval (mail.jar) kibővített 1.1.8-as JDK felhasználásával fejlesztettük illetve használjuk.

A példaprogramok áttekintése

Egy üzenet összeállítása, elküldése

A mailer program egy Java alkalmazás, amelyik a megadott fájlokat egy levél mellékleteiként adott címre vagy címekre elküldi. Az első argumentumában várja egy (vagy vesszővel elválasztva több) címzett megadását, a többi argumentumában az elküldendő állományok nevét.

Ha egy címzettben nem találja a @ karaktert, akkor egy a programba bedrótozott alapértelmezett tartomány (9. sor, ADDRESS_BASE változó) nevével egészíti ki azt. Egy szintén bedrótozott hálózati címen (10. sor, MAIL_HOST változó) levő smtp kiszolgálón keresztül küldi el a levelet. (Az smtp kiszolgálót megadhatjuk a mail.host parancssori szimbólummal.)

Egy levél részeinek kiíratása

Tegyük fel, hogy egy elektronikus levél tartalmát a hálózati formának megfelelően egy állományba mentettük. Ekkor ezzel a programmal (MessageDumper) az állományból beolvastatva felderíthetjük a szerkezetét, és hozzáférhetünk az egyes részeihez. A program az argumentumában megadott nevű fájlt (vagy ha nincsen megadva argumentum, akkor a szabványos adatbeviteli csatornát, System.in) olvassa és elektronikus levélként értelmezi.

A program viselkedését az alábbi opciókkal (kapcsolókkal) tudjuk befolyásolni:

OpcióTípusHatás
headerbooleanA fejlécek kiíratása
flagbooleanA jelzőmezők kiíratása
renamebooleanA csatolt állományoknak a levélben szereplő néven való elmentése
baseStringA megírandó állományok nevének előtagja

A boolean típusmegjelölés azt jelenti a táblázatban, hogy csak az számít, hogy az illető változó definiált-e, míg a String típusnál az érték is érdekes.

Például a futtató Java virtuális gép indításakor a -Dheader=1 opciót megadva a fejléceket kiíratjuk.

Egy kiszolgálón tárolt üzenetek kilistázása

Az ImapList program egy adott IMAP-kiszolgálóra érkezett üzeneteinket listázza ki. Parancssori argumentumként meg kell adnunk a kiszolgáló hálózati címét, a felhasználó nevét és jelszavát.

Ha Exchange szervert használunk, és az egy NT-tartomány alapján kezeli a bejelentkezést, akkor a felhasználói azonosítót e-mail-címként kell megadnunk, vagy a felhasználónév előtt egy \ jellel elválasztva meg kell adnunk az NT-tartomány nevét is.

Opcionálisan megadhatunk még egy sorszámot is: ilyenkor nem adja ki a program a teljes listát, hanem a megadott sorszámú üzenetet részekre bontva kiírja.

A program kimenete egy ilyesforma lista:

0000 2000/03/17 07:02 surveymaster@dp-websvr.eng.sun.com
                Survey for Forte for Java, Community Edition 
0001 2000/03/31 02:41 redhat-install-list-request@redhat.com
                Re: agpgart
0002 2000/04/05 07:02 surveymaster@dp-websvr.eng.sun.com
                WIN A FABULOUS JACKET, Return Forte for Java Survey  
0003 2000/09/12 12:00 Oracle OpenWorld 
                Last Chance to Register Online!
0004 2000/10/04 02:25 Mail Delivery Subsystem 
                Warning: could not send message for past 4 hours
0005 2000/11/02 05:31 VeriSign Digital ID Center 
                Trial Class 1 VeriSign Digital ID Pickup Instructions
0006 2000/12/21 01:44 Sun Microsystems 
                Sun User ID Update
0007 2001/02/20 11:12 MAILER-DAEMON@matavnet.hu
                failure notice
0008 2001/04/25 10:13 NULLFROM
                null		 
0009 2001/05/04 02:54 Sebastian Krahmer 
                [suse-security-announce] SuSE Security Ann.: sgmltool
0010 2001/05/04 04:54 personal-cert-system@thawte.com
                Thawte Mail Ping

Keresés üzenetek között

Az előző példát kibővíthetjük avval, hogy ne az összes üzenetet listázza ki, hanem csak a parancssori argumentumokkal megadható keresési feltételeknek megfelelőeket (ImapList1 program).

Ha megadjuk a SUBJECT0, SUBJECT1 stb. környezeti változókat, akkor azt a keresési feltételt adjuk meg, hogy az üzenet tárgya (subject-je) tartalmazza a megadott szöveget. Hasonlóan a FROM0, FROM1 stb. értékek az üzenet küldőjére vontakozó megszorítást jelentenek. A megadott keresési feltételek vagylagosan értendőek.

Ha a programot például a -DSUBJECT0=sun -DFROM0=Thawte -DSUBJECT1=forte kapcsolók megadásával futtatjuk, akkor csak azoknak a leveleknek a klistáját kapjuk, amelyeknél -a kis- és a nagybetűk közötti különbségtől eltekintve- a tárgy tartalmazza a sun vagy a forte szót, vagy ahol a küldő tartalmazza a Thawte szövegrészt:

0000 2000/03/17 07:02 surveymaster@dp-websvr.eng.sun.com
                Survey for Forte for Java, Community Edition 
0001 2000/04/05 07:02 surveymaster@dp-websvr.eng.sun.com
                WIN A FABULOUS JACKET, Return Forte for Java Survey  
0002 2000/12/21 01:44 Sun Microsystems 
                Sun User ID Update
0003 2001/05/04 04:54 personal-cert-system@thawte.com
                Thawte Mail Ping

Egy kiszolgálóra érkező üzenetek figyelése

Ez a példaprogram (LevelFigyelo) egy IMAP-kiszolgálóra érkező üzenetek folyamatos figyelésére szolgál. Grafikus felhasználói felületű lévén a program bonyolultabb, mint az előzőek. Van egy Listazo nevű segédosztály, amelyik egy ablakot (java.awt.Frame) jelenít meg egy bővíthető listával (java.awt.List): ebben fogjuk a folyamatosan érkező üzenetekre utaló információt megjeleníteni.

Észrevételeiket a javamegj@java.inf.elte.hu címen várjuk.
A lemezmellékletet Lőrentey Károly szerkesztette.