Java 估计新邮件的大小

Java 估计新邮件的大小,java,email,jakarta-mail,Java,Email,Jakarta Mail,我们有一个postfix服务器,默认配置为message_size_limit=10240000,现在我想阻止创建任何大于此值的邮件。因为我得到了一个连接中断错误,这很难在一条有意义的错误消息中呈现给用户 消息大小限制的定义为: 消息(包括信封)的最大字节大小 信息 我的问题是:如何计算/预测/估计一封包含大量不同附件的已创建邮件的字节大小?javax.mail.Message.size仅在接收邮件时可用。一些人没有意识到的一点是,二进制附件始终是base64编码的,有时甚至是ASCII附件。由

我们有一个postfix服务器,默认配置为message_size_limit=10240000,现在我想阻止创建任何大于此值的邮件。因为我得到了一个连接中断错误,这很难在一条有意义的错误消息中呈现给用户

消息大小限制的定义为:

消息(包括信封)的最大字节大小 信息


我的问题是:如何计算/预测/估计一封包含大量不同附件的已创建邮件的字节大小?javax.mail.Message.size仅在接收邮件时可用。

一些人没有意识到的一点是,二进制附件始终是base64编码的,有时甚至是ASCII附件。由于编码过程,K字节的任何附件最终都会增加33%。因此,您需要知道配置服务器的人员是否考虑到这一点


否则,看起来比公布的最大值小的电子邮件可能会多得多。

有些人没有意识到的一点是,二进制附件始终是base64编码的,有时甚至是ASCII附件。由于编码过程,K字节的任何附件最终都会增加33%。因此,您需要知道配置服务器的人员是否考虑到这一点


否则,看起来比公布的最大值小的电子邮件可能会更多。

使用草稿邮件对象并使用Message.writet将其写入一个流,该流不处理数据,只计算写入的字节数:

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.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。

合计附件的大小?我正在查找问题中更改的原始字节以反映这一点,因此附件的大小需要比配置的10 MB小得多。我不明白。一旦你有了文本和附件,你就可以估计电子邮件的大小。我的问题不是我是否可以估计电子邮件的大小,而是我如何做到这一点。为此,我不能简单地求附件和文本的大小之和,因为邮件的大小(以字节为单位)比由于编码不同而产生的大小大得多。。。。它是base64,对于文本,通常每个字符最多2-4字节。显然,按照建议构建消息并编写它将是相当精确的,但估计它似乎仍然没有那么棘手。当你尝试我的建议时,距离有多远?如果距离不够近而不实用,我会有点惊讶。加上附件的大小?我正在寻找原始字节,因为问题反映了这一点,所以附件的大小需要比配置的10 MB小得多。我不明白。一旦你有了文本和附件,你就可以估计电子邮件的大小。我的问题不是我是否可以估计电子邮件的大小,而是我如何做到这一点。为此,我不能简单地求附件和文本的大小之和,因为邮件的大小(以字节为单位)比由于编码不同而产生的大小大得多。。。。它是base64,对于文本,通常每个字符最多2-4字节。显然,按照建议构建消息并编写它将是相当精确的,但估计它似乎仍然没有那么棘手。当你尝试我的建议时,距离有多远?如果距离不够近而没有用,我会有点惊讶。这并不是我问题的答案。我知道,我可以计算出基数
编码大小并添加换行符,这是很多人经常忘记的——但这更像是文字信息的大小,通常是可打印的。我在我的问题中添加了message_size_limit的定义,以表明我知道我们正在查找原始字节数。由于您说过要计算大小,我认为这将是计算时需要了解的有用信息。感谢您的努力。如果您添加了计算尺寸所需的所有信息,我将立即接受它作为正确答案。但现在它更多的是一个评论而不是一个答案。实现了协议和消息格式后,我知道它们可以非常动态。如果必须这样做,我只需计算我所知道的附件和消息正文,并添加一些开销百分比。这不是一个100%的解决方案,因为有些消息可能会被拒绝,而有些消息通常不会被拒绝,而其他消息不会在客户端被拒绝,但会在服务器上被拒绝。这并不是我问题的答案。我知道,我可以计算BASE64编码的大小并添加换行符,很多人经常会忘记这一点——但还有更多类似于文本消息的大小,它们通常是可打印的。我在我的问题中添加了message_size_limit的定义,以表明我知道我们正在查找原始字节数。由于您说过要计算大小,我认为这将是计算时需要了解的有用信息。感谢您的努力。如果您添加了计算尺寸所需的所有信息,我将立即接受它作为正确答案。但现在它更多的是一个评论而不是一个答案。实现了协议和消息格式后,我知道它们可以非常动态。如果必须这样做,我只需计算我所知道的附件和消息正文,并添加一些开销百分比。这不是一个100%的解决方案,因为有些消息可能会被拒绝,而这些消息通常不会被拒绝,而其他消息不会在客户端被拒绝,但在服务器上会被拒绝。感谢您对saveChanges的参考,我添加了一个一站式解决方案的示例。由于Java 11,您可以使用JDK替代方案:OutputStream.nullOutputStream。另外,别忘了关闭流!感谢您对saveChanges的引用,我添加了一个示例来提供一站式解决方案。另外,别忘了关闭流!