私のメール チェッカーでは、POP3 SSL と IMAP SSL の両方をサポートしています。SASL を使用した Pop3 SSL はしばらくの間動作していましたが、SASL のコードは POP3 と IMAP で非常に似ているはずですが、SASL を使用した IMAP SSL が動作することはありませんでした。私の理解では、この問題が修正されるまで、それが機能することを期待すべきではないということでした. さて、その問題は修正されたので、IMAP で SASL を機能させる方法をもう一度見てみようと思いました。Indy を更新して再構築し、すべての SASL コードのコメントを外しました。ログイン コマンドを発行すると、IdIMAP4 で読み取りタイムアウトが発生することがわかりました (タイムアウトが十分な時間に設定されていても (これは、SASL を使用して POP3 で認証するのにかかる時間の約 5 倍です。
デバッガーでコードをステップ実行すると、読み取りタイムアウトの原因となっている行が関数のfunction PerformSASLLogin_IMAP(ASASL: TIdSASL; AEncoder: TIdEncoder;
1358 行目にあることがわかります。
AClient.SendCmd(AClient.NewCmdCounter, 'AUTHENTICATE ' + String(ASASL.ServiceName), [], True); {Do not Localize}
このメソッド全体がそのバグレポートに示されているリビジョンで新しいものであったことを考えると、私は Indy を正常に更新したと確信しており、SASL メカニズムをセットアップするためのロジックとその他のものは POP3 で機能するものと非常に似ています (次のようなものを除く)。 Pop3 AuthType patSASL の代わりに IMAP AuthType iatSASL を使用します)。では、なぜここで読み取りタイムアウトが発生するのでしょうか? 正しく動作していないのが自分のコードなのか Indy なのかをトラブルシューティングするにはどうすればよいですか? IMAP.AuthType を iatUserPass または DEF_IMAP4_AUTH に変更すると、接続は成功します。バグレポートが修正済みとして閉じられているというヒントを除いて、IMAP を使用した SASL が現在機能していると期待できるかどうかについての最新情報を見つけることができないようです。
編集: Remy の返信での質問によると、SSL なしで SASL に接続するように設定したときに、wireshark によってキャプチャされた TCP 会話は次のとおりです。
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot の準備ができました。 C1機能 * 機能 IMAP4rev1 リテラル+ SASL-IR ログイン-参照 ID 並べ替えを有効にする 並べ替え=表示 スレッド=参照 スレッド=REFS マルチアペンド アンセレクト アイドル チャイルドレン ネームスペース UIDPLUS リスト拡張 I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT コンテキスト内検索=検索 リストステータス クォータ STARTTLS AUTH=プレーン認証=ログイン C1 OK 機能が完了しました。 C2 認証プレーン + C3 ログアウト C2 NO [ALERT] 無効な base64 データの継続応答