Нужен пример Delphi 6 для обновления индикатора выполнения во время операции отправки TIdSmtp, особенно для больших вложений
Я использую компонент Indy TIdSmtp для отправки электронной почты. Письма, которые я отправляю, будут иметь большое вложение, обычно в диапазоне от 5 до 40 МБ. Я хочу обновить индикатор выполнения, который будет отображать общий ход отправки в процентах от общего количества байтов, которые должны быть отправлены. Мне все равно, если он действительно точный, достаточно хорош, чтобы дать кому-то, наблюдающему за индикатором выполнения, указание на то, как далеко продвинулся весь процесс отправки электронной почты.
Может кто-нибудь указать мне пример кода, который показывает мне, как это сделать?
1 ответ
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%, но он будет близок.