Почему SMTP-сервер не получает команду DATA?

Я кодирую серверы POP3 и SMTP с использованием Java для университетского проекта. Я могу отправлять электронные письма с помощью своего SMTP-сервера через клиента (например, Thunderbird), и мой сервер отправляет их без каких-либо проблем.

Когда внешний агент отправителя, такой как gmail или hotmail, пытается отправить электронное письмо с помощью моего SMTP-сервера, он не завершает обмен данными, потому что он отправляет команду QUIT после команды MAIL. Почему внешний агент это делает? Разве я не подчинялся протоколу SMTP?

Проблема в том, что когда я получаю соединение от внешнего сервера, который хочет отправить мне почту, происходит следующее (я: мой SMTP-сервер, отправитель: агент отправителя). Вот пример с агентом Gmail.


sender: establishes a connection
me: 220 Welcome
sender: HELO agent id
me: 250 Fine
sender: MAIL FROM:<[email protected]>
me (after address verification): 250
sender: QUIT
me: 221

Соответствующие фрагменты кода (полный код класса находится по адресу http://code.google.com/p/sd-mail-server-claudiani-ferrari/source/browse/src/controller/smtp/SMTPCommandHandler.java?repo=mailserver < / а>)

private void MAILCommand(CommunicationHandler communicationHandler, 
                         BufferedOutputStream writer, 
                         PersistanceManager persistanceManager, 
                         String clientId, 
                         String argument) 
{
    String address = getAddressFromArgument(argument);
    if (!isValidAddress(address, persistanceManager)) {
        communicationHandler.sendResponse(writer, 
                                          SMTPCode.SYNTAX_ERROR.toString(), 
                                          "Address is not valid.");
        return;
    }

    // Initialize data
    persistanceManager.create(StorageLocation.SMTP_TEMP_MESSAGE_STORE, 
                              FieldName.getSMTPTempTableFromFieldOnly(), 
                              clientId, address);

    communicationHandler.sendResponse(writer, SMTPCode.OK.toString(), "");

}

private void RCPTCommand(CommunicationHandler communicationHandler, 
                         BufferedOutputStream writer, 
                         PersistanceManager persistanceManager, 
                         String clientId, 
                         String argument) 
{
    String address = getAddressFromArgument(argument);
    // Check the address
    if (!isValidAddress(address, persistanceManager)) {
        communicationHandler.sendResponse(writer, 
                                          SMTPCode.SYNTAX_ERROR.toString(), 
                                          "Address is not valid.");
        return;
    }

    persistanceManager.addToSet(StorageLocation.SMTP_TEMP_MESSAGE_STORE, 
                                clientId, 
                                FieldName.SMTP_TEMP_TO_ADDRESSES, 
                                address);

    communicationHandler.sendResponse(writer, SMTPCode.OK.toString(), "");
}

private void DATACommand(CommunicationHandler communicationHandler, 
                         BufferedOutputStream writer, 
                         PersistanceManager persistanceManager, 
                         String clientId) 
{
    communicationHandler.sendResponse(writer, 
                                      SMTPCode.INTERMEDIATE_REPLY.toString(), 
                                      "Start mail input; end with [CRLF].[CRLF]");
}

person Marco Ferrari    schedule 21.09.2012    source источник


Ответы (1)


Вы пробовали отвечать 250 OK вместо просто 250? RFC 2821 говорит, что это должен быть ответ строки MAIL FROM:

В случае принятия SMTP-сервер возвращает ответ 250 OK. Если спецификация почтового ящика по какой-либо причине неприемлема, сервер ДОЛЖЕН вернуть ответ, указывающий,

Ваш почтовый клиент может быть удовлетворен просмотром 250, в то время как Google / Hotmail может ожидать 250 OK.

Изменить

Я думаю, что текстовая строка в этом случае не является обязательной, см. Раздел 4.2 RFC 2821 :

Ответ SMTP состоит из трехзначного числа (передается в виде трех цифровых символов) , за которым следует некоторый текст, если иное не указано в этом документе.

Текущий RFC 5321 предлагает клиентам не принимать текст:

Клиент SMTP ДОЛЖЕН определять свои действия только по коду ответа, а не по тексту (за исключением «изменения адреса» 251 и 551 и, при необходимости, ответов 220, 221 и 421); в общем случае ДОЛЖЕН быть приемлем любой текст, включая его отсутствие вообще (хотя отправители НЕ ДОЛЖНЫ отправлять голые коды). Пробел (пробел) после кода ответа считается частью текста. По возможности, SMTP-получатель ДОЛЖЕН проверить первую цифру (указание серьезности) кода ответа.

person Anders Lindahl    schedule 21.09.2012
comment
Разве текст после однострочного кода ответа не является необязательным (как гласит грамматика)? Спасибо - person Marco Ferrari; 21.09.2012
comment
В RFC в примерах упоминается текст, и серверы должны использовать тексты, как в примерах. С другой стороны, они также говорят, что клиенты должны принимать голые коды. Важно то, пробовали ли вы не использовать голые коды? Это что-то изменило? - person Anders Lindahl; 22.09.2012
comment
Вы были правы. Сервер не должен отправлять голые коды, но писать ОК не обязательно, это может быть любая строка, например 250 AnyString. Спасибо! - person Marco Ferrari; 22.09.2012