23 November 2008

Membuat Aplikasi Web Pengirim Email dengan Java

Dalam sebuah website kita sering kali menemui fitur yang interaktif yang memungkinkan user pengguna web site tersebut dapat mengirimkan email kepada orang lain. Fitur ini sering disebut sebagai web-mailWeb Mail adalah suatu aplikasi web yang mampu mengirim dan membaca email melalui browser. Banyak aplikasi web mail yang mungkin sering kita gunakan, seperti yahoo mailgmail dan lain-lain.

Pada pemanfaatan aplikasi web mail, beberapa developer web-site juga menggunakannya sebagai suatu komunikasi antara pengguna web site tsb dengan pihak internal pemilik web site, misal fitur mengirimkan email kepada admin sebuah web-site seperti link berikut.

Kali ini kita akan mencoba membuat suatu aplikasi pengirim email berbasis web. Aplikasi web kita kali ini akan kita batasi hanya pada mengirimkan email saja, tidak membaca suatu email, mungkin pada lain kesempatan kita nanti akan membahas bagaimana cara pembuatan aplikasi web yang mampu membaca email dari suatu email server yang ada.

Ok kita langsung saja.

Untuk pembuatan aplikasi web pengirim email dengan java ini kita membutuhkan beberapa library/pustaka. Library tersebut adalah mail.jar dan activation.jar. silahkan anda download pada link berikut ini.

  1. mail.jar

  2. activation.jar

Skenario membuat aplikasi ini adalah sebagai berikut:

Dari sebuah form html standard yang berisi beberapa input type yang diperlukan kita akan melakukan post dengan metode HTTP POST ke sebuah servlet yang berisi metode untuk mengirimkan email. Kemudian status pengiriman email tsb kita tampilkan dalam bentuk html.


Pada form html standar kita memerlukan beberapa item input type dan sebuah text area. Tampilan form tsb kurang lebih seperti contoh gambar dibawah ini :

Sementara untuk skenario servlet kita bisa menyusunnya dengan langkah-langkah sebagai berikut:

  1. Inisialisasi nama smtp host pada metode init servlet

  2. Inisialisasi semua parameter yang dikirimkan oleh form html standar.

  3. Dalam blok try-catch lakukan langkah-langkah berikut :

    • Buat Session untuk pengiriman email

    • Lakukan konstruksi obyek message

    • Setting alamat pengirim

    • Setting alamat penerima

    • Setting isi email

    • Lakukan pengiriman email

    • Cetak status pengiriman email lewat html

  1. Untuk catch-nya kita gunakan untuk mengakomodir status pengiriman email yang gagal.

  2. Print out status pengiriman email dalam bentuk html

Untuk skenario servlet tsb dibawah ini adalah kode-kode programnya.

package org.mojo.mail.web.servlet;

import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;

/**
* Created by IntelliJ IDEA.
* User: Muhammad Yusuf
* Date: 23 Nov 08
* Time: 13:27:09
* To change this template use File | Settings | File Templates.
*/
public class SendMailServlet extends HttpServlet {

private String smtpHost;

//initialize this servlet to get SMTP Host Name to use in sending message
public void init(ServletConfig config) throws ServletException {
super.init(config);
smtpHost = config.getInitParameter("smtpHost");
}

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String from = req.getParameter("from");
String to = req.getParameter("to");
String cc = req.getParameter("cc");
String bcc = req.getParameter("bcc");
String subject = req.getParameter("subject");
String text = req.getParameter("text");

String status;
try {
//create java mail session
Properties prop = System.getProperties();
prop.put("mail.smtp.host", smtpHost);
Session session = Session.getInstance(prop, null);

//construct the message
MimeMessage message = new MimeMessage(session);

//set the from adress
Address fromAddress = new InternetAddress(from);
message.setFrom(fromAddress);

//parse and set the recipient
Address[] toAddress = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.TO, toAddress);
Address[] ccAddress = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.CC, ccAddress);
Address[] bccAddress = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.BCC, bccAddress);

//set The Subject and Text
message.setSubject(subject);
message.setText(text);

//begin send Message
Transport.send(message);
status = "Your Message has sent";


} catch (AddressException aex) {
status = "There was an error when parsing the address";
} catch (SendFailedException sfe) {
status = "There was an error when sending the Message";
} catch (MessagingException me) {
status = "There was unexpected error";
}

//print out status in display
res.setContentType("text/html");
PrintWriter writer = res.getWriter();
writer.println("<html><head><title>Status</title></head>");
writer.println("<body><p>" + status + "</body></html>");
writer.close();

}
}

Mari kita bahas satu per-satu kode tsb :


package org.mojo.mail.web.servlet;

import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;

Seperi biasa, kode diatas adalah baris-baris dimana kita mendeklarasikan package dimana servlet kita dibuat dan import-import library yang kita butuhkan.

public class SendMailServlet extends HttpServlet {
………..
…….
}

Seperti yang kita lihat diatas kita membuat suatu servlet yang bernama SendMailServlet, karena ini adalah sebuah servlet maka kita harus menambahkan extends HttpServlet disana. Kemudian kita membuat sebuah file deployment descriptor(web.xml) yang nantinya akan kita letakkan dalam /webapps/{WebApp}/WEB-INF/

Isi dari file deployment descriptor disini adalah seperti gambar berikut ini :

Pada file tsb kita bisa melihat bahwa servlet yang kita buat tadi kita definsikan di sini dengan nama sendMessage, dimana nama servlet ini kemudian kita mapping ke sebuah url /sendMessage. Oleh karena itu dalam file standar html tadi action-nya mengarah ke url ini. Perhatikan juga kita menginisialisi sebuah parameter di file web.xml ini dengan nama parameternya adalah : smtpHost dan nilai dari parameter ini adalah smtp.speed.net.id, nilai ini bisa kita rubah tergantung smtp mana yang akan kita gunakan untuk mengirim email pada aplikasi web kita ini.

Sekarang kita lihat baris lainnya pada servlet:

    private String smtpHost;

//initialize this servlet to get SMTP Host Name to use in sending message
public void init(ServletConfig config) throws ServletException {
super.init(config);
smtpHost = config.getInitParameter("smtpHost");
}

Kita bisa melihat pada kode diatas ada sebuah variabel yang kita deklarasikan bernama smtpHost, dan variabel ini bertype string. Kemudian pada baris selanjutnya kita melihat bahwa pada method init, variabel smtpHost ini kita isi nilainya dengan mengambil nilai dari web.xml yang tadi sebelumnya kita buat, pengambilan nilai dari web.xml tadi dengan menggunakan obyek ServletConfig.

Kemudian kita lihat metode doPost pada servlet ini :

public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String from = req.getParameter("from");
String to = req.getParameter("to");
String cc = req.getParameter("cc");
String bcc = req.getParameter("bcc");
String subject = req.getParameter("subject");
String text = req.getParameter("text");

String status;
…………
………..
}

Baris tersebut adalah baris dimana kita mengambil nilai-nilai yang dilempar oleh form standar html dan kemudian memasukkannya ke dalam sebuah variabel. Pada baris ini kita juga mendefinisikan sebuah variabel yang nantinya kita pakai untuk menampilkan status pengiriman email, variabel tsb bernama status dengan type data String.

Untuk skenario ke-3 dalam servlet ini kita lakukan dalam blok try-catch seperti contoh berikut:

…………..
try {
//create java mail session
Properties prop = System.getProperties();
prop.put("mail.smtp.host", smtpHost);
Session session = Session.getInstance(prop, null);

//construct the message
MimeMessage message = new MimeMessage(session);

//set the from adress
Address fromAddress = new InternetAddress(from);
message.setFrom(fromAddress);

//parse and set the recipient
Address[] toAddress = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.TO, toAddress);
Address[] ccAddress = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.CC, ccAddress);
Address[] bccAddress = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.BCC, bccAddress);

//set The Subject and Text
message.setSubject(subject);
message.setText(text);

//begin send Message
Transport.send(message);
status = "Your Message has sent";


} catch (AddressException aex) {
…………..
………….

Dalam kode di atas kita bisa melihat bahwa satu demi satu skenario servlet yang ada pada point ke-3 kita lakukan, dari mulai membuat sebuah session java mail sampai pada melakukan pengiriman message dan kemudian kita mengisi nilai untuk variabel status di sana.

Sekarang mari kita lihat kode-kode pada blok catch atau pada skenario servlet point ke-4.

………….
} catch (AddressException aex) {
status = "There was an error when parsing the address";
} catch (SendFailedException sfe) {
status = "There was an error when sending the Message";
} catch (MessagingException me) {
status = "There was unexpected error";
}
………….
………….

Pada kode diatas ini, peranan variabel status kita optimalkan, disini kita mengisi variabel status dengan nilai yang sesuai dengan error yang dapat saja terjadi pada servlet kita. Dari mulai error salah alamat email pengirim dan penerima sampai pada error yang memang tidak diketahui.

Tibalah kita pada baris-baris terakhir kode-kode servlet yang kita buat

……..
//print out status in display
res.setContentType("text/html");
PrintWriter writer = res.getWriter();
writer.println("<html><head><title>Status</title></head>");
writer.println("<body><p>" + status + "</body></html>");
writer.close();
}
…….

Pada baris-baris terakhir kode ini, kita membuat sebuah response berupa halaman html yang menginformasikan status dari pengiriman email melalui servlet yang kita buat tadi.

Mudah bukan..? silahkan dicoba dan silahkan modifikasi sesuai dengan kebutuhan dan keinginan anda.


Semoga Bermanfaat


Menteng, 23 November 2008

Josescalia


7 comments:

Music Stuff said...

mas maksih buat ilmunya..
tp klo bikin yang ga under web gmn..?
jadi langsung dari javanya..

JoseScalia said...

Quote "mas maksih buat ilmunya..
tp klo bikin yang ga under web gmn..?
jadi langsung dari javanya..
"
Sebenarnya secara konsep, Semua process dalam sebuah servlet bisa di jadikan sebagai aplikasi java non web. hanya saja paramater-paramater yang di tadinya di supply lewat Http diganti dengan metode passing paramater yang lain. dan juga pembacaan parameter yang di supply tidak lagu menggunakan request.getParamater. Saya pribadi justru menulis ini karena terinspirasi dari aplikasi email yang saya buat dengan java non web, dimana konsep process flow tidak ada yang berubah.
Gimana kalo saya minta anda untuk membuatnya untuk yang non web, jika anda berhasil, nanti kita diskusikan bersama...

Agung said...

makasih mas..segera di coba!

TOPI HITAM said...

Saya copy yah mas oleh toh ojo pelit yo

JoseScalia said...

Quote : Saya copy yah mas oleh toh ojo pelit yo

Silahkan Mas Basuki..tapi kalo mo ditaro di blog anda, mohon tidak lupa untuk memasukkan nama penulisnya...

Thnks

Upslaw said...

met kenal, mas. aplikasinya bagus. file yg diperlukan dah sy download. cuma masih bingung mo ngapain lagi. nulis scriptnya dmn? program java kah? tlg dunk kasih tau yaa. pemula java neeeh.

FORUM SILATUROHMI said...

hmmm thank"s share ilmunya...
ayo kita coba di java web netben.....