Как добавить вложение для электронной почты с помощью System.Net.Mail?
У меня есть документ excel, представленный как байт [], и я хочу отправить его как вложение в электронное письмо.
У меня возникли проблемы с созданием вложения.
Я могу создать приложение, которое имеет следующие конструкторы:
(Stream contentStream, ContentType contentType)
(Stream contentStream, string name)
(Stream contentStream, string name, string mediaType)
Моей идеей на данный момент является создание MemoryStream из байта [] и передача его методу, который создает вложение.
К сожалению, я не вижу способа получить заданное имя файла и тип содержимого из MemoryStream, и я также не могу понять, как указать правильный тип контента. Есть варианты для простого текста, Pdf, Rtf и т.д., Но я не вижу, что сразу же выпрыгиваю на меня, как тот, который я должен использовать для документа Excel.
Ближе всего я могу найти MediaTypeNames.Application.Octet, в котором говорится:
Член октета обозначает, что Вложение содержит общий двоичный файл данных.
Однако, даже если это тот, который будет использоваться, если он не может быть передан как свойство Stream, тогда мой метод отправки писем будет иметь возможность отправлять байт [] в виде документа 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-тип.
Все рассмотренное, это довольно очевидное решение... но я действительно ценю помощь в его решении... и хорошо, что это решение будет задокументировано для будущих программистов, которые имеют одинаковую проблему.
Еще раз спасибо за помощь!
Ответы
Ответ 1
Конструктор вложений действительно имеет конструктор, который делает то, что вам нужно. Я предполагаю, что вы используете класс System.Net.MailMessage из .NET Framework 2. Если это прочитайте эту ссылку для некоторого примера кода что вам нужно
Ответ 2
--------------- Я предполагаю, что ошибаюсь, это если у вас есть файл, который вы хотите добавить ---------------
похоже, что есть пример отправки почты с приложением здесь:
http://www.aspnettutorials.com/tutorials/email/email-attach-aspnet2-csharp.aspx
Надеюсь, это то, что вы ищете.
Ответ 3
Параметр имени в конструкторе вложения - это имя, которое будет отображаться для вложения в электронном письме получателя.
Таким образом, вы можете свободно выбирать параметр имени (предпочтительно расширение .xls) и устанавливать для параметра mediaType значение "application/vnd.ms-excel", который является определенным MIME-тип для файлов excel.
Ответ 4
Поскольку ссылка из принятого ответа исчезла, вот она из Wayback Machine
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("[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;
}