2011-10-13 6 views
7

Dire che ho una classe di posta elettronica che ha le seguenti proprietà:Calcolo delle dimensioni di una e-mail a .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; } 

ho bisogno di calcolare la dimensione del messaggio e se è inferiore a 10 MB e-mail altrimenti inviare il contenuto come fax (per evitare che venga rimbalzato dalla sua destinazione).

Posso calcolare la dimensione degli allegati relativamente facilmente.

Esiste un modo preciso per calcolare l'intera dimensione dell'e-mail? Sto indovinando che avrò bisogno di aggiungere la dimensione delle stringhe e qualsiasi informazione di intestazione che verrà aggiunta?

+3

Penso che rispetto agli allegati e forse al contenuto del corpo, tutte le altre dimensioni come l'intestazione ecc. Dovrebbero essere piuttosto trascurabili. –

+0

Questo è vero, ma ho bisogno di essere accurato! cioè 1 byte sotto dovrebbe essere inviato via email, 1 byte deve essere inviato via fax. Non posso ignorare la dimensione delle stringhe – woggles

risposta

12

Non è possibile conoscere con precisione la dimensione dell'intestazione. Poiché tutti i server che passano la posta al server successivo potrebbero aggiungere alcuni dati all'intestazione. Questo può variare da una linea semplice fino al punteggio completo della scansione spam.

Quindi si sbaglia sempre qualche byte.

Per quanto riguarda la dimensione degli allegati: Sono codificati, quindi il numero di byte non è la dimensione effettiva presa. Se li converti in Base64 e prendi la lunghezza di quella stringa, si tratta delle dimensioni che prenderanno nell'e-mail (senza l'intestazione dell'allegato, a seconda del nome dell'allegato). Una stima è nr di byte * 1,33.

È possibile ottenere un buon indizio, se la posta si avvicina a 10 MB, ma quando la posta finale e ricevuta è esattamente 10 MB non è nota.

+5

+1 ... e non puoi nemmeno essere sicuro che la tua destinazione presuma 10 MB = 10240 Kb o 10 MB = 10000 Kb. – Filburt

+1

In questo caso posso perché è una destinazione interna, ma punto preso – woggles

1

La dimensione totale corrisponderà alla lunghezza delle stringhe più la dimensione degli allegati.

Se si esegue la serializzazione di questo in un formato di posta elettronica appropriato utilizzando uno stream, è possibile utilizzare la proprietà Stream.Length per ottenere facilmente la lunghezza.

Invece di usare byte[] per memorizzare gli allegati in memoria, vi suggerisco di utilizzare FileInfo per ottenere la lunghezza degli attacchi e quindi utilizzare un FileStream per direttamente pipe i dati degli allegati in un file di e-mail di destinazione o di rete flusso:

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

Gli allegati non vengono mai inviati così come sono, ma piuttosto codificati in base64. Ciò aumenterà le dimensioni di ciascun allegato, ad esempio 'Stream.Length' di un terzo. – liggett78

+0

La posta è un messaggio System.Net.Mail.Mail.Mail e verrà inviata utilizzando System.Net.SmtpClient – woggles

+0

In questo caso, non si desidera utilizzare array di byte. Vedere http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.attachments.aspx – Polynomial

Problemi correlati