在.net中计算电子邮件的大小

本文关键字:电子邮件 计算 net | 更新日期: 2023-09-27 18:11:02

假设我有一个email类,它有以下属性:

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的电子邮件,它将以传真的形式发送内容(以防止它从目的地被反弹)。

我可以比较容易地计算附件的大小。

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

在.net中计算电子邮件的大小

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

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

关于附件的大小:它们是编码的,所以nr字节不是实际的大小。如果您将它们转换为Base64并获取该字符串的长度,那么这就是它们将在电子邮件中接受的大小(没有附件头,取决于附件名称)。估计是nr * 1.33。

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

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

如果你使用流将其序列化为适当的电子邮件格式,你可以使用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);
        }
    }
}