估计新邮件的大小
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
,并在真正发送消息之前调用。
我们有一个配置为 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
,并在真正发送消息之前调用。