【问题标题】:Calculating the size of an email in .NET在 .NET 中计算电子邮件的大小
【发布时间】:2011-12-06 18:00:21
【问题描述】:

假设我有一个具有以下属性的电子邮件类:

public string From { get; set; }
public string To { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
public Dictionary<string, byte[]> Attachments { get; set; }

我需要计算电子邮件的大小,如果电子邮件小于 10MB,则将内容作为传真发送(以防止它从目的地退回)。

我可以相对容易地计算附件的大小。

是否有准确的方法来计算整个电子邮件的大小?我猜我需要添加字符串的大小以及将附加的任何标头信息?

【问题讨论】:

  • 我认为与附件和正文内容相比,标题等所有其他大小应该可以忽略不计。
  • 确实如此,但我需要准确!即下面的1 个字节应该通过电子邮件发送,超过1 个字节的应该传真。我不能忽略字符串的大小

标签: c# asp.net email


【解决方案1】:

您无法准确知道标头的大小。由于将邮件传递到下一个服务器的所有服务器都可能会在标头中添加一些数据。这可以从简单的一行到垃圾邮件扫描的完整分数。

所以你总会弄错几个字节。

至于附件的大小:它们是经过编码的,因此 nr 字节不是实际占用的大小。如果您将它们转换为 Base64 并获取该字符串的长度,这大约是它们在电子邮件中的大小(没有附件标题,取决于附件名称)。估计为 nr 个字节 * 1.33。

如果邮件接近 10 MB,您可以得到一个很好的线索,但不知道最终和收到的邮件何时恰好是 10 MB。

【讨论】:

  • +1 ...您甚至无法确定您的目标是假定 10 MB = 10240 Kb 还是 10 MB = 10000 Kb。
  • 在这种情况下我可以,因为它是一个内部目的地,但要注意
【解决方案2】:

总大小将是字符串的长度加上附件的大小。

如果您使用流将其序列化为正确的电子邮件格式,则可以使用Stream.Length 属性轻松获取长度。

建议您不要使用byte[] 将附件存储在内存中,而是使用FileInfo 来获取附件的长度,然后使用FileStream 将附件数据直接通过管道传输到目标电子邮件文件或网络中流:

using System.IO;
...
FileInfo fi = new FileInfo(@"c:\path\to\file");
long fileSize = fi.Length;
...
// assuming List<string> for attachment file names
foreach (string attachFile in attachments)
{
    using (FileStream afs = new FileStream(attachFile))
    {
        byte[] buffer = new byte[1024];
        while (!afs.EndOfstream)
        {
            int br = afs.Read(buffer, 0, 1024);
            // assume targetStream is the NetworkStream or FileStream that you want to write to
            targetStream.Write(buffer, 0, br);
        }
    }
}

【讨论】:

  • 附件永远不会按原样发送,而是 base64 编码。这将增加每个附件的大小,例如 Stream.Length 增加三分之一。
  • 邮件是 System.Net.Mail.MailMessage,将使用 System.Net.SmtpClient 发送
  • 在这种情况下,您仍然不想使用字节数组。见msdn.microsoft.com/en-us/library/…
  • @Polynomial byte[] 被转换为 MemoryStream,然后在发送前转换为 System.Net.Mail.Attachment。
  • 我不会担心现代计算机中的 10MB。大多数客户端有 4GB,而服务器则更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多