Как добавить вложение в электронную почту с помощью системы.Сеть.Почта?

у меня есть документ excel, представленный в виде байта [], и я хочу отправить его как вложение по электронной почте.

у меня возникли проблемы с построением приложения.

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

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

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

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

самое близкое, что я могу найти, это MediaTypeNames.Приложение.Октет!--14--> в которой говорится:

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

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

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

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

любая помощь была бы очень признательна.

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

решение Update

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

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

кредит для этого решения идет на www.systemnetmail.com

static void AttachmentFromStream()
{

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

//set the addresses
mail.From = new MailAddress("me@mycompany.com");
mail.To.Add("you@yourcompany.com");

//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 в качестве строк. Я попробую использовать октет...но не, что я просто пройдите официальный тип MIME.

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

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

4 ответов


вложение конструктор действительно имеет конструктор, который делает то, что вам нужно. Я предполагаю, что вы используете систему.Сеть.Класс MailMessage из .NET Framework 2. Если так читать эту ссылке для некоторого примера кода того, что вам нужно


С ссылке С принято отвечать ушел, вот он с Машина Wayback

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

полный:

static void AttachmentFromStream()
{

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

    //set the addresses
    mail.From = new MailAddress("me@mycompany.com");
    mail.To.Add("you@yourcompany.com");

    //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;
}

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

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


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

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

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

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