Нужен пример 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%, но он будет близок.

Другие вопросы по тегам