Главная Контакты


  На сайте

  Java, JavaScript
  Документация Perl
  Документация PHP
  Документация ASP
  Новости сайта
  Flash
  Интернет протоколы
  Apache
  Уроки программирования
  Язык программирования C
 


почтовая программа - своими руками!


Листинг 1// Базовый класс для приема сообщений от // почтового сервера (с использованием // протокола POP3). // Формируем пакет package Mitrich.mail; // Импортируем нужные классы import java.io.*; import java.net.*; import java.util.Enumeration; import java.util.Vector; import java.util.StringTokenizer; // Вспомогательный класс. См. листинг 2 import Mitrich.mail.POPException; // Главный класс реализации протокола POP3 public class POPClient { // После окончания отладки установить false private final static boolean debug = true; // Номер порта POP3 public final static short POP3_PORT = 110; // Константы класса private final String EOL = "rn"; private final String S_OK = "+OK"; private final String S_ERR = "-ERR"; // Поля класса private POPCommand command = null; private POPResponse response = null; private Socket socket = null; private BufferedReader ir = null; private PrintWriter ow = null; private PrintWriter log = null; private Vector messages = null; private boolean logEnabled = false; // Конструктор по умолчанию public POPClient() { // Создаем экземпляр класса команды command = this.new POPCommand(); // Создаем экземпляр класса ответа сервера response = this.new POPResponse(); } // Этот конструктор создает файл протокола // с именем, заданным параметром logName public POPClient(String logName) { this(); logEnabled = true; try { // Создадим поток вывода в файл протокола // с автоматическим сбросом буферов на диск log = new PrintWriter( new FileOutputStream(logName, true), true); } catch(IOException e) { // Возникла проблема с созданием файла протокола // Протоколирование отключается logEnabled = false; } } // Финализатор protected void finalize() throws Throwable { // Отсоединиться от почтового сервера, если // пользователь забыл вызвать метод disconnect() disconnect(); } // Установить соединение с почтовым сервером public boolean connect(String hostName, int portNumber) throws POPException { try { logText("Creating a socket..."); // Создаем сокет socket = new Socket(hostName, portNumber); logText("Creating an input stream..."); // Получаем ссылку на поток ввода данных от сокета ir = new BufferedReader( new InputStreamReader( socket.getInputStream())); logText("Creating an output stream..."); // Получаем ссылку на поток вывода данных в сокет ow = new PrintWriter( new DataOutputStream( socket.getOutputStream()), true); // Слушаем ответ сервера command.readCommandResponse(); // Ответ +OK или -ERR ? return response.isSucceed(); } catch(UnknownHostException e) { logText("Host unknown"); // Заданный адрес сервера недействителен throw new POPException(POPException.HOST_UNKNOWN); } catch(IOException e) { logText("Creating an I/O channel failed"); // Ошибка сокета. Возможно, сервер отключился throw new POPException(POPException.SOCKET_ERROR); } } // Отключаемся от сервера public void disconnect() { try { logText("Disconnecting... "); // Посылается запрос на отключение command.quit(); if(ir != null) { ir.close(); ir = null; } if(ow != null) { ow.close(); ow = null; } if(socket != null) { socket.close(); socket = null; } if(log != null) { log.close(); log = null; } } catch(Exception e) { logText("Disconnection failed");} } // Записать строку в файл протокола public void logText(String text) { if(logEnabled) log.println(text); if(debug) System.out.println(text); } // Входим в почтовый сервер public void login(String name, String password) throws POPException { logText("Sending the user name..."); // Передаем имя пользователя серверу if( !command.user(name) ) throw new POPException(POPException.BAD_NAME); logText("Sending the password..."); // Если пароль есть, то передаем его серверу if(password != null) if( !command.pass(password) ) throw new POPException(POPException.BAD_PASSWORD); } // Загрузить всю почту на компьютер пользователя public void downloadMessages() throws POPException { StringTokenizer st = null; String tmpStr = null; // Создаем пустой вектор для хранения сообщений messages = new Vector(); // Перебираем сообщения на сервере for(int i = 1; command.list(i); i++) { // Если сообщение с заданным номером имеется, // считать его с сервера if(command.retr(i)) { // Найти место в данных, где находится первая // отметка конца строки int offset = response.buff.indexOf(EOL); // Записать сообщение в вектор, отрезав от // него строку статуса messages.addElement( response.buff.substring( offset + EOL.length())); } else throw new POPException(POPException.RETR_ERROR); } } // Возвращает пользователю текст сообщения. // Нумерация начинается с 1 public String getMessage(int number) { return (String)messages.elementAt(number - 1); } // Удаляет сообщение. Нумерация начинается с 1 public boolean deleteMessage(int number) throws POPException { if(command.dele(number)) { // Удалить сообщение из вектора messages.removeElementAt(number-1); return true; } return false; } // Отменить удаление сообщений, которые были // удалены вызовом метода deleteMessage() public boolean undoDeletes() throws POPException { if(command.rset()) { messages = null; // Перезагрузить почту с сервера downloadMessages(); return true; } return false; } // Этот внутренний класс предварительно сохраняет // необработанные данные class POPResponse { // Временное хранилище полученных данных private String buff = ""; // Возвращает true, если последняя команда // выполнена успешно, false - если // неудачно. Возбуждает исключение, если // сервер прислал неопределенный ответ public boolean isSucceed() throws POPException { boolean result = true; if(!buff.startsWith(S_OK)) { if(!buff.startsWith(S_ERR)) { throw new POPException(POPException.BAD_RESPONSE); } result = false; } return result; } // Записать данные во временный буфер protected void setBuff(String s) { buff = s; } // Считать данные из временного буфера protected String getBuff() { return buff; } // Возвратить данные без статусного признака protected String cutOffStatus() { int offset = buff.indexOf(' '); if(offset != -1) { String tmpStr = buff.substring(offset); return tmpStr.trim(); } return null; } // Получить комментарий сервера к последней // выполненной команде public String getServerComment() { String tmpStr = null; tmpStr = cutOffStatus(); int offset = tmpStr.indexOf(EOL); if(offset != -1) return tmpStr.substring(0, offset); return null; } } // Внутренний класс для представления команды, // посылаемой серверу class POPCommand { // Посылает строку почтовому серверу private void sendCommand(String command) throws POPException { logText("Sending command... "); try{ ow.println(command); } catch(IOException e) { throw new POPException(POPException.IO_ERROR); } } // Получить ответ на служебную команду private void readCommandResponse() throws POPException { logText("Reading response..."); StringBuffer tmpBuff = new StringBuffer(); try { tmpBuff.append(ir.readLine()); } catch(IOException e) { throw new POPException(POPException.IO_ERROR); } response.setBuff(tmpBuff.toString()); } // Считать почтовое сообщение private void readMessage() throws POPException { logText("Reading message..."); String tmpStr = new String(""); StringBuffer tmpBuff = new StringBuffer(); try { // Читать строку за строкой, пока не будет // найдена строка-терминатор. while(!(tmpStr = ir.readLine()).equals(".")) tmpBuff.append(tmpStr + "rn"); } catch(IOException e) { throw new POPException(POPException.IO_ERROR); } tmpStr = tmpBuff.toString(); response.setBuff(tmpStr); } // Метод-оболочка для выполнения типичной команды private boolean transactCommand(String command) throws POPException { sendCommand(command); readCommandResponse(); return response.isSucceed(); } // Команды передачи имени пользователя public boolean user(String name) throws POPException { return transactCommand("USER " + name); } // Команды передачи пароля public boolean pass(String password) throws POPException { return transactCommand("PASS " + password); } // Команда завершения сеанса работы с почтой public boolean quit() throws POPException { return transactCommand("QUIT"); } // Команда удаления сообщения public boolean dele(int number) throws POPException { if(number != 0) return transactCommand("DELE " + Integer.toString(number)); else return false; } // Команда отмены удаления public boolean rset() throws POPException { return transactCommand("RSET"); } // Получить информацию о сообщении public boolean list(int number) throws POPException { if(number != 0) return transactCommand("LIST " + Integer.toString(number)); else return false; } // Команда чтения сообщения с сервера public boolean retr(int number) throws POPException { if(number != 0) { sendCommand("RETR " + Integer.toString(number)); readMessage(); return response.isSucceed(); } else return false; } } } Листинг 2// Вспомогательный класс представляет исключения, // которые могут возникнуть в процессе работы // Автор - Дмитрий Рамодин // Изд. дом "Открытые Системы" // // Формируем пакет package Mitrich.mail; public class POPException extends Exception { // Константы типов исключительных ситуаций public static final int NOT_AVAILABLE = 0; public static final int BAD_RESPONSE = 1; public static final int BAD_NAME = 2; public static final int BAD_PASSWORD = 3; public static final int SOCKET_ERROR = 4; public static final int HOST_UNKNOWN = 5; public static final int IO_ERROR = 6; public static final int RETR_ERROR = 7; // Причина возникновения исключения private static int why = NOT_AVAILABLE; // Конструктор по умолчанию public POPException() { super(); } // Конструктор со строкой public POPException(String message) { super(message); } // Конструктор, в котором задается причина // исключительной ситуации public POPException(int reason) { super(POPException.assignMessage(reason)); } // Задать строку, соответствующую причине private static String assignMessage(int reason) { why = reason; switch(reason) { case BAD_RESPONSE: return new String( "Bad response from the mail servern"); case SOCKET_ERROR: return new String( "Socket I/O couldn't be establishedn"); case BAD_NAME: return new String( "There is not such user namen"); case BAD_PASSWORD: return new String( "Invalid passwordn"); case HOST_UNKNOWN: return new String( "Wrong hostnamen"); case IO_ERROR: return new String( "I/O operation error.n"); case RETR_ERROR: return new String( "Fatal error occured during message readingn"); default: return new String( "Unknown POPClient failuren"); } } // Возвращает причину исключительной ситуации public int why() { return why; } }

Другие статьи по теме:

- революция java
- Java: русские буквы и не только...
- Java-приложение: заглянем внутрь
- возможности языка java
- практическое введение в программирование на javascript


Голосование:
Чего Вы хотели бы видеть больше на сайте?

Статей, документации
Скриптов
Программ для вебмастера
Я не знаю



Другие голосования

Обмен кнопочками:



Приглашаем Вас обменяться кнопочками! Обращайтесь к администратору.


Новые статьи:


Наши партнеры:





2006-2024 © SMTI.RU
Главная страница | Связаться с нами