当前位置: 首页 > 知识库问答 >
问题:

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

华永新
2023-03-14

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

当外部发件人代理(如gmail或hotmail)尝试使用我的SMTP服务器发送电子邮件时,它不会完成通信,因为它会在邮件命令之后发送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个答案

经骁
2023-03-14

你有没有试过用250 OK而不是仅仅用250来回复?RFC 2821说这应该是一个MAIL OF行的回复:

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

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

编辑

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

SMTP回复由三位数字(以三个数字字符传输)和一些文本组成,除非本文档中另有规定。

当前的RFC 5321建议客户不接受文本:

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

 类似资料:
  • SMTP是Simple Mail Transfer Protocol的首字母缩写。 它是跨Internet协议(IP)网络的电子邮件(电子邮件)传输的Internet标准。 SMTP使用TCP端口25.由SSL保护的SMTP连接以速记SMTPS为人所知,尽管SMTPS本身不是协议。 JavaMail API具有包com.sun.mail.smtp ,它作为SMTP协议提供程序来访问SMTP服务器。

  • 我正在尝试从火币 USDT 掉期流式传输比特币价格,但我的乒乓机制不起作用,所以火币总是在 30 秒后关闭连接。 文档是这么说的https://huobiapi . github . io/docs/usdt _ swap/v1/en/# market-heart beat: WebSocket API支持双向心跳。服务器和客户端都可以发送ping消息,对方可以返回pong消息。 WebSocke

  • 显示以下错误:: 线程“main”Java.lang.RuntimeException:javax.mail.MessagingException:无法连接到SMTP主机:localhost,端口:587,Sendmail.Main(Sendmail.Java:54)上的响应:421,原因是:javax.mail.MessagingException:无法连接到SMTP主机:localhost,端

  • 问题内容: 我使用JDBC连接到MySQL。在时,一切正常。 但是,当我将应用程序移动到Intranet中的另一台计算机上并用于连接到MySQL数据库时,大约需要1分钟才能成功连接到MySQL。这是怎么回事? 问题答案: 好吧,这可能是DNS问题。您可以通过从配置文件中的选项开始禁用DNS主机名查找。 在这里阅读更多详细信息:http : //dev.mysql.com/doc/refman/5.

  • 在之前的所有章节中,我们使用JangoSMPT服务器发送电子邮件。 在本章中,我们将了解Gmail提供的SMPT服务器。 Gmail(以及其他)免费提供其公共SMTP服务器。 Gmail SMTP服务器详细信息可在here找到。 正如您在详细信息中看到的,我们可以使用TLS或SSL连接通过Gmail SMTP服务器发送电子邮件。 使用Gmail SMTP服务器发送电子邮件的过程与发送电子邮件一章中

  • 我有一个示例代码如下,套接字绑定到IP10.10.88.11和端口9876。我用下面的wireshark测试了2种情况。两台电脑都在同一个子网中。 从同一PC发送UDP数据包(10.10.88.11)-UDP服务器能够接收 从另一台电脑发送UDP数据包(10.10.88.10)-UDP服务器无法接收,但Wireshark(在10.10.88.11)能够捕获数据包 我在网上搜索过,但找不到解决办法。