15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту

Посылка электронной почты из приложения


Вы, возможно, помните, что протокол 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!");
   }
}

Обратите внимание, что порция данных сообщения электронной почты состоит из двух разделов: заголовка и тела. В заголовке можно определить дополнительную информацию о сообщении. Для запуска вышеприведённого кода следует изменить название домена, а так же адреса получателя и отправителя. Можно, например, послать электронную почту самому себе.