为什么SMTP服务器不接收DATA命令?

时间:2012-09-21 17:45:51

标签: java email smtp server

我正在使用Java为大学项目编写POP3和SMTP服务器。 我可以通过客户端(即:Thunderbird)使用我的SMTP服务器发送电子邮件,我的服务器发送它们没有任何问题。

当外部发件人代理(如gmail或hotmail)尝试使用我的SMTP服务器发送电子邮件时,它无法完成通信,因为它在MAIL命令之后发送QUIT命令。外部代理为什么这样做?我没有服从SMTP协议吗?

问题是,当我从外部服务器收到想要发送邮件的连接时,会发生以下情况(我:我的SMTP服务器,发件人:发件人代理)。以下是gmail代理的示例。


sender: establishes a connection
me: 220 Welcome
sender: HELO agent id
me: 250 Fine
sender: MAIL FROM:<address@gmail.com>
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]");
}

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用250 OK而不仅仅是250进行回复? RFC 2821说这应该是MAIL FROM行的回复:

  

如果接受,则SMTP服务器返回       250 OK 回复。如果邮箱规范不可接受      某种原因,服务器必须返回一个指示是否

的回复

您的邮件客户可能会对看到250感到满意,而Google / Hotmail可能会期待250 OK

修改

我认为在这种情况下文本字符串不是可选的,请参阅RFC 2821的第4.2节:

  

SMTP回复由三位数字组成(传输为   三个数字字符)后跟一些文字除非另有说明   否则在本文件中。

当前RFC 5321表明客户端不应接受任何文字:

  

SMTP客户端必须仅通过回复代码确定其操作,   而不是文字(“地址变更”251和551除外)   如有必要,还有220,221和421条回复);在一般情况下,   任何文字,根本不包括文字虽然发件人不应该   发送裸码),必须是可以接受的。空格(空白)跟随   回复代码被视为文本的一部分。只要有可能,   接收者 - SMTP应该测试第一个数字(严重性指示)   回复代码。