我正在使用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]");
}
答案 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应该测试第一个数字(严重性指示) 回复代码。