4

我正在为一个大学项目使用 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]");
}
4

1 回答 1

1

您是否尝试过回复250 OK而不是 just 250RFC 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 应该测试回复代码的第一个数字(严重性指示)。

于 2012-09-21T18:12:52.560 回答