POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan...

12
POP3 Server dengan Socket Programming dalam Bahasa Java tutorialpemrograman.wordpress.com - 2009 1 POP3 Server dengan Socket Programming dalam Bahasa Java Jeffrey Hermanto Halimsetiawan [email protected] tutorialpemrograman.wordpress.com 3 Juni 2009

Transcript of POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan...

Page 1: POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan bagaimana caranya untuk membuat POP3 Server sederhana dengan memanfaatkan pemrograman

POP3 Server dengan Socket Programming dalam Bahasa Java

tutorialpemrograman.wordpress.com - 2009 1

POP3 Server

dengan

Socket Programming

dalam

Bahasa Java

Jeffrey Hermanto Halimsetiawan

[email protected]

tutorialpemrograman.wordpress.com

3 Juni 2009

Page 2: POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan bagaimana caranya untuk membuat POP3 Server sederhana dengan memanfaatkan pemrograman

POP3 Server dengan Socket Programming dalam Bahasa Java

tutorialpemrograman.wordpress.com - 2009 2

POP3 Server adalah tempat dimana email ditampung dari berbagai pengirim yang dibagi dalam mailbox-

mailbox dimana masing masing mailbox memiliki alamat yang unik dari pemiliknya. Mailbox tersebut memiliki

quota space yang diset oleh administrator email server tersebut. Untuk mengakses mailbox tersebut

dibutuhkan otentikasi akses dengan menggunakan konfigurasi tertentu seperti username dan password, atau

yang biasa disebut mail account. Sebuah mail account memiliki konfigurasi yang berisi informasi teknis untuk

dapat masuk dan membaca email email yang berada di POP3 Server. Selain itu, mungkin masih ada yang

bingung mengenai perbedaan POP dan SMTP, Post Office Protocol (POP) digunakan untuk membaca email

sedangkan Simple Mail Transfer Protocol (SMTP) digunakan untuk mengirim email.

Nah, dalam tulisan ini akan dijelaskan bagaimana caranya untuk membuat POP3 Server sederhana dengan

memanfaatkan pemrograman socket dalam Bahasa Java. Nantinya, e-mail yang terdapat dalam POP3 Server

dapat di-retreive dengan menggunakan telnet ataupun Mail Client seperti Outlook Express, Mozilla

Thunderbird, dan lain sebagainya. Jika program POP3 Server nya telah di-run , cukup setting salah satu Mail

Client tersebut dengan email address misalnya : jeffrey@localhost, POP3 Server : localhost, dan POP3 port :

1804. Kemudian , tinggal lakukan receive all maka semua e-mail untuk user jeffrey akan masuk ke inbox.

Sebenarnya format e-mail yang dibaca oleh e-mail client adalah seperti ini :

From [email protected] Tue Apr 7 23:08:41 2009

Return-Path: <[email protected]>

X-Original-To: jeffrey

Delivered-To: [email protected]

Received: from hai (unknown [10.151.76.203])

by klp47.com (Postfix) with SMTP id 5E5DBEAFC

for <yoga>; Tue, 7 Apr 2009 23:08:03 +0700 (WIT)

Message-Id: <[email protected]>

Date: Tue, 7 Apr 2009 23:08:03 +0700 (WIT)

From: [email protected]

To: undisclosed-recipients:;

Nyoba PJK jeh.....

Dalam program POP3 Server yang akan dibuat ini, nantinya akan terdapat file user.txt yang menyimpan

username dan password , contoh :

jeffrey 12345

jeff 12345

Kemudian setiap user akan mempunyai file yang bernama seperti username nya yang didalamnya berisi e-mail

yang formatnya seperti format di atas yang ditujukan untuk user tersebut. Jadi, nantinya aka nada file jeffrey

dan jeff.

Page 3: POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan bagaimana caranya untuk membuat POP3 Server sederhana dengan memanfaatkan pemrograman

POP3 Server dengan Socket Programming dalam Bahasa Java

tutorialpemrograman.wordpress.com - 2009 3

Main.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package jhhs;

import java.io.BufferedReader;

import java.io.FileReader;

import java.net.ServerSocket;

import java.util.StringTokenizer;

import jhhs.unit.ListMessage;

import jhhs.unit.ListUser;

/**

*

* @author Jeffrey

*/

public class Main {

public static ListUser listUser = new ListUser();

public static void main(String [] args) throws Exception{

loadUser(listUser);

int PORT = 1804;

ServerSocket listenSocket = new ServerSocket(PORT);

while(true) {

PopRequest request = new PopRequest(listenSocket.accept());

Thread thread = new Thread(request);

thread.start();

}

}

//method untuk me-load data-data user yang terdaftar

private static void loadUser(ListUser listUser){

try {

FileReader fr = new FileReader("user.txt");

BufferedReader br = new BufferedReader(fr);

while (br.ready()){

StringTokenizer st = new StringTokenizer(br.readLine());

listUser.addUser(st.nextToken(), st.nextToken());

}

} catch (Exception ex) {

}

}

//method untuk me-load data-data message yang ada

public static void loadMessage(ListMessage listMessage, String user){

try {

FileReader fr = new FileReader(user);

BufferedReader br = new BufferedReader(fr);

String tempMsg = "";

while (br.ready()){

String temp = br.readLine();

if (temp.contains("From " ) && !tempMsg.matches("") ){

listMessage.addMessage(tempMsg);

tempMsg = "";

}

tempMsg += temp +"\n";

}

if (!tempMsg.matches("")){

listMessage.addMessage(tempMsg);

Page 4: POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan bagaimana caranya untuk membuat POP3 Server sederhana dengan memanfaatkan pemrograman

POP3 Server dengan Socket Programming dalam Bahasa Java

tutorialpemrograman.wordpress.com - 2009 4

PopRequest.java

String temp = br.readLine();

if (temp.contains("From " ) && !tempMsg.matches("") ){

listMessage.addMessage(tempMsg);

tempMsg = "";

}

tempMsg += temp +"\n";

}

if (!tempMsg.matches("")){

listMessage.addMessage(tempMsg);

}

} catch (Exception ex) {

}

}

}

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package jhhs;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.InputStream;

import java.net.Socket;

import java.util.StringTokenizer;

import jhhs.unit.ListMessage;

import jhhs.unit.Message;

import jhhs.unit.User;

/**

*

* @author Jeffrey

*/

public class PopRequest implements Runnable{

final static String CRLF ="\r\n";

public Socket client;

private boolean login;

private boolean stop;

private boolean welcome;

public User curUser;

public ListMessage listMsg;

public PopRequest(Socket client) throws Exception {

this.client = client;

this.login = false;

this.stop = false;

this.listMsg = new ListMessage();

this.welcome = false;

}

public void run() {

try {

while (!stop){

this.processRequest();

}

} catch (Exception ex) {

ex.printStackTrace();

}

Page 5: POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan bagaimana caranya untuk membuat POP3 Server sederhana dengan memanfaatkan pemrograman

POP3 Server dengan Socket Programming dalam Bahasa Java

tutorialpemrograman.wordpress.com - 2009 5

public void run() {

try {

while (!stop){

this.processRequest();

}

} catch (Exception ex) {

ex.printStackTrace();

}

}

private void processRequest() throws Exception{

InputStream is = this.client.getInputStream();

DataOutputStream dos = new

DataOutputStream(this.client.getOutputStream());

DataInputStream br = new DataInputStream(is);

if (!this.welcome){

dos.writeBytes("+OK Hello There."+CRLF);

this.welcome = true;

}

String requestLine = "";

byte ab[] = new byte[512];

br.read(ab);

for (byte counter : ab){

if (counter == 0)

break;

requestLine += (char) counter;

}

System.out.print(requestLine);

//jika user melakukan ^] atau CTRL+] pada Telnet

if (requestLine == null){

this.curUser = null;

this.stop = true;

// close connection

dos.close();

is.close();

client.close();

return;

}

StringTokenizer st = new StringTokenizer(requestLine);

String command = st.nextToken();

if (! login){

if (command.equalsIgnoreCase("quit")){

this.stop = true;

this.curUser = null;

dos.writeBytes("+OK dewey POP3 server signing off."+CRLF);

// close connection

dos.close();

is.close();

client.close();

}

if (this.curUser == null){

if (command.equalsIgnoreCase("user") && st.hasMoreTokens()){

this.curUser = new User();

this.curUser.user = st.nextToken();

if (Main.listUser.findUser(this.curUser.user)){

dos.writeBytes("+OK name is a valid mailbox."+CRLF);

}

else {

Page 6: POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan bagaimana caranya untuk membuat POP3 Server sederhana dengan memanfaatkan pemrograman

POP3 Server dengan Socket Programming dalam Bahasa Java

tutorialpemrograman.wordpress.com - 2009 6

if (this.curUser == null){

if (command.equalsIgnoreCase("user") && st.hasMoreTokens()){

this.curUser = new User();

this.curUser.user = st.nextToken();

if (Main.listUser.findUser(this.curUser.user)){

dos.writeBytes("+OK name is a valid mailbox."+CRLF);

}

else {

dos.writeBytes("-ERR sorry, no mailbox for

"+this.curUser.user+" here."+CRLF);

this.curUser = null;

}

}

else {

dos.writeBytes("-ERR command not found!!"+CRLF);

}

}

else {

//command untuk pass

if (command.equalsIgnoreCase("pass") && st.hasMoreTokens()){

this.curUser.pass = st.nextToken();

boolean authenticated =

Main.listUser.authenticate(this.curUser.user, this.curUser.pass);

if (authenticated){

this.login = true;

Main.loadMessage(this.listMsg, this.curUser.user);

dos.writeBytes("+OK maildrop locked and ready."+CRLF);

}

else{

dos.writeBytes("-ERR invalid password."+CRLF);

this.curUser = null;

}

}

else {

dos.writeBytes("-ERR command not found!!"+CRLF);

}

}

}

else {

// Command untuk list

if (command.equalsIgnoreCase("list")){

if (!st.hasMoreTokens()){

dos.writeBytes("+OK

"+String.valueOf(this.listMsg.list.size())+" messages."+CRLF);

int i = 1;

String msg = "";

for (Message iterator : this.listMsg.list){

msg += String.valueOf(i) + " " +

Integer.toOctalString(iterator.text.length()) + CRLF;

dos.writeBytes(msg);

msg = "";

i++;

}

dos.writeBytes("."+CRLF);

}

else {

int pil = Integer.parseInt(st.nextToken());

Message temp = this.listMsg.findMessage(pil);

if (temp == null){

dos.writeBytes("-ERR no such message, only

"+String.valueOf(this.listMsg.list.size())+" messages in maildrop."+CRLF);

}

else {

dos.writeBytes(String.valueOf(pil)+"

Page 7: POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan bagaimana caranya untuk membuat POP3 Server sederhana dengan memanfaatkan pemrograman

POP3 Server dengan Socket Programming dalam Bahasa Java

tutorialpemrograman.wordpress.com - 2009 7

else {

int pil = Integer.parseInt(st.nextToken());

Message temp = this.listMsg.findMessage(pil);

if (temp == null){

dos.writeBytes("-ERR no such message, only

"+String.valueOf(this.listMsg.list.size())+" messages in maildrop."+CRLF);

}

else {

dos.writeBytes(String.valueOf(pil)+"

"+Integer.toOctalString(temp.text.length())+CRLF);

}

}

}

// Command untuk Retr

else if (command.equalsIgnoreCase("retr")){

if (st.hasMoreTokens()){

int choice = Integer.parseInt(st.nextToken());

//System.out.println(choice);

Message temp = this.listMsg.findMessage(choice);

if (temp == null){

dos.writeBytes("-ERR no such message."+CRLF);

}

else {

dos.writeBytes("+OK

"+Integer.toOctalString(temp.text.length())+" octets."+CRLF);

dos.writeBytes(temp.text+CRLF);

}

dos.writeBytes("."+CRLF);

}

else dos.writeBytes("-ERR no such message."+CRLF);

}

else if (command.equalsIgnoreCase("dele")){

if (st.hasMoreTokens()){

int choice = Integer.parseInt(st.nextToken());

//System.out.println(choice);

Message temp = this.listMsg.findMessage(choice);

if (temp == null){

dos.writeBytes("-ERR no such message."+CRLF);

}

else {

if (!temp.deleted){

temp.deleted = true;

dos.writeBytes("+OK message

"+String.valueOf(choice)+" deleted."+CRLF);

}

else {

dos.writeBytes("-ERR message

"+String.valueOf(choice)+" already deleted."+CRLF);

}

}

}

else dos.writeBytes("-ERR no such message."+CRLF);

}

else if (command.equalsIgnoreCase("stat")){

int count = this.listMsg.countMessage();

int length = this.listMsg.countLengthMessage();

dos.writeBytes("+OK "+count+" "+length+"."+CRLF);

}

else if (command.equalsIgnoreCase("quit")){

this.stop = true;

int count = this.listMsg.deleteMessage();

this.listMsg.printToFile(this.curUser.user);

this.curUser = null;

Page 8: POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan bagaimana caranya untuk membuat POP3 Server sederhana dengan memanfaatkan pemrograman

POP3 Server dengan Socket Programming dalam Bahasa Java

tutorialpemrograman.wordpress.com - 2009 8

User.java

dos.writeBytes("+OK "+count+" "+length+"."+CRLF);

}

else if (command.equalsIgnoreCase("quit")){

this.stop = true;

int count = this.listMsg.deleteMessage();

this.listMsg.printToFile(this.curUser.user);

this.curUser = null;

dos.writeBytes("+OK dewey POP3 server signing off (maildrop

empty)."+CRLF);

// close connection

dos.close();

is.close();

client.close();

}

else {

dos.writeBytes("-ERR command not found!!"+CRLF);

}

}

}

}

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package jhhs.unit;

/**

*

* @author Jeffrey

*/

public class User {

public String user;

public String pass;

public User() {

}

public User(String user, String pass) {

this.user = user;

this.pass = pass;

}

}

Page 9: POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan bagaimana caranya untuk membuat POP3 Server sederhana dengan memanfaatkan pemrograman

POP3 Server dengan Socket Programming dalam Bahasa Java

tutorialpemrograman.wordpress.com - 2009 9

ListUser.java

package jhhs.unit;

import java.util.ArrayList;

/**

*

* @author Jeffrey

*/

public class ListUser {

public ArrayList<User> list;

public ListUser() {

this.list = new ArrayList<User>();

}

public void addUser(String user, String pass){

User newUser = new User(user, pass);

this.list.add(newUser);

}

public boolean findUser(String user){

for (User iterator : this.list){

if (iterator.user.matches(user)){

return true;

}

}

return false;

}

public boolean authenticate(String user, String pass){

for (User iterator : this.list){

if (iterator.user.matches(user) && iterator.pass.matches(pass)){

return true;

}

}

return false;

}

public void showUser(){

for (User iterator : this.list){

System.out.println(iterator.user+" "+iterator.pass);

}

}

}

Page 10: POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan bagaimana caranya untuk membuat POP3 Server sederhana dengan memanfaatkan pemrograman

POP3 Server dengan Socket Programming dalam Bahasa Java

tutorialpemrograman.wordpress.com - 2009 10

Message.java ListMessage.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package jhhs.unit;

/**

*

* @author Jeffrey

*/

public class Message {

public String text;

public boolean deleted;

public Message() {

}

public Message(String text) {

this.text = text;

this.deleted = false;

}

}

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package jhhs.unit;

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.util.ArrayList;

/**

*

* @author Jeffrey

*/

public class ListMessage {

public ArrayList<Message> list;

public ListMessage() {

this.list = new ArrayList<Message>();

}

public void addMessage(String text){

Message newMessage = new Message(text);

this.list.add(newMessage);

}

public Message findMessage(int choice){

int i = 1;

for (Message iterator : this.list){

if (i == choice){

return iterator;

}

i++;

}

return null;

}

Page 11: POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan bagaimana caranya untuk membuat POP3 Server sederhana dengan memanfaatkan pemrograman

POP3 Server dengan Socket Programming dalam Bahasa Java

tutorialpemrograman.wordpress.com - 2009 11

public Message findMessage(int choice){

int i = 1;

for (Message iterator : this.list){

if (i == choice){

return iterator;

}

i++;

}

return null;

}

public int deleteMessage(){

int count = 0,

index = 0;

ArrayList<Integer> del = new ArrayList<Integer>();

System.out.println("Message : ");

for (Message iterator : this.list){

if (iterator.deleted){

System.out.println(iterator.text.substring(0, 30));

del.add(Integer.valueOf(index));

count++;

}

index++;

}

int minus = 0;

for (Integer counter : del){

System.out.println(counter.intValue() - minus);

System.out.println(this.list.get(counter.intValue() - minus).text);

this.list.remove(counter.intValue() - minus);

minus++;

}

return count;

}

public void showMessage(){

for (Message iterator : this.list){

System.out.println(iterator.text);

}

}

public int countMessage(){

int count = 0;

for (Message iterator : this.list){

if (!iterator.deleted){

count++;

}

}

return count;

}

public int countLengthMessage(){

int count = 0;

for (Message iterator : this.list){

if (!iterator.deleted){

count +=

Integer.parseInt(String.valueOf(iterator.text.length()),8);

}

}

return count;

}

public void printToFile(String user){

FileWriter fw;

Page 12: POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan bagaimana caranya untuk membuat POP3 Server sederhana dengan memanfaatkan pemrograman

POP3 Server dengan Socket Programming dalam Bahasa Java

tutorialpemrograman.wordpress.com - 2009 12

Integer.parseInt(String.valueOf(iterator.text.length()),8);

}

}

return count;

}

public void printToFile(String user){

FileWriter fw;

try {

fw = new FileWriter(user);

BufferedWriter bw = new BufferedWriter(fw);

bw.flush();

for (Message iterator : this.list){

bw.write(iterator.text);

}

bw.close();

fw.close();

} catch (Exception ex) {

}

}

}