4

大学のプロジェクトで Java を使用して POP3 および SMTP サーバーをコーディングしています。SMTP サーバーを使用してクライアント (つまり、Thunderbird) 経由でメールを送信でき、サーバーは問題なく送信します。

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ただの代わりに返信してみました250か? RFC 2821MAIL FROMによると、これは行の応答である必要があります。

受け入れられた場合、SMTP サーバーは250 OK応答を返します。メールボックスの仕様が何らかの理由で受け入れられない場合、サーバーは、

メール クライアントは を見て満足するかもしれませんが250、Google/Hotmail は を期待するかもしれません250 OK

編集

この場合、テキスト文字列はオプションではないと思います。RFC 2821のセクション 4.2 を参照してください。

SMTP 応答は、このドキュメントで特に指定されていない限り、3 桁の数字 (3 つの数字として送信される)とそれに続くテキストで構成されます。

現在のRFC 5321は、クライアントがテキストを受け入れてはならないことを示唆しています:

SMTP クライアントは、テキストではなく、応答コードのみによってそのアクションを決定しなければなりません (「アドレス変更」の 251 と 551、および必要に応じて 220、221、および 421 応答を除く)。一般的なケースでは、テキスト をまったく含まない(送信者は裸のコードを送信するべきではありませんが) 任意のテキストを受け入れなければなりません (MUST)。応答コードに続くスペース (ブランク) は、テキストの一部と見なされます。可能な限り、受信者 SMTP は、応答コードの最初の桁 (重大度表示) をテストする必要があります (SHOULD)。

于 2012-09-21T18:12:52.560 に答える