IndyTIdSmtpコンポーネントを使用して電子メールを送信しています。私が送信する電子メールには、通常5〜40MBの範囲の大きな添付ファイルがあります。送信する必要のある合計バイト数のパーセンテージとして送信の全体的な進行状況を表示する進行状況バーを更新したいと思います。それが本当に正確であるかどうかは気にしません。進行状況バーを見ている人に、電子メール送信プロセス全体がどれだけ進んでいるかを示すのに十分なだけです。
誰かが私にこれを行う方法を示すコードサンプルを教えてもらえますか?
IndyTIdSmtpコンポーネントを使用して電子メールを送信しています。私が送信する電子メールには、通常5〜40MBの範囲の大きな添付ファイルがあります。送信する必要のある合計バイト数のパーセンテージとして送信の全体的な進行状況を表示する進行状況バーを更新したいと思います。それが本当に正確であるかどうかは気にしません。進行状況バーを見ている人に、電子メール送信プロセス全体がどれだけ進んでいるかを示すのに十分なだけです。
誰かが私にこれを行う方法を示すコードサンプルを教えてもらえますか?
TIdSMTP
メールがサーバーに送信される際にオンザフライでエンコードします。送信される総バイト数は事前にわかりません。かなり近い値であっても値を特定できる唯一の方法はTStream
、メソッドを介して電子メールを一時的にエンコードし、プロパティTIdMessage.SaveToStream()
の値を取得することです。TStream.Size
大きな添付ファイルをエンコードしているため、時間と大量のメモリ オーバーヘッドがかかります。TIdSMTP
は送信中に電子メールを再エンコードするだけなのでTStream.Size
、タイムスタンプや MIME 境界などのさまざまな電子メール ヘッダーの動的な性質により、実際に送信されるバイト数が一時値と一致するという保証はありません。
実際に送信されているバイト数を確認するには、パラメーターが に設定されるTIdSMTP.OnWork...
イベントを使用します。は事前に送信するバイト数がわからないため、イベントのパラメーターは になりますが、少なくとも、実際の電子メール データのエンコード/送信がいつ開始されるかはわかります (がサーバーといくつかのコマンドを交換した後)。イベントのパラメーターは、実際に送信された合計バイト数になります。イベントが発生すると、メールの送信が完了します。AWorkMode
wmWrite
TIdSMTP.Send()
AWorkCountMax
TIdSMTP.OnWorkBegin
0
TIdSMTP
AWorkCount
TIdSMTP.OnWork
TIdSMTP.OnWorkEnd
一時TStream.Size
プロパティとイベントのAWorkCount
パラメーターに基づいてTIdSMTP.OnWork
、進行状況バーのパーセンテージの概算を表示できます。100% 正確であるとは限りませんが、ほぼ正確です。