Making Send Mail Web Application with Java

In a websites we often see an interactive feature that can make possible to user to send email to others. This feature is called web-mail. Web mail is a web application which has capability to read and send email through internet browser. There’s a lot of web-mail application that might be we use often. Like yahoo-mail, or Gmail, etc.

In the use of web-mail application, some of developer also use it as a communication tools between user and the internal side of those web-site owner, such as send email to an admin of the web site jut like this link.

Now, we will try to make a send mail web application, for this purpose we will limit the project only to send mail, not read the mail from other mail server. Maybe in the next chance we will discuss about how to read the mail that exist from a mail server.

Ok, now we just go straight…:D

To make this send mail web application with java, we will need some library. Those library is mail.jar and activation.jar. so you can download those library through this link

  1. mail.jar

  2. activation.jar

The process flow of this web application is:

From a standard html form which consist of some input type and a text area, we will posting using HTTP POST method to a servlet that containing methods send mail. And then the status of sending mail will be displayed on a html page.

sendmailflow

 

On the standard html form we need a few input type and a text area. The picture show below hopefully can present.

sendmailform1

And for the servlet scenario, lets arrange with the steps below :

  1. Initialize the smtp host in init servlet methods

  2. Initialize all params that send by standard html form.

  3. On a try-catch block do the following steps:

    • Create java mail session

    • Constructs the message

    • Set the form address and recipient address

    • Set the message

    • Transport the mail

    • Print out the send mail status on html page.

  1. We ca use the catch blok to set the status for causes fo failure send mail process

  2. Print out the send mail status on html page.

To those servlet scenario below is the list of the servlet code.

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();
 }
}

Let’s discuss those codes.

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;

Just like usual these lines is created to define where the package of this servlet made and importing all the class that might be we need later.

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

Above code is show us, that we create a servlet class and we name it SendMailServlet, Just because this class is a servlet so we have to add extends HttpServlet there. And then we have to make deployment descriptor(web.xml) file that we will place it at <ApplicationServer>/webapps/<ApplicationName>/WEB-INF/

The deployment descriptor file is shown below:

mail-webxml

On this file we can see that the servlet class that we’ve made, we define here and we name it as sendMessage, and then we will mapping this name to url called /sendMessage. That’s why on the standar html form the action will lead this post to this url. And see that in this file we also initialize a parameter, we named it as smtpHost and the value of this parameter is smtp.speed.net.id, you can change this value depends on which smtp server we use to send the message through this web application

Now let’s see another line of the 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");
}

In above code we declare a variable named smtpHost, and this variable is string. Then in the next line we see that this variable now has a value that taken from the web.xml file. This method is using ServletConfig object.

Now let’s see the doPost method below:

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;
…………
………..
}

Those lines are lines which we take all the value that posted by standard html form and then put it into variables. In this lines we also define a variable that we will use to display the status of the send mail, this variable named status and this is string type.

For the third point of above servlet scenario, we will do it in try-catch block just like the following code.

…………..
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) {
…………..
………….

On that code lines, we can see one by one of the servlet scenario on the third point handled, from the making a java mail session till give the value for variable status.

Now let’s see the catch block or a fourth point of servlet scenario.

………….
 } 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";
 }
………….
………….

On that code, we optimize the variable status, we fill this variable with the value that suitable with the error message that can be happen on our servlet. From wrong email address error, till the unexpected error.

Now we meet the last lines of the code.

……..
//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();
    }
…….

On this last lines, we make a response as a html type that inform the status of send mail transport. Its easy rite ? now it’s your turn to create and free to modified this all codes for your need.

 

I hope this will be usefull

 

Menteng, November 23rd, 2008

Josescalia

Menggunakan Session untuk menangani validasi halaman JSP

Dalam aplikasi web, terkadang kita memerlukan UI (User Interface), untuk mengkontrol aplikasi web, terutama aplikasi web yang konfigurasinya memakai database. Pengaturan kontrol aplikasi web yang memakai UI, tentunya tidak bisa sembarangan, artinya hanya user yang diberikan ijin saja yang bisa memakai UI tersebut untuk mengkontrol suatu aplikasi web. Sebab jika semua user bisa memakai UI tsb, maka aplikasi web pun akan menjadi berantakan jika masing-masing user tidak punya kesepahaman.

Perpindahan antar halaman web dalam UI untuk mengkonfigurasi suatu web pastinya harus ada suatu otentifikasi, pendeknya semua halaman UI baru bisa di akses jika otentifikasi user dinyatakan boleh mengakses halaman web yang di request, sehingga semua perubahan pada konfigurasi aplikasi web dapat dipertanggungjawabkan.

Dalam aplikasi web kita kenal cookie dan session sebagai sebuah cara untuk menangani suatu otentikasi ketika mengakses sebuah halaman web. Pada kesempatan kali ini kita akan menggunakan session sebagai sebuah otentikasi akses halaman web. Penggunaan sessionsebagai otentikasi akses halaman web ini disebut dengan session tracking.

Dalam pemrograman Java, session diatur dalam beberapa kelas yang ada dalampackage javax.servlet.http.*, dalam package inilah kita bisa memanajemen session dalam suatu aplikasi web yang kita buat. Untuk mempermudah pemahaman akan manajemen sessionini, kita akan mempersempit pembahasan hanya pada attribut session saja. Attribut session ini akan kita pakai sebagai otentikasi akses halaman web. Dalam penanganan sessionmenggunakan attribut, java menyebutnya sebagai Session Bounded-Object, artinya ada sembarang objek java yang dipakai untuk mengeset attribut session ataupun menghancurkan attribute session. Objek ini terikat pada suatu session, sehingga kita bisa menggunakannya sebagai otentikasi akses halaman web.

Kita langsung saja pada contoh.

Kali ini kita akan membuat sebuah aplikasi web dimana aplikasi tersebut menggunakan loginuntuk bisa mengakses ke semua halaman yang ada pada aplikasi web kita. Karena pembahasan kali ini ke arah session tracking, maka kita hanya akan menekankan penggunaan attributsession pada aplikasi web kita kali ini.

Dibawah ini adalah plan/bussines flow project kita :

 

  1. User login menggunakan username dan password untuk mengakses aplikasi web.

  2. Jika username dan password benar, attribut session akan di set pada session yang ada. Kemudian user akan dilempar kehalaman utama.

  3. Setiap halaman yang akan diakses oleh user harus divalidasi oleh session, jika ada useryang mencoba mengakses sebuah halaman tanpa validasi, maka user akan langsung dilempar ke halaman login.

  4. Jika user ingin keluar dari session yang ada, user bisa mengakses sebuah halaman dimana didalam halaman tsb, session yang dipegang oleh aplikasi web, dihancurkan.

Untuk mendukung business flow project ini kita akan membuat beberapa file, yaitu:

File WebAccount.java, file ini adalah file obyek java yang nantinya akan kita pakai sebagai obyek yang menyertai session. Atau objek ini akan kita pakai sebagai sebuah objeck yang nantinya akan diikat oleh session dan kemudian dihancurkan ketika user melakukan logout. Karena ini sebuah percobaan, kita akan membuat username dan password yang statis, artinya kita definisikan langsung didalam kelas, untuk pengembangan selanjutanya kita bisa mengambil nilai username dan password bisa dari databaseproperty file dan lain-lain.

File WebSession.javafile ini adalah sebuah kelas yang kita buat sebagai sebuah cara untuk mengikat atau melepaskan ikatan sebuah obyek terhadap session yang ada, oleh karena obyek yang akan kita pakai adalah obyek buatan kita sendiri, maka kita membuat kelas ini dengan meng-implements kelas dari HttpSessionBindingListener. Dalam kelas ini kita juga hanya akan membuat dua method yang merupakan implement dari kelasHttpSessionBindingListener, yang berguna untuk melacak apakah attribut session sudah terpasang atau dihancurkan. Methode tsb adalah valueBond, dan valueUnbound, dalam pengembangan lebih lanjut kita bisa menggunakan dua method ini sebagai penyimpanan sessiondalam database, baik ketika user login maupun ketika user logout, sehingga user yang logindan logout bisa diketahui siapa dan kapan dia beraktifitas dalam aplikasi web kita.

File index.jspfile ini adalah sebuah halaman form html yang berisi dua input yaitu usernamedan password dan sebuah tombol submit yang ketika tombol submit itu ditekan, maka formakan memposting username dan password yang diinputkan user ke halaman validate.jsp

File validate.jspfile inilah yang akan mengecek apakah username dan password sudah benar sesuai dengan nilai yang terdapat pada kelas WebAccount. File ini akan melempar userke halaman tertentu tergantung pada benar tidaknya username dan password yang dimasukkan.

File loginfail.jspfile inilah yang akan menangani jika username atau password salah, pada prosesnya file ini akan kembali melempar user ke halaman index.jsp dimana halaman index.jspberisi form login.

File main.jspfile ini adalah sebuah file yang akan bisa dimasuki atau di akses oleh user jika validasi session untuk user tsb benar. Dalam file ini, session akan diperiksa, jika attribute darisession tsb ada maka akan ditampilkan suatu halaman yang berisi welcome , namun jikasession tsb tidak ada maka user akan dilempar ke halaman login.

File logout.jspfile ini adalah sebuah file yang berisi kode untuk menghancurkan session yang ada sehingga user yang terikat pada session sebelumnya tidak terikat lagi.

Demikian file-file yang kita buat untuk bisa lebih memahami penggunaan session dalam validasi akses user ke halaman-halaman yang diakses. Untuk penjelasannya kita hanya akan membahas beberapa file saja dari file yang ada diatas yang menjadi bagian penting dari pembahasansession-tracking ini. File pertama yang kita bahas adalah file WebSession.java. perhatikan kode didalam file ini.

package org.mojo.web.util;

import org.mojo.web.model.WebAccount;

import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionBindingEvent;

/**
* Created by IntelliJ IDEA.
* User: Mojo
* Date: 09 Nov 08
* Time: 0:17:10
* To change this template use File | Settings | File Templates.
*/
public class WebSession implements HttpSessionBindingListener {
private WebAccount account;
private String remoteAddress;

public WebSession(WebAccount account, String remoteAddress) {
System.out.println("WebSession Instantiated...");
this.account = account;
this.remoteAddress = remoteAddress;
}

public void valueBound(HttpSessionBindingEvent event) {
System.out.println("New WebSession created: " + remoteAddress + "/" + account);
}

public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("WebSession Destryoyed");
}

public WebAccount getWebAccount() {
    return account;
}
}

Pada kode, diatas variabel account didefinisikan sebagai sebuah obyek WebAccount, kemudian konstruktor dari WebSession tsb didefinisikan dengan mengikutsertakan obyek account danString remoteAddress sebagai parameternya. Pada dasarnya ketika konstruktor obyek ini dipanggil maka obyek WebSession ini akan mengikat obyek  account, sehingga untuk kemudian ketika attribute session di set, maka obyek  account ini akan terpasang sebagai sebuah obyek session. Namun yang harus diperhatikan adalah sebelum attribut session di set, obyek ini belum terikat ke sessionnya. Ketika attribut session di set dengan menggunakan perintah session.setAttribut(<String Penanda>,<SembarangObjeckJava>); maka barismethod public void valueBound(HttpSessionBindingEvent event) terpanggil secara otomatis. Lantas kapan method public void valueUnbound(HttpSessionBindingEvent event)dipanggil? Method ini akan dipanggil secara otomatis pula ketika session di hancurkan, atau waktu session yang di set sudah habis.

File kedua yang akan kita bahas adalah file validate.jsp. Dalam file ini ada konsep penting yang harus kita perhatikan. Silahkan lihat barisan potongan kode yang kita ambil dari validate.jsp ini:

String URLtoDisplay    ="";
String username = request.getParameter("username").trim();
String password = request.getParameter("password").trim();
if (username.equals(null) || password.equals(null)) {
request.sendRedirect("index.jsp");
}

WebAccount wa = new WebAccount();

//validating account
if(username.equals(wa.getUserName()) && password.equals(wa.getPassword())){
       session.setMaxInactiveInterval( 900 );
       URLtoDisplay    = "main.jsp";
       WebSession ws    = new WebSession( wa, request.getRemoteAddr());
       session.setAttribute( "onlineUser", ws );
}else {
URLtoDisplay    = "loginfail.jsp";
}

request.sendRedirect(URLtoDisplay);

Pada baris kode tsb diatas kita bisa melihat variabel username dan password diambil dari parameter yang dilempar oleh form login. Kemudian ada statement branching dengan pernyataan bila username dan password adalah null maka user akan dilempar kembali ke halaman login. Jika username dan passwordnya ada maka akan kembali diprosess pada statement branching, namun pada branching yang kedua ini kita bisa melihat ada pointing ke halaman tertentu tergantung pada syarat yang masuk dalam proses tsb.

Sebelum branching ke dua kita bisa melihat bahwa ada pemanggilan obyek WebAccountdisana, dimana untuk kasus ini username dan password yang ada pada WebAccount kitahardcode. Setelah itu kita bisa melihat bahwa ada proses pencabangan yang memeriksa variabelusername dan password apakah sama dengan username dan password yang diperoleh dari obyek WebAccount. Perhatikan diatas jika username dan password yang diinputkan, sama dengan nilai username dan password yang ada pada obyek WebAccount, maka disana akan dimulai setting attribut session. Setting attribut session yang pertama adalah setting waktu sessionseperti terlihat pada kode:

session.setMaxInactiveInterval( 900 );

Baris ini memerintahkan aplikasi untuk men-setting session selama 900 detik atau sekitar 15 menit. Artinya jika tidak ada aktifitas user selama waktu 900 detik, maka secara otomatis sessionakan dihancurkan, dan user harus login kembali untuk bisa mengakses halaman-halaman yang diinginkan pada aplikasi web kita. Kemudian baris berikutnya adalah:

URLtoDisplay = “main.jsp”;

Baris ini menyatakan bahwa variabel URLtoDisplay di isi dengan nilai main.jsp, yang nantinya akan berguna untuk melempar user ke halaman main.jsp jika attribut session telah berhasil di set.

Setelah itu baris berikutnya memanggil konstruktor WebSession yang berguna untuk mengikat obyek WebAccount ke pada obyek WebSession. Seperti baris berikut ini:

WebSession ws = new WebSession( wa, request.getRemoteAddr());

Setelah WebAccount terikat pada obyek WebSession, maka langkah selanjutnya adalah mengikat obyek WebSession ini kedalam attribut session. Dengan baris kode seperti dibawah ini:

session.setAttribute( “onlineUser”, ws );

perhatikan bahwa kita mengikat obyek WebSession dengan ID sebuah string yaitu onlineUser,ID inilah yang nantinya akan menjadi titik validasi attribut session pada halaman-halaman berikutnya.

Setelah peryataan else pada branching ke dua kita melihat ada sebuah fungsi jsp yang berguna melempar user ke halaman yang memang sudah di set didalam variabel URLtoDisplay.

Sampai disini kita sudah menyelesaikan algoritma form login sampai dengan validasinya. Tinggal bagaimana kita menggunakan session-tracking, dan algoritma menghancurkan session ketika user melakukan logout.

Untuk kode menghancurkan session kita bisa langsung melihat halaman logout.jsp, karena memang sedemikian mudah menghancurkan session yang ada. Sekarang kita akan membahas bagaimana session-tracking ini di pakai pada halaman-halaman selanjutnya.

Sebagai bahan pembahasan mari kita lihat kode pada halaman main.jsp dimana selanjutnya untuk membuat halaman lain yang dapat memeriksa session yang ada kita bisa meng – copy paste saja kode utama dari pemeriksaan session ini. Perhatikan potongan kode pada halaman main.jsp di bawah ini :

    WebSession ws    = (WebSession)session.getAttribute ("onlineUser");
WebAccount acc    = null;
if( ws != null ) {
  acc    = ws.getWebAccount();
}
if (acc == null) {
  response.sendRedirect(“logout.jsp”);
}

Pada code diatas kita dapat melihat bahwa pemeriksaan session di lakukan dengan cara menginisialisasi WebSession dengan mengambil nilai dari session yang ada. Kode :

WebSession ws = (WebSession)session.getAttribute (“onlineUser”);

Kemudian obyek WebSession diperiksa, jika isi dari WebSession tidak sama dengan nullmaka obyek Account akan diambil dari obyek WebSession untuk diproses selanjutnya, karena dalam obyek WebAccount ada suatu method yang mengambil nilai-nilai dari obyek Account. Kemudian pemeriksaan dilanjutkan dengan cara memeriksa kembali jika obyek Account adalahNull maka user akan dilempar kembali ke halaman login.

Diatas bisa kita lihat bahwa pemeriksaan session hanya dilakukan oleh baris kode yang sedikit sekali sehingga kode diatas bisa copy paste kedalam halaman-halaman lain yang nantinya akan kita buat lagi, algoritmanya pun cukup sederhana, jika user tsb tidak valid maka lempar user ke halaman login, jika valid teruskan baris proses berikutnya, itu saja algoritma yang kita pakai dalamsession-tracking kali ini.

Demikianlah pembahasan session-tracking dengan halaman jsp kita kali ini, dengan tulisan ini kita berharap kita dapat lebih memahami session dan penggunaannya sebagai sebuah session-tracking pada aplikasi web.

Ada catatan: jika kita langsung menggunakan file-file contoh yang kita lampirkan dalam tulisan ini, kita harus memperhatikan baris-baris package yang terdapat pada header file seperti yang ada pada file WebAccount.java dan WebSession.java. File-file tsb harus ditempatkan pada package yang benar sesuai dengan yang dideklarasikan pada header file-file tsb. Jika mendownload langsung, harus diperhatikan ekstension yang dipakai pada file tsb. Silahkan dicoba dan dikembangkan.

Semoga bermanfaat

Menteng, 9 November 2008.

 

Josescalia

Arsip Tulisanku, Kembali Ku Temukan

Akhirnya, saya menemukan kembali arsip tulisan saya yang dulu pernah di muat di Tabloid PC-Plus Edisi 185, 20-26 Juli 2004. Tulisan yang dulu saya maksudkan untuk menggali kreatifitas para Computer Freak ini, secara personal saya sendiri tidak punya kopiannya, sebab saya ingat betul waktu tabloid yang memuat tulisan tsb saya beli, saat itu juga terjadi banjir di rumah saya sehingga semua bukti fisik dari artikel saya itu rusak dan akhirnya musnah entah kemana sebelum saya mampu abadikan.
Sedang iseng, sehabis menyantap sarapan pagi ini tanggal 06 November 2008 pukul 9.30, saya ketik String Mengalihbahasakan Sendiri Windows” dengan tanda kutip lengkap di string tsb pada Google,  dan saya kaget ternyata ada 5 link yang termuat di hasil pencarian Google tsb, dan dalam link tsb ternyata ada file fisik yang bisa didownload.
Setelah saya buka hasil download tsb ternyata filenya berupa PDF file yang ternyata merupakan hasil scan asli Tabloid tsb. Alhamdulillah akhirnya ketemu kembali Tulisan ini. Meski sudah lama dan mungkin ilmu dalam artikel ini tidak bisa lagi digunakan, yang jelas ini sangat berarti buat saya.
Saya mengucapkan terima kasih yang sebanyak-banyaknya kepada admin/pengelola :
  1. http://www.ilma95.net
  2. http://pustaka78.com
  3. http://rumahebook.com
Yang telah mengabadikan tulisan saya bahkan dari sumbernya langsung yakni hasil scan Tabloid PC Plus edisi 185, 20-26 July 2004.
Jika anda ingin melihat tulisan tsb dalam bentuk aslinya yakni hasil scan Tabloid tsb. Silahkan download disini.
Thanks,
Semoga Bermanfaat
Josescalia