我正在使用 Indy TIdSmtp 组件发送电子邮件。我发送的电子邮件会有一个很大的附件,通常在 5 到 40 MB 的范围内。我想更新一个进度条,它将显示发送的整体进度占需要发送的字节总数的百分比。我不在乎它是否真的很精确,只要足以让观看进度条的人指示整个电子邮件发送过程的进度。
有人可以指出我如何执行此操作的代码示例吗?
我正在使用 Indy TIdSmtp 组件发送电子邮件。我发送的电子邮件会有一个很大的附件,通常在 5 到 40 MB 的范围内。我想更新一个进度条,它将显示发送的整体进度占需要发送的字节总数的百分比。我不在乎它是否真的很精确,只要足以让观看进度条的人指示整个电子邮件发送过程的进度。
有人可以指出我如何执行此操作的代码示例吗?
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
根据 tempTStream.Size
属性和事件的AWorkCount
参数TIdSMTP.OnWork
,您将能够显示进度条的百分比近似值。不能保证 100% 准确,但会很接近。