Посылка электронной почты из приложения
Вы, возможно, помните, что протокол SMTP (протокол для связи с почтовым сервером) - это один из протоколов, использующий TCP/IP. SMTP-сервер ждёт клиентов, чтобы послать им в случае необходимости электронную почту. Для написания простейшего SMTP-клиента необходимо понимать протокол SMTP. В Таблице продемонстрированы действия, которые необходимо выполнить, чтобы послать сообщение на SMTP-сервер:
Протокол |
Описание |
|
HELO localhost.domain.name |
Инициализация связи с SMTP-сервером |
MAIL FROM: user@emailadress.com |
Указание, кто посылает электронную почту |
RCPT TO: user@emailadress.com |
Указание, кто получает электронную почту |
DATA |
Указание, что далее следуют данные электронной почты |
(ваше e-mail-сообщение) |
Данные электронной почты (любое число строк) |
. |
Точка определяет конец электронной почты |
QUIT |
Соединение разрывается |
|
Сначала необходимо сообщить SMTP-серверу, кто вы такой. Затем необходимо сообщить SMTP-серверу, кто посылает электронную почту. Наконец посылается ключевое слово DATA, чтобы указать, что далее следуют данные электронной почты. После этого посылается тело электронной почты, разделённое точками.
Следующая программа, JavaMailTest.java, демонстрирует, как послать электронную почту из приложения, написанного на Java:
import java.io.*;
import java.net.*;
public class JavaMailTest {
static PrintStream ps = null; // посылка сообщений
static DataInputStream dis = null; // получение сообщений
public static void send(String str) throws IOException
{
ps.println(str); // посылка строки на SMTP
ps.flush(); // очистка буфера
System.out.println("Java sent: " + str);
}
public static void receive() throws IOException
{
String readstr = dis.readLine(); // получение ответа от SMTP
System.out.println("SMTP respons: " + readstr);
}
public static void main (String args[])
{
String HELO = "HELO ";
String MAIL_FROM = "MAIL FROM: user@emailadress.com ";
String RCPT_TO = "RCPT TO: user@emailadress.com ";
String SUBJECT = "SUBJECT: Java is cool!";
String DATA = "DATA"; // начало сообщения
// заметка: "\r\n.\r\n" указывает на конец сообщения
String BODY = "Java sent this!\r\n.\r\n";
Socket smtp = null; // сокет SMTP
try { // заметка: 25 - это стандартный номер порта SMTP
smtp = new Socket("smtp.any.com", 25);
OutputStream os = smtp.getOutputStream();
ps = new PrintStream(os);
InputStream is = smtp.getInputStream();
dis = new DataInputStream(is);
}
catch (IOException)
{
System.out.println("Error connection: " + e);
}
try { // скажем SMTP helo
String loc = InetAddress.getLocalHost().getHostName();
send(HELO + loc);
receive(); // получение ответа SMTP
send(MAIL_FROM); // посылка на SMTP
receive(); // получение ответа SMTP
send(RCPT_TO); // посылка адресату SMTP
receive(); // получение ответа SMTP
send(DATA); // начинается посылка на SMTP
receive(); // получение ответа SMTP
send(SUBJECT); // посылка темы на SMTP
receive(); // получение ответа SMTP
send(BODY); // посылка тела сообщения
receive(); // получение ответа SMTP
smtp.close(); //
}
catch (IOException)
{
System.out.println("Error sending: " + e);
}
System.out.println("Mail sent!");
}
}
Обратите внимание, что порция данных сообщения электронной почты состоит из двух разделов: заголовка и тела. В заголовке можно определить дополнительную информацию о сообщении. Для запуска вышеприведённого кода следует изменить название домена, а так же адреса получателя и отправителя. Можно, например, послать электронную почту самому себе.
|