Mulai cepat JavaMail

Di JavaMail Anda akan menemukan API dan implementasi penyedia yang memungkinkan Anda mengembangkan aplikasi klien email yang berfungsi penuh. "Aplikasi klien email" memunculkan pemikiran Microsoft Outlook; dan, ya, Anda dapat membuat pengganti Outlook Anda sendiri. Tetapi klien email tidak perlu berada di mesin klien sama sekali. Memang, ini bisa berupa servlet atau EJB yang berjalan di server jarak jauh, menyediakan akses pengguna akhir ke email melalui browser Web. Pikirkan tentang Hotmail (ya, Anda juga dapat menulis versi Hotmail Anda sendiri). Atau Anda bisa menghindari antarmuka pengguna sama sekali. Bagaimana dengan auto-responder yang membaca pesan masuk dan mengirim balasan, disesuaikan dengan pengirim aslinya?

Dalam proyek hewan peliharaan saya sendiri, klien email yang berbicara membaca - yaitu, berbicara - pesan masuk. Ini didasarkan pada penyempurnaan ide yang saya perkenalkan di "Talking Java!" Saya akan memberitahu Anda lebih banyak tentang itu nanti.

Untuk saat ini, mulailah dengan menginstal dan mengkonfigurasi perangkat lunak JavaMail.

Mendirikan

Jika Anda menggunakan Java 2 Platform, Enterprise Edition (J2EE) 1.3, Anda beruntung: ini termasuk JavaMail, jadi tidak diperlukan pengaturan tambahan. Namun, jika Anda menjalankan Platform Java 2, Edisi Standar (J2SE) 1.1.7 dan yang lebih baru, dan Anda menginginkan kemampuan email untuk aplikasi Anda, unduh dan instal yang berikut ini:

  • JavaMail
  • Kerangka Aktivasi JavaBeans

Untuk menginstal, cukup unzip file yang didownload dan tambahkan file jar yang ada ke classpath Anda. Sebagai contoh, inilah classpath saya untuk proyek ini:

.; 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 \ activation.jar 

The mailapi.jarfile berisi kelas API inti, sedangkan pop3.jardan smtp.jarfile berisi implementasi penyedia untuk protokol mail masing-masing. (Kami tidak akan menggunakan imap.jarfile dalam artikel ini.) Pikirkan implementasi penyedia serupa dengan driver JDBC (Java Database Connectivity), tetapi untuk sistem pesan dan bukan database. Adapun mail.jarfile, ini berisi masing-masing file jar di atas, jadi Anda dapat membatasi classpath Anda hanya ke file mail.jardan activation.jar.

The activation.jarfile yang memungkinkan Anda untuk menangani MIME (Multipurpose Internet Mail Extensions) jenis diakses melalui biner aliran data. Cari DataHandlerkelas di bagian Bukan Hanya Teks Biasa nanti.

Sebagai catatan, sisa artikel ini tidak menawarkan cakupan API yang komprehensif; sebaliknya, Anda akan belajar dengan melakukan. Jika Anda mencari informasi API mendalam yang Anda cari, lihat file PDF dan Javadocs yang disertakan dalam bundel unduhan masing-masing.

Setelah Anda menginstal perangkat lunak, Anda perlu mendapatkan detail akun email untuk menjalankan contoh berikut. Anda memerlukan nama server SMTP (Simple Mail Transfer Protocol) ISP dan nama server POP (Post Office Protocol), nama login akun email, dan kata sandi kotak surat Anda. Gambar 1 menunjukkan detail saya - bukan yang asli, Anda mengerti - seperti yang digunakan oleh Microsoft Outlook.

Mengirim email melalui SMTP

Contoh pertama menunjukkan bagaimana mengirim pesan email dasar melalui SMTP. Di bawah ini, Anda akan menemukan SimpleSenderkelas, yang mengambil detail pesan Anda dari baris perintah dan memanggil metode terpisah - send(...)- untuk mengirimkannya:

paket com.lotontech.mail; import javax.mail. *; import javax.mail.internet. *; import java.util. *; / ** * Kelas pengirim email sederhana. * / public class SimpleSender {/ ** * Metode utama untuk mengirim pesan yang diberikan pada baris perintah. * / public static void main (String args []) {coba {String smtpServer = args [0]; String ke = args [1]; String dari = args [2]; String subjek = args [3]; String body = args [4]; send (smtpServer, to, from, subject, body); } catch (Exception ex) {System.out.println ("Penggunaan: java com.lotontech.mail.SimpleSender" + "smtpServer toAddress fromAddress subjectText bodyText"); } System.exit (0); }

Selanjutnya, jalankan SimpleSenderseperti di bawah ini. Ganti smtp.myISP.netdengan server SMTP Anda sendiri, seperti yang berasal dari setelan email Anda:

> java com.lotontech.mail.SimpleSender smtp.myISP.net [email protected] [email protected] "Halo" "Hanya untuk menyapa." 

Dan, jika berhasil, di sisi penerima Anda akan melihat sesuatu seperti yang ditunjukkan pada Gambar 2.

The send(...)Metode melengkapi SimpleSenderkelas. Saya akan menunjukkan kodenya terlebih dahulu, lalu merinci teorinya:

/ ** * metode "send" untuk mengirim pesan. * / public static void send (String smtpServer, String to, String from, String subject, String body) {coba {Properties props = System.getProperties (); // - Melampirkan ke Sesi default, atau kita bisa memulai yang baru - props.put ("mail.smtp.host", smtpServer); Sesi sesi = Session.getDefaultInstance (props, null); // - Buat pesan baru - Pesan msg = MimeMessage baru (sesi); // - Tetapkan kolom FROM dan TO - msg.setFrom (InternetAddress baru (dari)); msg.setRecipients (Message.RecipientType.TO, InternetAddress.parse (ke, false)); // - Kami juga dapat menyertakan penerima CC - // if (cc! = Null) // msg.setRecipients (Message.RecipientType.CC //, InternetAddress.parse (cc, false)); // - Mengatur subjek dan teks isi - msg.setSubject (subject); msg.setText (body);// - Tetapkan beberapa informasi header lainnya - msg.setHeader ("X-Mailer", "LOTONtechEmail"); msg.setSentDate (Tanggal baru ()); // - Mengirim pesan - Transport.send (msg); System.out.println ("Pesan terkirim OK."); } catch (Exception ex) {ex.printStackTrace (); }}}

Pertama, perhatikan bahwa Anda mendapatkan sesi email ( java.mail.Session), yang tanpanya Anda tidak dapat melakukan apa pun. Dalam hal ini Anda menelepon Session.getDefaultInstance(...)untuk mendapatkan sesi bersama, yang dapat digunakan kembali oleh aplikasi desktop lain; Anda juga dapat menyiapkan sesi yang benar-benar baru - melalui Session.getInstance(...)metode - yang unik untuk aplikasi Anda. Yang terakhir ini terbukti penting untuk klien email yang tidak diisolasi pada basis per pengguna, seperti sistem email berbasis web yang diimplementasikan dengan servlet.

Membuat sesi mengharuskan Anda menyetel properti tertentu; minimal, Anda memerlukan mail.smtp.hostproperti jika Anda mengirim pesan melalui SMTP. Anda akan menemukan properti lain yang dijelaskan dalam dokumentasi API.

Setelah Anda memiliki sesi, buat pesan. Dalam contoh ini, Anda pengaturan pesan dari dan ke alamat email, yang subjek, dan tubuh teks, semua diambil berasal dari baris perintah. Anda juga mengatur beberapa informasi header, termasuk tanggal, dan Anda dapat menentukan penerima cc jika Anda mau.

Terakhir, Anda mengirim pesan melalui javax.mail.Transportkelas. Jika Anda bertanya-tanya bagaimana cara mengetahui sesi email kami, lihat kembali konstruktor pesan.

Bukan hanya teks biasa

The setText(...)Metode kemudahan dalam kelas javax.mail.Message(mewarisi dari javax.mail.Partantarmuka) menetapkan isi pesan ke string yang disediakan dan menetapkan jenis MIME untuk text/plain.

Anda tidak terbatas pada teks biasa, meskipun: Anda dapat mengirim tipe konten lain melalui setDataHandler(...)metode ini. Dalam kebanyakan kasus, Anda dapat mengartikan "tipe konten lain" sebagai lampiran file, seperti dokumen Word, tetapi untuk sesuatu yang sedikit lebih menarik, lihat kode ini untuk mengirimkan objek serial Java:

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

Anda tidak akan menemukan DataHandlerkelas dalam javax.mail.*struktur paket karena kelas tersebut termasuk dalam paket JavaBeans Activation Framework (JAF) javax.activation. Ingat, Anda mengunduh distribusi JAF serta JavaMail. JAF menyediakan mekanisme untuk menangani konten data yang diketik , yang untuk konten Internet berarti tipe MIME.

Dan jika Anda benar-benar mencoba kode di atas untuk mengirim objek Java melalui email, Anda akan kesulitan menemukan ByteArrayDataSourcekelas, karena tidak mail.jarjuga activation.jarmenyertakannya. Coba cari di direktori demo JavaMail!

Adapun lampiran file yang Anda lebih tertarik pada awalnya, Anda akan membuat javax.activation.FileDataSourceinstance di DataHandlerkonstruktor. Tentu saja, Anda tidak mungkin mengirim file sendirian; melainkan, itu mungkin akan menjadi lampiran ke pesan teks. Untuk itu Anda perlu memahami konsep pesan multipart, maka saya akan memperkenalkan konsep tersebut sekarang, dalam konteks menerima email.

Terima email melalui POP3

Sebelumnya, saya memperkenalkan javax.mail.Partantarmuka yang diimplementasikan oleh javax.mail.Message. Sekarang saya akan menjelaskan bagian pesannya, yang penting dalam contoh ini. Untuk memulai, lihat Gambar 3.

Gambar 3 menunjukkan Messageseperti yang dibuat pada contoh sebelumnya yang merupakan bagian pesan dan pesan, karena mengimplementasikan Partantarmuka. Untuk bagian mana pun, Anda bisa mendapatkan kontennya (objek Java apa pun), dan, dalam kasus pesan teks sederhana, objek konten mungkin a String. Untuk pesan multi bagian, isinya akan berjenis Multipart, dari mana kita bisa mendapatkan bagian tubuh individu, yang dengan sendirinya mengimplementasikan Partantarmuka.

Dalam praktiknya, semua akan menjadi jelas saat Anda melangkah melalui kode untuk SimpleReceiverkelas, yang akan saya sajikan dalam tiga bagian: pertama, definisi kelas dan main(...)metode yang mengambil detail koneksi dari baris perintah; kedua, receive(...)metode yang menangkap dan melangkah melalui pesan masuk; dan terakhir, printMessage(...)metode yang mencetak informasi header dan konten setiap pesan.

Inilah bagian pertama:

paket com.lotontech.mail; import javax.mail. *; import javax.mail.internet. *; import java.util. *; impor java.io. *; / ** * Kelas penerima email sederhana. * / public class SimpleReceiver {/ ** * Metode utama untuk menerima pesan dari server email yang ditentukan * sebagai argumen baris perintah. * / public static void main (String args []) {coba {String popServer = args [0]; String popUser = args [1]; String popPassword = args [2]; terima (popServer, popUser, popPassword); } catch (Exception ex) {System.out.println ("Penggunaan: java com.lotontech.mail.SimpleReceiver" + "popServer popUser popPassword"); } System.exit (0); }

Saya akan membawa Anda melalui test drive yang tepat nanti, tetapi untuk saat ini di sini adalah baris perintah untuk menjalankannya (ingat untuk mengganti argumen perintah dengan pengaturan email Anda):

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

The receive(...)Metode - disebut dari main(...)- membuka Anda POP3 INBOX dan langkah-langkah melalui pesan pada gilirannya, setiap kali menelepon printMessage(...). Ini kodenya:

/ ** * Metode "terima" untuk mengambil pesan dan memprosesnya. * / public static void menerima (String popServer, String popUser, String popPassword) {Store store = null; Folder folder = null; coba {// - Menahan sesi default - Properti props = System.getProperties (); Sesi sesi = Session.getDefaultInstance (props, null); // - Dapatkan penyimpanan pesan POP3, dan hubungkan ke sana - store = session.getStore ("pop3"); store.connect (popServer, popUser, popPassword); // - Cobalah untuk mendapatkan folder default - folder = store.getDefaultFolder (); if (folder == null) membuang Pengecualian baru ("Tidak ada folder default"); // - ... dan INBOXnya - folder = folder.getFolder ("INBOX"); if (folder == null) melempar Pengecualian baru ("Tidak Ada KOTAK MASUK POP3"); // - Buka folder untuk read only - folder.open (Folder.READ_ONLY);// - Dapatkan pembungkus pesan dan prosesnya - Pesan [] msgs = folder.getMessages (); untuk (int msgNum = 0; msgNum <msgs.length; msgNum ++) {printMessage (msgs [msgNum]); }} catch (Exception ex) {ex.printStackTrace (); } akhirnya {// - Tutup dengan baik - coba {if (folder! = null) folder.close (false); jika (simpan! = null) store.close (); } menangkap (Exception ex2) {ex2.printStackTrace ();}}}

Perhatikan bahwa Anda mendapatkan pembungkus penyimpanan pesan POP3 dari sesi tersebut, lalu menyambungkannya menggunakan setelan email yang semula disediakan pada baris perintah.

Setelah terhubung, Anda mendapatkan pegangan pada folder default - secara efektif akar dari pohon folder - dan, dari sana, folder INBOX yang menyimpan pesan masuk. Anda membuka INBOX untuk akses hanya-baca; Anda menangkap pesan-pesan itu dan menelusuri mereka satu per satu.

Selain itu, Anda mungkin bertanya-tanya apakah Anda pernah ingin membuka INBOX untuk akses tulis . Anda akan melakukannya jika Anda bermaksud menandai pesan sebagai diterima dan / atau menghapusnya dari server. Dalam contoh kami, Anda hanya melihat mereka.

Terakhir, dalam kode di atas Anda berhati-hati untuk menutup folder dan penyimpanan pesan setelah selesai, yang hanya menyisakan printMessage(...)metode untuk menyelesaikan kelas ini.

Cetak pesannya

Pada bagian ini, javax.mail.Partpembahasan antarmuka sebelumnya menjadi relevan.