POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan...
Transcript of POP3 Server dengan Socket Programming dalam Bahasa Java · Nah, dalam tulisan ini akan dijelaskan...
POP3 Server dengan Socket Programming dalam Bahasa Java
tutorialpemrograman.wordpress.com - 2009 1
POP3 Server
dengan
Socket Programming
dalam
Bahasa Java
Jeffrey Hermanto Halimsetiawan
tutorialpemrograman.wordpress.com
3 Juni 2009
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.
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);
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();
}
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 {
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)+"
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;
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;
}
}
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);
}
}
}
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;
}
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;
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) {
}
}
}