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