假设我有一个具有以下属性的电子邮件类:
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,则以其他方式将内容作为传真发送(以防止其从目的地退回)。
我可以相对容易地计算附件的大小。
是否有准确的方法来计算整个电子邮件的大小?我猜我需要添加字符串的大小以及将附加的任何标题信息吗?
答案 0 :(得分:12)
您无法准确了解标题的大小。由于将邮件传递到下一个服务器的所有服务器都可能会向标头添加一些数据。这可以从简单的一行到垃圾邮件扫描的完整分数。
所以你总会把它弄错几个字节。
关于附件的大小:它们是编码的,因此nr的字节不是实际的大小。如果您将它们转换为Base64并获取该字符串的长度,那就是它们将在电子邮件中占用的大小(没有附件标题,具体取决于附件名称)。估计值是nr的字节* 1.33。
如果邮件接近10 MB,但是当最终收到的邮件正好是10 MB时,你可以得到一个很好的线索。
答案 1 :(得分:1)
总大小将是字符串的长度加上附件的大小。
如果您使用流将其序列化为正确的电子邮件格式,则可以使用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);
}
}
}