Протокол SMTP: несколько писем на соединение - PullRequest
2 голосов
/ 03 января 2012

Мне нужно реализовать поддержку нескольких сообщений на одно соединение для моего SMTP-сервера.

Каждое сообщение заканчивается:

data
<<content>>
.

И логично, что состояние протокола должно быть сброшено до "после получения аутентификации "точка.Правильно ли это?

Вопрос: возможно ли, чтобы любой клиент отправлял содержимое сообщения с помощью нескольких команд data?Стандарт разрешает это?

1 Ответ

12 голосов
/ 04 января 2012

С RFC2821 («Простой протокол пересылки почты»):

Почтовые данные заканчиваются строкой, содержащей только точку, которая есть последовательность символов "." (см. раздел 4.5.2).

...

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

* * 1012 то есть. после получения <CRLF>.<CRLF> сервер использует почтовые данные и очищает свои буферы; следовательно, клиент не может затем отправить больше содержимого, связанного с сообщением, поскольку сервер забудет о сообщении.

...

После запуска почтовая транзакция состоит из команды начала транзакции, одной или нескольких команд RCPT и команды DATA в указанном порядке.

...

MAIL (или SEND, SOML или SAML) НЕ ДОЛЖНЫ отправляться, если почтовая транзакция уже открыта, т. Е. Отправлять ее следует только в том случае, если в сеансе не было запущено ни одной почтовой транзакции, или если предыдущая успешно завершена с успешной командой DATA, или если предыдущая была прервана с помощью RSET.

т.е. MAIL начинает новую почтовую транзакцию, и успешная команда DATA (завершается <CRLF>.<CRLF>) завершает ее; клиент может затем отправить другое сообщение.


С RFC4954 («Расширение службы SMTP для аутентификации»):

После успешного выполнения команды AUTH больше команд AUTH не может быть выдано в том же сеансе. После успешного выполнения команды AUTH сервер ДОЛЖЕН отклонить все дальнейшие команды AUTH с ответом 503.

т.е. аутентификация выполняется не более одного раза за сеанс и применяется до конца этого сеанса.

...