Расчет размера электронного письма в .NET - PullRequest
7 голосов
/ 13 октября 2011

Скажем, у меня есть класс электронной почты, который имеет следующие свойства:

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; }

Мне нужно рассчитать размер электронного письма, и если оно меньше 10 МБ, оно отправляет содержимое в виде факсапредотвратить его отскок от места назначения).

Я могу относительно легко рассчитать размер вложений.

Есть ли точный способ рассчитать полный размер электронной почты?Я предполагаю, что мне нужно будет добавить размер строк, а также любую информацию заголовка, которая будет добавлена?

Ответы [ 2 ]

12 голосов
/ 13 октября 2011

Вы не можете точно знать размер заголовка.Поскольку все серверы, которые передают почту на следующий сервер, могут добавить некоторые данные в заголовок.Это может варьироваться от одной простой строки до полной оценки сканирования спама.

Таким образом, вы всегда ошибетесь в нескольких байтах.

Что касается размера вложений: онизакодировано, поэтому nr байтов не фактический размер, взятый.Если вы конвертируете их в Base64 и берете длину этой строки, это примерно тот размер, который они примут в письме (без заголовка вложения, в зависимости от имени вложения).Оценка составляет nr байтов * 1.33.

Вы можете получить хорошую подсказку, если почта достигает 10 МБ, но когда окончательная и полученная почта точно равна 10 МБ, неизвестно.

1 голос
/ 13 октября 2011

Общий размер будет равен длине строк плюс размер вложений.

Если вы сериализуете это в правильный формат электронной почты с использованием потока, вы можете использовать свойство 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...