3

Windows 8 でコードが動作しなくなりました。Windows 互換モードが Windows 7 の場合、コードが機能しません。管理者としてアプリケーションを実行しています。すでにウイルス対策とファイアウォールをオフにしようとしました。別の smtp クライアント (.Net SmtpClient など) を使用して、同じパラメーターで電子メールを送信できます。この問題は、さまざまな Windows 8 コンピューター (自宅、オフィス) で再現されます。簡単なテストアプリケーションを作成しました。コードは Delphi XE、Indy 10.5.7、OpenSSL 1.0.1.3 で記述され、dll は test.exe フォルダーに配置されます。

何か案は?

コード:

SSLHandler.MaxLineAction := maException;
SSLHandler.SSLOptions.Method := sslvTLSv1;
SSLHandler.SSLOptions.Mode := sslmUnassigned;
SSLHandler.SSLOptions.VerifyMode := [];
SSLHandler.SSLOptions.VerifyDepth := 0;
SSLHandler.OnStatusInfo := IdSSLIOHandlerSocketOpenSSL1StatusInfo;

SMTP.IOHandler := SSLHandler;
SMTP.Host := 'smtp.gmail.com';
SMTP.Port := 587;
SMTP.UseTLS := utUseExplicitTLS;
SMTP.Username := FromAddress;
SMTP.Password := AuthPassword;

Email.From.Address := FromAddress;
Email.Recipients.EmailAddresses := ToAddress;
Email.Subject := Subject;
Email.Body.Text := Body;

SMTP.Connect;
SMTP.Send(Email);
SMTP.Disconnect;

出力:

SSL ステータス: 「前/接続初期化」

SSL ステータス: 「前/接続初期化」

SSL ステータス: 「SSLv3 書き込みクライアント ハロー A」

SSL ステータス: 「SSLv3 read server hello A」

「Socket Error # 10060 Connection timed out」というメッセージを含む EIdSocketError。

4

4 に答える 4

7

IdHTTP の ReadTimeout です。デフォルトでは -1 で、Windows 8 では機能しません。15000ms や 30000 などの正の値に設定すると、問題が解決します。

IdHTTP オブジェクトにプログラムで数値を設定する必要があることに注意してください。オブジェクト インスペクタを介してバインドされた IoHandler を設定しようとしないでください。その方法では機能しません。

例:

  IdHTTP1.ReadTimeout := 30000;

Indy に、ソケット操作で無限のタイムアウトを使用するように指示します。ただし、接続が切断されたときに Vista+ で OpenSSL のデッドロックを回避するために、 TIdSSLIOHandlerSocketOpenSSL は、ReadTimeout が <= 0 の場合、下位のソケット レイヤーで 30 秒のタイムアウトを強制します。}

Bob Daneshfar がこのフォーラムに投稿したソリューションです。

于 2013-07-19T20:30:27.930 に答える
1

最後に、それが Indy 関連の問題であることがわかりました。Indy 10.5.8 または 10.5.9 にアップグレードすると、問題が修正されます。

アドバイスをありがとう。

于 2013-02-13T11:43:47.847 に答える
0

アプリケーションと一緒に OpenSSL ライブラリ (「libeay32.dll」や「ssleay32.dll」など) を配布したことは確かですか?

それらを忘れると、タイムアウトも発生します。これは、OpenSSL ライブラリのエラーが外部 IO オブジェクト (TIdSMTP や TIdHTTP など) に正しく転送されないためです。

OpenSLL for Indy がロードできるかどうかを確認するには、次のコードを使用します (SSL が利用できない場合にエラーが発生します) - ユニット「IdSSLOpenSSL」を使用します

TIdSSLContext.Create.Free; // Raises an error, when unable to load SSL lib and such

また、OpenSSL ヘッダー ユニット 'IdSSLOpenSSLHeader' にプラグインし、ライブラリを手動でロードして、それが可能かどうかを確認することもできます。

if not IdSSLOpenSSLHeaders.Load then ; // Raises no error, but return 'true' when it can load
于 2014-09-10T13:02:12.277 に答える
0

.NET クラスを使用して電子メールを正常に送信できるためSmtpClient、Wireshark などのパケット スニファを使用して のネットワーク トラフィックを表示SmtpClientし、それを Indy/OpenSSL のネットワーク トラフィックと比較して、違いを正確に確認することをお勧めします。OpenSSL の TLSv1 ハンドシェーク中に には起きていないことが起こっていSmtpClientます。

于 2013-02-07T21:16:36.183 に答える