2009-02-09 42 views
15

Tôi có một tài liệu excel được biểu diễn dưới dạng một byte [] và tôi muốn gửi nó dưới dạng tệp đính kèm trong email.Làm cách nào để thêm tệp đính kèm vào email bằng System.Net.Mail?

Tôi gặp sự cố khi xây dựng tệp đính kèm.

tôi có thể tạo một file đính kèm trong đó có các nhà thầu sau:

(Stream contentStream, ContentType contentType) 
(Stream contentStream, string name) 
(Stream contentStream, string name, string mediaType) 

Ý tưởng của tôi vào lúc này là tạo ra một MemoryStream từ byte [] và vượt qua nó với phương pháp mà tạo ra các tập tin đính kèm.

Rất tiếc, tôi không thể thấy cách lấy tên tệp và loại nội dung dự định từ MemoryStream và tôi cũng không thể xem cách cung cấp loại nội dung chính xác. Có những lựa chọn cho văn bản thuần, Pdf, Rtf vv nhưng không có gì mà tôi có thể thấy rằng ngay lập tức nhảy ra khỏi tôi như là một trong tôi nên sử dụng cho một tài liệu Excel.

Gần nhất tôi có thể tìm thấy là MediaTypeNames.Application.Octet trong đó nêu:

Thành viên Octet chỉ định rằng tập tin đính kèm chứa generic nhị phân dữ liệu.

Tuy nhiên, ngay cả khi đây là mục cần sử dụng, trừ khi nó có thể được chuyển thành thuộc tính của luồng thì phương pháp gửi email của tôi sẽ chỉ có thể gửi byte [] dưới dạng tài liệu Excel ..

Có lẽ một số loại luồng khác mà tôi có thể sử dụng không? Hoặc tôi sẽ phải tạo loại Luồng của riêng mình có chi tiết tôi cần.

Chắc chắn ai đó ngoài kia đã làm điều này trước và chắc chắn Microsoft đã có thể nghĩ điều này thông qua đến mức này ....

Bất kỳ trợ giúp sẽ được nhiều đánh giá cao.

Cập nhật: Vui lòng không bỏ phiếu cho bất kỳ câu trả lời nào sử dụng hàm tạo lấy tên tệp dưới dạng chuỗi. Tôi thực sự cần sự giúp đỡ bằng cách sử dụng những người có một Stream ... Tôi muốn tránh phải viết các tập tin vào đĩa, gửi email cho nó, và sau đó ngay lập tức xóa nó. Vì có một phương pháp cho phép tôi làm điều đó, tôi muốn sử dụng phương pháp đó nếu có thể.

Solution Cập nhật

Conrad quản lý để tìm thấy những gì tôi đang tìm kiếm! Cảm ơn người đàn ông heaps!

Tôi sẽ chỉ ghi lại giải pháp được đề xuất trong trường hợp có điều gì đó xảy ra với nội dung tại liên kết được cung cấp.

Tín dụng cho giải pháp này đi vào www.systemnetmail.com

static void AttachmentFromStream() 
{ 

//create the mail message 
MailMessage mail = new MailMessage(); 

//set the addresses 
mail.From = new MailAddress("[email protected]"); 
mail.To.Add("[email protected]"); 

//set the content 
mail.Subject = "This is an email"; 
mail.Body = "this content is in the body"; 

//Get some binary data 
byte[] data = GetData(); 

//save the data to a memory stream 
MemoryStream ms = new MemoryStream(data); 

//create the attachment from a stream. Be sure to name the data 
//with a file and 
//media type that is respective of the data 
mail.Attachments.Add(new Attachment(ms, "example.txt", "text/plain")); 

SmtpClient smtp = new SmtpClient("127.0.0.1"); 
smtp.Send(mail); 
} 

Trong trường hợp của tôi, nó chỉ có nghĩa là tôi sẽ phải thay đổi phương pháp của tôi để có những tên tập tin và fileformat như dây đàn. Tôi sẽ thử dùng Octet ... nhưng thất bại là tôi sẽ chuyển sang loại MIME chính thức.

Mọi thứ được xem xét, đây là một giải pháp khá rõ ràng ... nhưng tôi đánh giá cao sự trợ giúp trong việc giải quyết nó ...và điều tốt là giải pháp này sẽ được ghi lại cho các lập trình viên tương lai có cùng vấn đề.

Cảm ơn mọi người đã giúp bạn!

Trả lời

11

Trình tạo tệp đính kèm thực sự có một hàm tạo để thực hiện những gì bạn cần. Tôi giả sử bạn đang sử dụng lớp System.Net.MailMessage từ .NET Framework 2. Nếu vậy read this link cho một số mẫu mã của những gì bạn cần

+1

Cảm ơn! Đó chính xác là những gì tôi đang tìm kiếm. Làm thế nào bạn quản lý để tìm thấy điều đó? Tôi cho rằng cả hai chúng tôi đều sử dụng cùng một Google để tìm kiếm? – mezoid

+0

Ha ha! Vâng, chúng ta hãy chỉ nói trong quá trình m công việc tôi dành rất nhiều thời gian của tôi tìm kiếm câu trả lời cho các vấn đề! – Rad

+0

Cảm ơn Rad, liên kết rất tiện lợi mà – JsonStatham

0

--------------- Tôi đoán là sai, đây là nếu bạn có tệp bạn muốn đính kèm ---------------

nó trông giống như có một ví dụ về việc gửi mail với một tập tin đính kèm ở đây:

http://www.aspnettutorials.com/tutorials/email/email-attach-aspnet2-csharp.aspx

tôi hy vọng điều này là những gì bạn đang tìm kiếm.

+0

unfortunat ely không phải vì phương pháp được sử dụng trong ví dụ đó là truyền một chuỗi tên tệp ... có nghĩa là tệp phải được ghi vào đĩa trước khi gửi. Tôi muốn làm tất cả trong bộ nhớ vì tôi không có lý do để ghi tập tin vào đĩa, gửi nó, và sau đó xóa các tập tin .. – mezoid

+1

xin lỗi để xuống bỏ phiếu trả lời của bạn John nhưng ai đó lên bầu chọn nó và nó không phải là Câu trả lời chính xác. Xin vui lòng, không ai khác bỏ phiếu cho câu trả lời này ... Tôi cần phải tạo tập tin đính kèm bằng cách sử dụng các nhà thầu mà có một dòng không phải là một chuỗi. – mezoid

0

Tham số tên trong hàm tạo tệp đính kèm là tên sẽ được hiển thị cho tệp đính kèm trong email của người nhận.

Vì vậy, bạn có thể tự do chọn tham số tên (tiện ích mở rộng .xls) và đặt tham số MediaType thành "application/vnd.ms-excel", được định nghĩa MIME type cho các tệp excel.

0

Kể từ khi link từ accepted answer đã biến mất, ở đây nó là từ Wayback Machine

TL; DR:mail.Attachments.Add(new Attachment(contentStream, "yourfilename.txt", "text/plain"));

đầy đủ:

static void AttachmentFromStream() 
{ 

    //create the mail message 
    MailMessage mail = new MailMessage(); 

    //set the addresses 
    mail.From = new MailAddress("[email protected]"); 
    mail.To.Add("[email protected]"); 

    //set the content 
    mail.Subject = "This is an email"; 
    mail.Body = "this content is in the body"; 

    //Get some binary data 
    byte[] data = GetData(); 

    //save the data to a memory stream 
    MemoryStream ms = new MemoryStream(data); 

    //create the attachment from a stream. Be sure to name the data with a file and 
    //media type that is respective of the data 
    mail.Attachments.Add(new Attachment(ms, "example.txt", "text/plain")); 

    //send the message 
    SmtpClient smtp = new SmtpClient("127.0.0.1"); 
    smtp.Send(mail); 
} 
static byte[] GetData() 
{ 
    //this method just returns some binary data. 
    //it could come from anywhere, such as Sql Server 
    string s = "this is some text"; 
    byte[] data = Encoding.ASCII.GetBytes(s); 
    return data; 
} 
Các vấn đề liên quan