2011-10-13 16 views
7

Decir que tengo una clase de correo electrónico que tiene las siguientes propiedades:Cálculo del tamaño de un correo electrónico en .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; } 

que necesito para calcular el tamaño del correo electrónico y si es menos de 10 MB de correo electrónico de otra manera envíe el contenido como un fax (para evitar que se devuelva desde su destino).

Puedo calcular el tamaño de los archivos adjuntos con relativa facilidad.

¿Existe alguna manera precisa de calcular el tamaño completo del correo electrónico? Supongo que tendré que agregar el tamaño de las cadenas y la información del encabezado que se adjuntará.

+3

Creo que en comparación con los archivos adjuntos y tal vez el contenido del cuerpo, todos los demás tamaños, como encabezado, etc. deben ser bastante insignificantes. –

+0

¡Eso es cierto, pero necesito ser exacto! es decir, 1 byte inferior debe enviarse por correo electrónico, 1 byte debe enviarse por fax. No puedo ignorar el tamaño de las cadenas – woggles

Respuesta

12

No se puede precisar el tamaño del encabezado. Dado que todos los servidores que pasan el correo al siguiente servidor pueden agregar algunos datos al encabezado. Esto puede ir desde una simple línea hasta el puntaje completo del escaneo de spam.

Por lo que siempre se equivocarán unos pocos bytes.

En cuanto al tamaño de los archivos adjuntos: Están codificados, por lo que el número de bytes no es el tamaño real tomado. Si los convierte en Base64 y toman la longitud de esa cadena, es aproximadamente el tamaño que tomarán en el correo electrónico (sin encabezado de archivo adjunto, dependiendo del nombre del archivo adjunto). Una estimación es nr de bytes * 1.33.

Puede obtener una buena pista, si el correo se acerca a 10 MB, pero cuando el correo final y recibido es exactamente de 10 MB no se conoce.

+5

+1 ... y ni siquiera puede estar seguro si su destino asume 10 MB = 10240 Kb o 10 MB = 10000 Kb. – Filburt

+1

En este caso, puedo porque es un destino interno, pero punto tomado – woggles

1

El tamaño total será la longitud de las cuerdas más el tamaño de los archivos adjuntos.

Si está serializando esto en un formato de correo electrónico adecuado utilizando una secuencia, puede utilizar la propiedad Stream.Length para obtener la longitud fácilmente.

En lugar de utilizar byte[] para almacenar los archivos adjuntos en la memoria, le sugiero que utilice FileInfo para obtener la longitud de los archivos adjuntos y luego usar una a directamente tubería FileStream los datos del archivo adjunto en un archivo de correo electrónico de destino o red de arroyos:

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

Los archivos adjuntos nunca se envían tal cual, sino que están codificados en base64. Esto aumentará el tamaño de cada archivo adjunto, por ejemplo 'Stream.Length' en un tercio. – liggett78

+0

El correo es un System.Net.Mail.MailMessage y se enviará utilizando System.Net.SmtpClient – woggles

+0

En cuyo caso, aún no desea utilizar matrices de bytes. Consulte http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.attachments.aspx – Polynomial

Cuestiones relacionadas