2

Indy と、この Marco Cantù の記事で説明されている手法を使用して、smtps (安全な smtp) からメールを送信しようとしています。

これは私が使用しているものです:

object SMTP: TIdSMTP
  IOHandler = IdSSLIOHandlerSocketOpenSSL1
  SASLMechanisms = <>
  UseTLS = utUseExplicitTLS
  Left = 32
  Top = 196
end

SMTP.Host := 'smtps.pec.aruba.it';;
        SMTP.Port := 465;;
        SMTP.Username := 'myaddress@pec.it';
        SMTP.Password := 'myPassw0rd'; 
        MailMessage.Encoding := meDefault;
        MailMessage.From.Address := 'myaddress@pec.it';

        MailMessage.BccList.EMailAddresses := 'testaddress0@gmail.com';
        MailMessage.Subject := 'Test Mail';
        MailMessage.Body.Text := 'Please ignore this mail, This is a test';

        SMTP.Connect; //failure!!!
        SMTP.Send(MailMessage);

i プログラムは SMTP.Connect でハングしますが、例外や有用なエラーは発生しません。

aboe の代わりに、記事で説明されているように gmail の設定を使用すると、すべてが機能します

アドバイスをお願いできますか?

私は、exeと同じパスにIndy 10.5.8とssl dllを持っています。

4

2 に答える 2

8

Connect()Port間違ったUseTLSプロパティ割り当てで間違ったものに接続しているため、ハングします。

ポート 465 は、SMTP の暗黙的な SSL ポートです。つまり、クライアントは、SMTP 関連の通信が発生する前に、サーバーへの接続直後に接続を暗号化する必要があります。サーバーは、クライアントが SSL ハンドシェイクを送信することを期待していますが、設定したため、クライアントはそれを行っていませんUseTLS=utUseExplicitTLS。これはTIdSMTP、サーバーへの接続時に接続が最初は暗号化されていないことを期待するように指示し、その後TIdSMTP、明示的なSTARTTLSコマンドをサーバーに送信して、必要に応じて動的に TLS 暗号化を有効にすることができます。

したがって、TIdSMTPサーバーが SMTP グリーティングを送信するのを待っていますが、サーバーは決して送信しません。サーバーは、クライアントが SSL ハンドシェイクを送信することを期待していますが、決して送信しません。いずれかのパーティが切断されるまで、デッドロックが発生します。

ポート 465 に接続する場合は、UseTLS=utUseImplicitTLS代わりに設定する必要があります。を使用するUseTLS=utUseExplicitTLSには、代わりにポート 25 または 587 に接続する必要があります。

于 2012-07-05T23:21:43.763 に答える
0

多くのメールサーバーは、メーラーボットがスパムメールを配信しようとして攻撃するのを防ぐために、接続の受け入れを遅らせます。

あなたが見ているハングは接続の長い遅延である可能性があります。私は以前にこれらのコンポーネントを多くの異なるサーバーで使用しましたが、接続は常にエラー時に例外を返します。私の場合、wiresharkなどのパケットスニファを使用して何が起こっているかを確認します

于 2012-07-05T22:57:41.177 に答える