Pop3 Server Dengan Socket Programming Dalam Bahasa Java
Pop3 Server Dengan Socket Programming Dalam Bahasa Java
POP3 Server
dengan
Socket Programming
dalam
Bahasa Java
Jeffrey Hermanto Halimsetiawan
[email protected]
tutorialpemrograman.wordpress.com
3 Juni 2009
tutorialpemrograman.wordpress.com - 2009 1
POP3 Server dengan Socket Programming dalam Bahasa Java
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:;
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.
tutorialpemrograman.wordpress.com - 2009 2
POP3 Server dengan Socket Programming dalam Bahasa Java
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();
while(true) {
PopRequest request = new PopRequest(listenSocket.accept());
Thread thread = new Thread(request);
thread.start();
}
}
}
}
}
}
}
PopRequest.java
/*
* 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;
InputStream is = this.client.getInputStream();
DataOutputStream dos = new
DataOutputStream(this.client.getOutputStream());
if (!this.welcome){
dos.writeBytes("+OK Hello There."+CRLF);
this.welcome = true;
}
String requestLine = "";
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);
tutorialpemrograman.wordpress.com
if (temp ==- null){
2009 6
dos.writeBytes("-ERR no such message, only
"+String.valueOf(this.listMsg.list.size())+" messages in maildrop."+CRLF);
}
else {
POP3 Server dengan Socket Programming dalam Bahasa Java
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")){
tutorialpemrograman.wordpress.com - 2009 7
this.stop = true;
User.java
/*
* 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() {
}
tutorialpemrograman.wordpress.com - 2009 8
POP3 Server dengan Socket Programming dalam Bahasa Java
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>();
}
tutorialpemrograman.wordpress.com - 2009 9
POP3 Server dengan Socket Programming dalam Bahasa Java
Message.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() {
}
ListMessage.java
/*
* 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>();
}
minus++;
}
return count;
}
Integer.parseInt(String.valueOf(iterator.text.length()),8);
}
}
return count;
}
}
}
}
tutorialpemrograman.wordpress.com - 2009 12