1

我正在使用 Indy TIdSmtp 组件发送电子邮件。我发送的电子邮件会有一个很大的附件,通常在 5 到 40 MB 的范围内。我想更新一个进度条,它将显示发送的整体进度占需要发送的字节总数的百分比。我不在乎它是否真的很精确,只要足以让观看进度条的人指示整个电子邮件发送过程的进度。

有人可以指出我如何执行此操作的代码示例吗?

4

1 回答 1

4

TIdSMTP在将电子邮件发送到服务器时对其进行即时编码。正在发送的字节总数是未知的。您能够确定一个甚至相当接近的值的唯一方法是TStream通过该TIdMessage.SaveToStream()方法将电子邮件编码为一个临时值,然后获取该TStream.Size属性的值。由于您正在编码大型附件,这将需要一些时间和大量的内存开销。由于TIdSMTP只会在传输过程中再次重新编码电子邮件,因此TStream.Size由于各种电子邮件标头(例如时间戳和 MIME 边界)的动态特性,无法保证实际传输的字节数与临时值匹配。

要确定实际发送了多少字节,请使用TIdSMTP.OnWork...事件,其中AWorkMode参数将设置为wmWrite。由于TIdSMTP.Send()事先不知道它将发送多少字节,因此事件的AWorkCountMax参数将为,但至少您会知道实际的电子邮件数据何时开始编码/发送(在与服务器交换了几个命令之后)。事件的参数将是实际发送的字节总数。触发事件时,电子邮件已完成发送。TIdSMTP.OnWorkBegin0TIdSMTPAWorkCountTIdSMTP.OnWorkTIdSMTP.OnWorkEnd

根据 tempTStream.Size属性和事件的AWorkCount参数TIdSMTP.OnWork,您将能够显示进度条的百分比近似值。不能保证 100% 准确,但会很接近。

于 2012-05-16T02:43:52.237 回答