2011-10-13 40 views
7

Nói rằng tôi có một lớp email có các thuộc tính sau:Tính toán kích thước của một email trong .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; } 

tôi cần phải tính toán kích thước của email và nếu nó là ít hơn 10MB email nó bằng cách khác gửi nội dung dưới dạng bản fax (để ngăn chặn nội dung bị trả về từ đích).

Tôi có thể tính toán kích thước tệp đính kèm tương đối dễ dàng.

Có cách nào chính xác để tính toàn bộ kích thước email không? Tôi đoán tôi sẽ cần phải thêm kích thước của các chuỗi cũng như bất kỳ thông tin tiêu đề nào sẽ được thêm vào?

+3

Tôi nghĩ rằng so với tệp đính kèm và nội dung có thể là nội dung, tất cả các kích thước khác như tiêu đề, v.v ... sẽ khá đáng kể. –

+0

Điều đó đúng, nhưng tôi cần phải chính xác! tức là 1 byte dưới nên được gửi qua email, 1 byte trên nên được fax. Tôi không thể bỏ qua kích thước của các chuỗi – woggles

Trả lời

12

Bạn không thể biết chính xác kích thước của tiêu đề. Vì tất cả các máy chủ chuyển thư đến máy chủ tiếp theo có thể thêm một số dữ liệu vào tiêu đề. Điều này có thể từ một dòng đơn giản, đến điểm số hoàn thành của quá trình quét spam.

Vì vậy, bạn sẽ luôn nhận được sai một vài byte.

Đối với kích thước của tệp đính kèm: Chúng được mã hóa, do đó, nr byte không phải là kích thước thực tế được thực hiện. Nếu bạn chuyển đổi chúng thành Base64 và lấy chiều dài của chuỗi đó, đó là về kích thước chúng sẽ nhận trong email (không có tiêu đề đính kèm, tùy thuộc vào tên tệp đính kèm). Ước tính là nr byte * 1,33.

Bạn có thể nhận được một đầu mối tốt, nếu thư đến 10 MB, nhưng khi thư cuối cùng và nhận được chính xác là 10 MB không được biết.

+5

+1 ... và bạn thậm chí không thể chắc chắn nếu điểm đến của bạn giả định 10 MB = 10240 Kb hoặc 10 MB = 10000 Kb. – Filburt

+1

Trong trường hợp này tôi có thể vì đó là điểm đến nội bộ, nhưng điểm – woggles

1

Tổng kích thước sẽ là độ dài của chuỗi cộng với kích thước của tệp đính kèm.

Nếu bạn đang sắp xếp thứ tự này thành định dạng email thích hợp bằng luồng, bạn có thể sử dụng thuộc tính Stream.Length để có độ dài dễ dàng.

Thay vì sử dụng byte[] để lưu trữ các file đính kèm trong bộ nhớ, tôi đề nghị bạn sử dụng FileInfo để có được chiều dài của file đính kèm và sau đó sử dụng một FileStream trực tiếp ống dữ liệu tập tin đính kèm vào một tập tin email mục tiêu hoặc mạng dòng:

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

Các tệp đính kèm không bao giờ được gửi dưới dạng, mà là mã hóa base64. Điều này sẽ làm tăng kích thước của mỗi tệp đính kèm, ví dụ: 'Luồng sóng 'một phần ba. – liggett78

+0

Thư là System.Net.Mail.MailMessage và sẽ được gửi bằng System.Net.SmtpClient – woggles

+0

Trong trường hợp đó, bạn vẫn không muốn sử dụng mảng byte. Xem http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.attachments.aspx – Polynomial

Các vấn đề liên quan