2009-02-09 4 views
15

У меня есть документ excel, представленный как байт [], и я хочу отправить его как приложение в электронном письме.Как добавить вложение в электронное письмо с помощью System.Net.Mail?

У меня возникли проблемы с созданием вложения.

я могу создать Вложений, который имеет следующие конструкторы:

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

Моя идея в данный момент является создание MemoryStream из Byte [] и передать его в метод, который создает приложение.

К сожалению, я не вижу способа получить заданное имя файла и тип содержимого из MemoryStream, и я также не вижу, как указать правильный тип контента. Есть варианты для простого текста, Pdf, Rtf и т. Д., Но я не вижу, что сразу же выпрыгиваю на меня, как тот, который я должен использовать для документа Excel.

Ближайший я могу найти MediaTypeNames.Application.Octet, который гласит:

Член октет обозначает, что вложение содержит общие бинарные данные.

Однако, даже если это тот, который нужно использовать, если он не может быть передан как свойство потока, мой метод отправки писем будет иметь возможность отправлять байт [] в виде документа Excel. .

Возможно ли использовать какой-либо другой поток, который я мог бы использовать? Или мне нужно создать собственный тип Stream, который имеет нужные мне детали.

Наверняка кто-то там сделал эту вещь раньше, и, конечно, Microsoft бы продумал до этого уровня ....

Любая помощь будет оценена.

Обновление: Пожалуйста, не голосуйте за ответы, в которых используются конструкторы, принимающие имя файла как строку. Мне действительно нужна помощь, использующая те, которые принимают поток ... Я хочу, чтобы не писать файл на диск, отправлять его по электронной почте и сразу же удалять. Поскольку существует метод, который позволяет мне делать это, я бы хотел использовать его, если это вообще возможно.

Решение Update

Конрада удалось найти то, что я искал! Спасибо, куча человека!

Я просто задокументирую предлагаемое решение на случай, если что-то случится с контентом по прилагаемой ссылке.

Кредит для этого решения переходит к 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); 
} 

В моем случае, это просто означает, что я должен изменить способ, чтобы взять имя файла и FileFormat как строки. Я попробую использовать Octet один ... но в противном случае я просто перейду в официальный тип MIME.

Все, что считается, это довольно очевидное решение ... но я ценю помощь в его решении ...и хорошо, что это решение будет задокументировано для будущих программистов, имеющих такую ​​же проблему.

Еще раз спасибо за помощь!

ответ

11

Конструктор вложений имеет конструктор, который делает то, что вам нужно. Я предполагаю, что вы используете класс System.Net.MailMessage из .NET Framework 2. Если так read this link для некоторого образца кода, что вам нужно

+1

Спасибо! Это именно то, что я искал. Как вам удалось это найти? Я предполагаю, что мы оба используем один и тот же Google для поиска? – mezoid

+0

Ха-ха! Ну, давайте просто скажем, что в ходе работы я провожу много времени на поиск ответов на проблемы! – Rad

+0

Спасибо Rad, очень удобная ссылка, что – JsonStatham

0

--------------- Я предполагаю, что это неправильно, это если у вас есть файл, который вы хотите добавить ---------------

это выглядит как есть пример отправки почты с вложением здесь:

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

Я надеюсь, что это то, что вы ищете.

+0

unfortunat а не потому, что метод, используемый в этом примере, должен передать строку имени файла ... что означает, что файл должен быть записан на диск перед его отправкой. Я хочу сделать все это в памяти, так как у меня нет причин писать файл на диск, отправлять его, а затем удалять файл. – mezoid

+1

извините, проголосовать за ваш ответ. Джон, но кто-то проголосовал за него, и это не правильный ответ. Пожалуйста, никто другой не проголосует за этот ответ ... Мне нужно создать вложение, используя конструкторы, которые берут Stream, а не строку. – mezoid

0

Параметр имени в конструкторе вложения - это имя, которое будет отображаться для вложения в электронном письме получателя.

Таким образом, вы можете свободно выбирать параметр имени (расширение .xls предпочтительнее) и устанавливать для параметра mediaType значение «application/vnd.ms-excel», который является определенным MIME type для файлов excel.

0

С момента link от accepted answer нет, здесь от Wayback Machine

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

Full:

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; 
} 
Смежные вопросы