Я кодирую серверы POP3 и SMTP с использованием Java для университетского проекта. Я могу отправлять электронные письма с помощью своего SMTP-сервера через клиента (например, Thunderbird), и мой сервер отправляет их без каких-либо проблем.
Когда внешний агент отправителя, такой как gmail или hotmail, пытается отправить электронное письмо с помощью моего SMTP-сервера, он не завершает обмен данными, потому что он отправляет команду QUIT после команды MAIL. Почему внешний агент это делает? Разве я не подчинялся протоколу SMTP?
Проблема в том, что когда я получаю соединение от внешнего сервера, который хочет отправить мне почту, происходит следующее (я: мой SMTP-сервер, отправитель: агент отправителя). Вот пример с агентом Gmail.
sender: establishes a connection
me: 220 Welcome
sender: HELO agent id
me: 250 Fine
sender: MAIL FROM:<[email protected]>
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]");
}