CodeNet - все для программиста!
Все для программиста!
  Статьи   Форум   Исходники   Каталог   Хостинг   IRC  
 Справочник функций

Ваш аккаунт

Логин:
Пароль:

Забыли пароль?
Регистрация

Почтовая рассылка



Подписчиков: 6342
(Из них RSS: 0)

Последний выпуск: 10.12.2009

Описание протокола SMTP

Введение

Александр Бельбаков, HiProg.com "Технологии программирования"

Основная задача протокола SMTP (Simple Mail Transfer Protocol) заключается в том, чтобы обеспечивать передачу электронных сообщений (почту). Для работы через протокол SMTP клиент создаёт TCP соединение с сервером через порт 25. Затем клиент и SMTP сервер обмениваются информацией пока соединение не будет закрыто или прервано. Основной процедурой в SMTP является передача почты (Mail Procedure). Далее идут процедуры форвардинга почты (Mail Forwarding), проверка имён почтового ящика и вывод списков почтовых групп. Самой первой процедурой является открытие канала передачи, а последней - его закрытие.

Команды SMTP указывают серверу, какую операцию хочет произвести клиент. Команды состоят из ключевых слов, за которыми следует один или более параметров. Ключевое слово состот из 4-х символов и разделено от аргумента одним или несколькими пробелами. Каждая командная строка заканчивается символами CRLF. Вот синтаксис всех команд протокола SMTP (SP - пробел):

HELO <SP> <domain> <CRLF>
MAIL <SP> FROM:<reverse-path> <CRLF> 
RCPT <SP> TO:<forward-path> <CRLF> 
DATA <CRLF>
RSET <CRLF> 
SEND <SP> FROM:<reverse-path> <CRLF> 
SOML <SP> FROM:<reverse-path> <CRLF> 
SAML <SP> FROM:<reverse-path> <CRLF> 
VRFY <SP> <string> <CRLF> 
EXPN <SP> <string> <CRLF> 
HELP <SP> <string> <CRLF> 
NOOP <CRLF> 
QUIT <CRLF>

Обычный ответ SMTP сервера состоит из номера ответа, за которым через пробел следует дополнительный текст. Номер ответа служит индикатором состояния сервера.

Отправка почты

Первым делом подключаемся к SMTP серверу через порт 25. Теперь надо передать серверу команду HELLO и наш IP адрес:

C: HELLO 195.161.101.33
S: 250 smtp.mail.ru is ready 

При отправке почты передаём некоторые нужные данные (отправитель, получатель и само письмо):

C: MAIL FROM:<drozd> 'указываем отправителя
S: 250 OK

C: RCPT TO:<drol@mail.ru> 'указываем получателя
S: 250 OK

указываем серверу, что будем передавать содержание письма (заголовок и тело письма)

C: DATA 
S: 354 Start mail input; end with <CRLF>.<CRLF> 

передачу письма необходимо завершить символами CRLF.CRLF

S: 250 OK 

C: From: Drozd <drozd@mail.ru> 
C: To: Drol <drol@mail.ru>
C: Subject: Hello 

между заголовком письма и его текстом не одна пара CRLF, а две.

C: Hello Drol!
C: You will be die on next week!

заканчиваем передачу символами CRLF.CRLF

S: 250 OK

Теперь завершаем работу, отправляем команду QUIT:

S: QUIT
C: 221 smtp.mail.ru is closing transmission channel

> Другие команды

  • SEND - используется вместо команды MAIL и указыает, что почта должна быть доставлена на терминал пользователя.
  • SOML, SAML - комбинации команд SEND или MAIL, SEND и MAIL соответственно.
  • RSET - указвает серверу прервать выполнение текущего процесса. Все сохранённые данные (отправитель, получатель и др) удаляются. Сервер должен отправить положительный ответ.
  • VRFY - просит сервер проверить, является ли переданный аргумент именем пользователя. В случае успеха сервер возвращает полное имя пользователя.
  • EXPN - просит сервер подтвердить, что переданный аргумент - это список почтовой группы, и если так, то сервер выводит членов этой группы.
  • HELP - запрашивает у сервера полезную помощь о переданной в качестве аргумента команде.
  • NOOP - на вызов этой команды сервер должен положительно ответить. NOOP ничего не делает и никак не влияет на указанные до этого данные.

Комментарии пользователей (всего 24)

Максим САМОЙЛОВ / 18 сентября 2009, 00:11:03

КОМЕНТАРИЙ НЕТ -ТА ЖЕ ПРОБЛЕМА ЧТО И У ОСТАЛЬНЫХ. НЕ МОГУ ПЕРЕДАТЬ СНИМКИ С КОМПА НА КОМП. узел SMTR-е найден и т.д.как и у остальных. в чем дело? почему у всех все одинаково? что-то с системой повидимому-или инструкции не то говорят что нужно делать. делаю все так как написано в книге -виндовс для чайников- но все бестолку. не могу ничего передать.langer@mail.ru

пакахондас / 06 мая 2007, 05:30:32

Для прохождения авторизации набирайте не HELO ,а EHLO:
потом AUTH LOGIN ;

Zanna / 28 апреля 2006, 19:50:23

У меня такие же проблему как у Антона

Григорий / 18 апреля 2006, 21:28:00

Узел 'SMTP' не найден. Проверьте введенное имя сервера. Учетная запись: 'IMAR', Сервер: 'SMTP', Протокол: SMTP, Порт: 25, Защита (SSL): Нет, Ошибка сокета: 11001, Код ошибки: 0x800CCC0D

ольга / 16 апреля 2006, 17:41:47

Узел "SMTP" не найден.Проверьте введенное имя сервера. Учетная запись: "POP3",Сервер:"SVNP". Протокол; SMTP, ПОРТ:25, Защита(SSL):Нет. Ошибка сокета 11001, код ошибки:Oх800СССОD

Любитель / 20 марта 2006, 13:41:39

теперь smtp.mail.ru требует авторизации

Ламердед / 21 января 2006, 14:22:59

aa, чтобы файл отправлять - он кодируеться в базу64 и такжепередаеться....

Ламердед / 21 января 2006, 14:21:23

каму там на винапи нада..
дам тока кусок кода
данные
msgHELO db 'HELO host',13,10


msgFROM db 'mail from: milo@mail.ru',13,10

msgRCPT db 'RCPT TO: LAMERDEATH15@mail.ru',0dh,0ah
msgDATA DB 'DATA',0dh,0ah
msgDATA2 db 'this is the test mail message from

myself',0dh,0ah,0dh,0ah,'.',0dh,0ah



КОД
ush offset wsd
mov eax, 0
mov ax, 0202h
push eax
call wsastartup




invoke htons,25
mov sin2.sin_port, ax
mov sin2.sin_family, 2
push 0
push 1
push 2
call socket
mov s1, eax
push sizeof (sockaddr_in)
push offset sin2
push s1
call connect
push sizeof msgrecv
push offset msgrecv
push s1
call recv




push 0
push sizeof msgHELO
push offset msgHELO
push s1
call send
push 0
push sizeof msgrecv
push offset msgrecv
push s1
call recv




push 0
push sizeof msgFROM
push offset msgFROM
push s1
call send
push 0
push sizeof msgrecv
push offset msgrecv
push s1
call recv




push 0
push sizeof msgRCPT
push offset msgRCPT
push s1
call send

push 0
push sizeof msgrecv
push offset msgrecv
push s1
call recv





push 0
push sizeof msgDATA
push offset msgDATA
push s1
call send
push 0
push sizeof msgDATA2
push offset msgDATA2
push s1
call send
push 0
push sizeof msgrecv
push offset msgrecv
push s1
call recv
push 0




push 0
push sizeof msgQUIT
push offset msgQUIT
push s1
call send


собственна recv можна не юзать, это так для отладки...
ну с либой сокетов разберетесь
если че мыльте LAMERDEATH15@mail.ru

Тимур / 29 декабря 2005, 14:05:29

Интересно было бы посмотреть на примере исходника (желательно на WinAPI), как отправлять прикрепленный файл. А то в данной статье нету ни одного слова про это.

юля / 25 декабря 2005, 03:49:38

Возникла такая же проблема, как у Марины 05.06.2005г.
Вы бы подсказали, что делать?

Отображены только последние 10 комментариев. Читать все комментарии >>

Оставить комментарий

Оставлять комментарии могут только зарегистрированные пользователи.

Если вы не являетесь зарегистрированным пользователем, то вам необходимо зарегистрироваться. Регистрация бесплатна. Если вы уже зарегистрированы на CodeNet, то вам необходимо ввести логин и пароль в верхней (Alt-U) части страницы.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог