估计新邮件的大小

Estimate the size of a new mail

我们有一个配置为 message_size_limit=10240000(默认值)的 postfix 服务器,我现在想防止创建任何大于此的邮件。因为否则我会得到一个 "connection broken" 错误,这很难通过有意义的错误消息呈现给用户。

message_size_limit的定义是:

The maximal size in bytes of a message, including envelope information.

我的问题是:如何计算/预测/估计创建的包含大量不同附件的邮件的大小(以字节为单位)? javax.mail.Message.size()仅在收到邮件时可用。

有些人没有意识到的一件事是二进制附件总是 base64 编码,偶尔甚至是 ASCII 附件。由于编码过程,任何 K 字节的附件最终都会变大 33%。所以你需要知道配置服务器的人是否考虑到了这一点。

否则,看似少于广告最大值的电子邮件可能会更多。

获取您的草稿 Message 对象并使用 Message.writeTo 将其写入不处理数据但仅计算写入字节数的流:

public long getMessageSize(Message message) {
    CountingOutputStream counter = new CountingOutputStream(new NullOutputStream());
    message.saveChanges();
    message.writeTo(counter);
    return counter.getByteCount();
}

CountingOutputStream 来自 commons-io,但来自 Guava 或更慢的 ByteArrayOutputStream也会做。

这将为您估算邮件的总体大小。

这样做会很昂贵,因此您不能(例如)对用户在消息中键入的每个字符都这样做。您只需要在某些事件(例如,添加附件)或在(例如)将数据输入到消息中 5 分钟后执行此操作。您需要一种策略来降低运营成本,同时向用户提供及时的反馈。

如果这样做,请务必在每次调用 Message.writeTo 之前调用 Message.saveChanges,并在真正发送消息之前调用。