Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Изучаем SMTP протокол для отправки писем (примеры программ на WinSock API и INDY)

-

Школа Читера

- Основы основ - начинаем писать статьи для начинающих с целью создания полноценного раздела

Ответ
 
Опции темы
Старый 11.08.2010, 12:42   #1
Super Moderator
 Маршал
Аватар для Тигрь
 
Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(
Регистрация: 05.05.2009
Сообщений: 875
Популярность: 48955
Золото Zhyk.Ru: 850
Сказал(а) спасибо: 155
Поблагодарили 739 раз(а) в 274 сообщениях
 
Thumbs up Изучаем SMTP протокол для отправки писем (примеры программ на WinSock API и INDY)

Описание протокола SMTP и примеры работы с ним.


На написание этой статьи меня подтолкнул тот факт, что многие пишут программы для отправки почты с использованием каких либо компонентов, но на самом деле даже не представляют как происходит обмен данными между почтовым клиентом и сервером. Сегодня мы рассмотрим, как отправить почту, используя протокол SMTP (Simple Mail Transfer Protocol). Для начала мы выполним ручную отправку почты с помощью Telnet-клиента putty, и наконец, то узнаем, как происходит процесс отправки почты. Затем напишем программу на низком уровне с использованием WinSock API. И напоследок разберем возможные ошибки при работе с SMTP протоколом, а также устранение этих ошибок при работе со сторонними компонентами.
Сразу хочется отметить, что SMTP это текстовый протокол и общение с сервером происходит следующим образом:
Клиент передает на сервер строку команда<пробел>параметры<перевод строки>. Сервер отвечает на каждую команду строкой, содержащей код ответа и текстовое сообщение, отделенное пробелом. Код ответа — число от 100 до 999, представленное в виде строки, трактующийся следующим образом:
  • 2ХХ — команда успешно выполнена
  • 3XX — ожидаются дополнительные данные от клиента
  • 4ХХ — временная ошибка, клиент должен произвести следующую попытку через некоторое время
  • 5ХХ — неустранимая ошибка
Текстовая часть ответа носит справочный характер и предназначена для человека, а не программы.
Для отправки письма нам нужно подключиться к почтовому серверу. Работать будем с mail.ru, я зарегал специально мыло [Ссылки могут видеть только зарегистрированные пользователи. ] для статьи. Запускаем putty и настраиваем его на подключение к почтовому серверу.

[Ссылки могут видеть только зарегистрированные пользователи. ]

В поле “Host Name (or IP address)” вводим адрес SMTP сервера, раз мы решили использовать сервер mail.ru, то пишем smtp.mail.ru. В поле “Port” указываем порт сервера, по умолчанию это 25 порт, в группе переключателей “ Connection type: ” выбираем тип соединения “Telnet”, в принципе все готово, теперь нажимаем на кнопку “Open” и подключаемся к серверу. Как видно на скрине, сервер уведомил нас об успешном подключении кодом 220.

[Ссылки могут видеть только зарегистрированные пользователи. ]

Теперь нам нужно представиться, для этого используется команда “HELO имя”, в качестве имени принято использовать имя своего компьютера, если подключение осуществляется с локального компа, или имя/IP-адрес своего хоста, если подключение осуществляется с веб-сервера каким либо скриптом. Имя компьютера можно узнать, нажав правой кнопкой на значке “Мой компьютер”, у меня оно “TurPb”

[Ссылки могут видеть только зарегистрированные пользователи. ]

[Ссылки могут видеть только зарегистрированные пользователи. ]

Код:
HELO TurPb
При успешном выполнении команды, сервер ответит нам кодом 250.
Далее нам нужно авторизоваться, для этого используем команду:

Код:
AUTH LOGIN
сервер ответил нам кодом 334 и непонятным сообщением (“334 VXNlcm5hbWU6”). Как мы уже знаем коды 3XX означают, что требуются дополнительные параметры, но что, же требует от нас сервер? Оказывается это непонятное сообщение закодировано в Base64.Ррасшифруем текст, для этой цели я написал простенький конвертер “Base64Converter”, позволяющий зашифровывать и расшифровывать сообщения в Base64. После расшифровки мы видим, что это не что иное как “Username:”,

[Ссылки могут видеть только зарегистрированные пользователи. ]

значит сервер просит нас сказать ему логин. Ответ нужно передавать тоже в кодировке Base64, в качестве логина будем использовать [Ссылки могут видеть только зарегистрированные пользователи. ] (это часть е мейла до @, в качестве логина так же можно использовать все мыло целиком [Ссылки могут видеть только зарегистрированные пользователи. ]), закодируем его в Base64

[Ссылки могут видеть только зарегистрированные пользователи. ]

и пошлем серверу:

Код:
d3d3LmdjZHRlYW0uN2lsLnJ1
Далее сервер как все уже догадались, попросит у нас пароль “334 UGFzc3dvcmQ6”, кодируем наш пароль “qwerty” в Base64 и посылаем серверу:

Код:
cXdlcnR5
на что он довольно ответит “ 235 Authentication succeeded”.
После успешной авторизации перейдем к отправке письма. Отправлять будем на ящик [Ссылки могут видеть только зарегистрированные пользователи. ] я его зарегистрировал в сервисе [Ссылки могут видеть только зарегистрированные пользователи. ] что бы долго не париться. Сообщим серверу, кто является отправителем письма:

Код:
MAIL FROM:<[Ссылки могут видеть только зарегистрированные пользователи. ]>
Сервер ответит нам кодом “250 Accepted” что снова говорит об успешном выполнении команды.
Затем укажем получателя письма:

Код:
RCPT TO:<[Ссылки могут видеть только зарегистрированные пользователи. ]>
Сервер ответит нам кодом 250. После этого сформируем само тело письма. Для этого используем команду:

Код:
DATA
Сервер говорит нам “354 Enter message, ending with "." on a line by itself”. Далее вводим заголовок, кодировку и сам текст сообщения:

Код:
From: <[Ссылки могут видеть только зарегистрированные пользователи. ]>
To: <[Ссылки могут видеть только зарегистрированные пользователи. ]>
Subject: Test message
MIME-Version: 1.0
Content-Type: text/plain; charset="windows-1251"
Привет, Тигрь! Это тестовое сообщение для статьи. =)
.
Я думаю тут все понятно. Сообщение заканчивается точкой “.” на новой строке, именно так сервер определит что сообщение закончилось и его следует отправлять.
Если все прошло успешно то сервер в который раз ответит нам командой 250.
После отправки письма необходимо завершить сессию:

Код:
QUIT
[Ссылки могут видеть только зарегистрированные пользователи. ]

Проверим почту и убедимся что сообщение пришло:

[Ссылки могут видеть только зарегистрированные пользователи. ]

Вот в принципе и все. Именно таким образом передают почту различные компоненты, например INDY.

Вот мы и подошли ко второму этапу, написания программы на WinSock API.
WinSock это сетевая библиотека Windows, и находится в папке C:\Windows\System32 под именем WINSOCK.DLL. Я не буду подробно разжевывать работу с WinSock API, а лишь приведу функции которые нам понадобятся и их описание, исходники будут приложены к статье и в них не трудно будет разобраться. Для того что бы Delphi понимал что мы используем WinSock API то нужно подключить модуль winsock. В нем содержатся необходимые объявления импортируемых функций WinSock API и базовые структуры данных.
Функция с которой начинается написание любой программы использующей WinSock API:

Код:
function WSAStartup(wVersionRequired: word; var WSData: TWSAData): Integer; stdcall;
Функция инициализирует библиотеку WinSock. Она содержит два параметра:
wVersionRequested – входящий параметр - версия инициализируемой библиотеки.
WSAData – исходящий параметр - указатель на структуру WSAData. После выполнения функции в эту структуру запишется информация о сетевой библиотеке.
В случае успешного выполнения функция возвращает значение ноль, в противном случае код ошибки.
Для получения кодов ошибок в WinSock API служит функция WSAGetLastError():
Код:
function WSAGetLastError: Integer; stdcall;
Ей не нужно передавать какие-либо параметры, после вызова она возвращает код последней возникшей ошибки при работе с сетевыми функциями.

Код:
function socket(af, Struct, protocol: Integer): TSocket; stdcall;
Функция создает сокет. Входящие параметры:
af - спецификация семейства сокетов (PF_INET, PF_IPX и др.)
type - тип создаваемого сокета. Может быть SOCK_STREAM (для протокола TCP/IP) и SOCK_DGRAM (UDP).
protocol - специфический протокол, который будет использоваться сокетом
Если функция выполнена без ошибок, она возвращает дескриптор на новый сокет, если ошибки есть, возвращается INVALID_SOCKET.

Код:
function connect(s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
Функция соединения для клиента. Параметры:
s - дескриптор, идентифицирующий сокет (это значение возвращает функция socket)
name - структура SockAddr, содержащая данные, необходимые для подключения (протокол, адрес удаленного компьютера, порт)
namelen - размер структуры типа TSockAddr (можно получить, используя функцию sizeof)
В случае успешного коннекта функция возвращает значение ноль. Если коннект не удался, возвращаемое значение - SOCKET_ERROR (код ошибки можно получить, используя функцию WSAGetLastError).

Две функции для отправки и приема данных в/из сокета соответственно:
Код:
function send(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
function recv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
Параметры у них одинаковые:
s - сокет, на который нужно отправить (или принять) данные.
buf - буфер с данными для отправки (приема).
len - размер передаваемых (принимаемых) данных.
flags - флаги, отвечающие за метод отправки (приема).
Выполнившись, функция вернет фактическое количество отправленных/принятых байт.

Код:
function CloseSocket(s:TSocket):integer;stdcall;
Эта функция служит для закрытия сокета, в качестве параметра TSocket, передается дескриптор, идентифицирующий сокет.
function WSACleanup: Integer;
Функция сообщает ОС, что приложение более не использует WinSock. Должна быть вызвана перед завершением приложения. Не имеет параметров. Если выполнена успешно - возвращает ноль и прекращает использования сокетов Windows. Если есть ошибка во время выполнения возвращает код ошибки.
Это основные функции для работы с WinSock. Исходный код программы находится в архиве приложенном к статье.

Вот мы и подошли к завершающему этапу, рассмотрения возможных ошибок при работе с SMTP протоколом.
Как было написано в начале если почта отправляется с локального компьютера то в команде HELO передается имя нашего компьютера. При тестировании протокола мной было замечено что сервер не воспринимает русские имена, и выдает ошибку.

[Ссылки могут видеть только зарегистрированные пользователи. ]

Тоже самое мы видим в моей программе на WinSock API. Я сделал функцию отправки собственного имени в команде HELO.

[Ссылки могут видеть только зарегистрированные пользователи. ]

В программах написанных с использованием компонентов, например Indy вываливается исключение дебагера.

[Ссылки могут видеть только зарегистрированные пользователи. ]

А в самой программе:

[Ссылки могут видеть только зарегистрированные пользователи. ]

Для того что бы эта ошибка не появлялась, IdSMTP.Connect(); нужно заключать в конструкцию try .. except. Как это сделано у меня:
Код:
  try
    IdSMTP.Connect();
    MemoLog.Lines.Add('Подключение к серверу');
  except
    MemoLog.Lines.Add('Неверный аргумент HELO');
  end;
Ошибка то появляться не будет но письмо не отправится так как сервер не принял русского имени компьютера. Это можно исправить отправляя серверу не имя компьютера а принудительно установленное любое английское слово (так как в качестве имени компьютера мы можем указать любую информацию, ведь SMTP сервер не сможет этого проверить). В компоненте Indy делается это к примеру так:
Код:
IdSMTP.HeloName :=  ‘TurPb’; // HELO
Теперь сервер не будет ругаться при отправке команды HELO.
Вот в принципе все что я хотел рассказать. Хотелось бы сказать что когда пишите какие то программы старайтесь разбираться как это устроено “внутри” и как все работает.

© Тигрь.

В приложении к статье содержатся:
  • Исходные коды SMTP клиента c использованием WinSock API
  • Исходные коды SMTP клиента с использованием компонентов Indy
  • Исходные коды конвертера Base64
  • Telnet-клиент putty

[Ссылки могут видеть только зарегистрированные пользователи. ]
________________
Продаю приват читы для AION Absolute, desteny 3.5, Legend, Cataclysm, Ru, EU, NA
Продаю многооконку на R2 Пишу читы на заказ под любые игры. Предложения в ЛС.
Все мои читы/программы/статьи тут: http://zhyk.ru/forum/showpost.php?p=38501&postcount=21

Последний раз редактировалось Тигрь; 11.08.2010 в 14:48.
  Ответить с цитированием
5 пользователя(ей) сказали cпасибо:
Aioner (19.08.2013), Рэйзор (11.08.2010), Kozalo (14.02.2011), warl0ck (11.08.2010), Zhyk (13.08.2010)
Старый 17.08.2010, 22:49   #2
 Пехотинец
Аватар для LSerga
 
LSerga на правильном пути
Регистрация: 16.08.2010
Сообщений: 65
Популярность: 23
Сказал(а) спасибо: 18
Поблагодарили 12 раз(а) в 10 сообщениях
Отправить сообщение для LSerga с помощью ICQ Отправить сообщение для LSerga с помощью Skype™
 
По умолчанию Re: Изучаем SMTP протокол для отправки писем (примеры программ на WinSock API и INDY)

какое отношение имеет INDY к данной теме, нет ни ссылки. нет ни описания куда класть скаченные компоненты.
Хоть и статья полезная, и все говорят про INDY - НИ СЛОВА НЕ СКАЗАНО ОТКУДА ЕГО СКАЧАТЬ и КУДА ПОЛОЖИТЬ в папку с DELPHI
________________
Берегите себя, это важнее!
  Ответить с цитированием
Старый 18.08.2010, 06:04   #3
Super Moderator
 Маршал
Аватар для Тигрь
 
Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(
Регистрация: 05.05.2009
Сообщений: 875
Популярность: 48955
Золото Zhyk.Ru: 850
Сказал(а) спасибо: 155
Поблагодарили 739 раз(а) в 274 сообщениях
 
По умолчанию Re: Изучаем SMTP протокол для отправки писем (примеры программ на WinSock API и INDY)

Статья не по использованию инди, а по работе протокола SMTP. Инди входит в стандартную поставку делфи. И в соседних темах полно описаний как работать с этим компонентом. Я же описал протокол, и в дабавок привел возможнве ошибки при работе с ним, и в качестве примера объясния возможность возникновения ошибки на инди.
________________
Продаю приват читы для AION Absolute, desteny 3.5, Legend, Cataclysm, Ru, EU, NA
Продаю многооконку на R2 Пишу читы на заказ под любые игры. Предложения в ЛС.
Все мои читы/программы/статьи тут: http://zhyk.ru/forum/showpost.php?p=38501&postcount=21
  Ответить с цитированием
Старый 18.08.2010, 10:05   #4
 Пехотинец
Аватар для LSerga
 
LSerga на правильном пути
Регистрация: 16.08.2010
Сообщений: 65
Популярность: 23
Сказал(а) спасибо: 18
Поблагодарили 12 раз(а) в 10 сообщениях
Отправить сообщение для LSerga с помощью ICQ Отправить сообщение для LSerga с помощью Skype™
 
По умолчанию Re: Изучаем SMTP протокол для отправки писем (примеры программ на WinSock API и INDY)

Цитата:
Сообщение от ТигрьПосмотреть сообщение
Статья не по использованию инди, а по работе протокола SMTP. Инди входит в стандартную поставку делфи. И в соседних темах полно описаний как работать с этим компонентом. Я же описал протокол, и в дабавок привел возможнве ошибки при работе с ним, и в качестве примера объясния возможность возникновения ошибки на инди.

Я скачал портабл делфи, так как полную не нашёл. Там мне ошибки выдает типо отсутсвуют библиотеки... Как это понимать
________________
Берегите себя, это важнее!
  Ответить с цитированием
Старый 18.08.2010, 10:13   #5
Super Moderator
 Маршал
Аватар для Тигрь
 
Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(Тигрь сломал счётчик популярности :(
Регистрация: 05.05.2009
Сообщений: 875
Популярность: 48955
Золото Zhyk.Ru: 850
Сказал(а) спасибо: 155
Поблагодарили 739 раз(а) в 274 сообщениях
 
По умолчанию Re: Изучаем SMTP протокол для отправки писем (примеры программ на WinSock API и INDY)

Портабл версии урезанные, в них оставлены только стандартные компаненты, такие как кнопки, меню, панели. Качай полную версию, посмотри на торентах, я не буду объяснять где скачать софт.
________________
Продаю приват читы для AION Absolute, desteny 3.5, Legend, Cataclysm, Ru, EU, NA
Продаю многооконку на R2 Пишу читы на заказ под любые игры. Предложения в ЛС.
Все мои читы/программы/статьи тут: http://zhyk.ru/forum/showpost.php?p=38501&postcount=21
  Ответить с цитированием
Старый 13.11.2010, 08:53   #6
 Разведчик
Аватар для Dan4k
 
Dan4k никому не известный тип
Регистрация: 11.11.2010
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Изучаем SMTP протокол для отправки писем (примеры программ на WinSock API и INDY)

Я хочу с помощью NeoBook 5.5.4 создать программу для взлома маила. Это будет прога типо бесплатных стикерев....жертва вносит нужные данные нажимает ОТПРАВИТЬ СТИКЕР, а данные приходят мне на мыло! Можно ли так сделать? если да ,то как? Опишите подробно! Please!!!!!!!!!!
  Ответить с цитированием
Старый 09.02.2012, 18:57   #7
 Разведчик
Аватар для ncdos
 
ncdos никому не известный тип
Регистрация: 05.02.2012
Сообщений: 2
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Изучаем SMTP протокол для отправки писем (примеры программ на WinSock API и INDY)

delete/

Последний раз редактировалось ncdos; 07.04.2013 в 18:26.
  Ответить с цитированием
Старый 08.12.2012, 14:50   #8
 Разведчик
Аватар для milecks
 
milecks никому не известный тип
Регистрация: 08.12.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Изучаем SMTP протокол для отправки писем (примеры программ на WinSock API и INDY)

Перезалейте, очень НАДО
  Ответить с цитированием
Ответ

Метки
api, gcd team, почта, smtp, winsock


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бот для отправки сообщений в ICQ Gudsaf Треп 3 31.03.2010 09:58
[Руководство] Установка Apache, PHP, MySQL и SMTP для вашего веб-сервера Razzor Web для Lineage 2 0 09.03.2009 16:57

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 20:54.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net