2011-10-13 8 views
7

że mam klasę e-mail, który ma następujące właściwości:Obliczanie rozmiaru wiadomości e-mail w .NET

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

Trzeba obliczyć wielkość e-mail, a jeśli jest to mniej niż 10MB email to inaczej wyślij zawartość jako faks (aby zapobiec odbijaniu jej z miejsca przeznaczenia).

Mogę stosunkowo łatwo obliczyć rozmiar załączników.

Czy istnieje dokładny sposób obliczenia całego rozmiaru wiadomości e-mail? Zgaduję, że muszę dodać rozmiar ciągów, a także wszelkie informacje nagłówkowe, które zostaną dołączone?

+3

Myślę, że w porównaniu do załączników i może treści ciała, wszystkie inne rozmiary, takie jak nagłówek itp., Powinny być raczej zaniedbywalne. –

+0

To prawda, ale muszę być dokładna! tzn. 1 bajt pod e-mailem powinien zostać przesłany pocztą elektroniczną, 1 bajt powinien zostać przesłany faksem. Nie mogę ignorować rozmiaru ciągów znaków – woggles

Odpowiedz

12

Nie można dokładnie znać wielkości nagłówka. Ponieważ wszystkie serwery, które przekazują pocztę do następnego serwera, mogą dodać pewne dane do nagłówka. Może to wahać się od jednej prostej linii do pełnego wyniku skanowania spamu.

Więc zawsze będziesz źle pomylić kilka bajtów.

Jeśli chodzi o rozmiar załączników: są zakodowane, więc liczba bajtów nie jest faktycznym rozmiarem. Jeśli skonwertujesz je do Base64 i pobierzesz długość tego ciągu, to mniej więcej tyle, ile zajmą e-maile (bez nagłówka załącznika, w zależności od nazwy załącznika). Szacunkowy jest nr bajtów * 1.33.

Możesz uzyskać dobrą wskazówkę, jeśli poczta zbliża się do 10 MB, ale kiedy ostateczna i odebrana poczta ma dokładnie 10 MB nie jest znana.

+5

+1 ... i nie można nawet być pewnym, czy miejsce docelowe ma 10 MB = 10240 Kb lub 10 MB = 10000 Kb. – Filburt

+1

W tym przypadku mogę, ponieważ jest to miejsce docelowe, ale punkt jest zajęty – woggles

1

Łączny rozmiar będzie długością ciągów plus rozmiar załączników.

Jeśli serializujesz to w odpowiedni format e-mailowy, korzystając ze strumienia, możesz użyć właściwości Stream.Length, aby łatwo uzyskać długość.

Zamiast byte[] do przechowywania załączników w pamięci, proponuję użyć FileInfo aby uzyskać długość załączników, a następnie wykorzystywać dane Załącznik A FileStream bezpośrednio Rura do pliku email cel lub sieciowego strumienia:

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); 
     } 
    } 
} 
+1

Załączniki nigdy nie są wysyłane tak jak są, ale są zakodowane w base64. Spowoduje to zwiększenie wielkości każdego załącznika, np. "Strumień.Leżkość" o jedną trzecią. – liggett78

+0

Poczta jest System.Net.Mail.MailMessage i zostanie wysłana za pomocą System.Net.SmtpClient – woggles

+0

W takim przypadku nadal nie chcesz używać tablic bajtowych. Zobacz http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.attachments.aspx – Polynomial