У меня есть документ Excel, представленный в виде байта [], и я хочу отправить его как вложение в электронное письмо.
У меня проблемы с установкой вложения.
Я могу создать вложение, в котором есть следующие конструкторы:
(Stream contentStream, ContentType contentType)
(Stream contentStream, string name)
(Stream contentStream, string name, string mediaType)
Моя идея на данный момент состоит в том, чтобы создать MemoryStream из байта [] и передать его методу, который создает вложение.
К сожалению, я не вижу способа получить предполагаемое имя файла и тип содержимого из MemoryStream, а также не вижу, как предоставить правильный тип содержимого. Есть варианты для обычного текста, Pdf, Rtf и т. Д., Но ни один из них, который я вижу, сразу не бросается в глаза, как тот, который я должен использовать для документа Excel.
Ближайшее, что я могу найти, - это MediaTypeNames.Application .Octet, в котором говорится:
Член Octet означает, что вложение содержит общие двоичные данные.
Однако, даже если это тот, который нужно использовать, если он не может быть передан как свойство Stream, тогда мой метод отправки электронных писем сможет отправлять только byte [] как документ Excel ...
Может быть, я мог бы использовать какой-нибудь другой поток? Или мне придется создать свой собственный тип Stream, который будет содержать нужные мне детали.
Наверняка кто-то делал это раньше, и Microsoft наверняка продумала бы это до такого уровня ...
Любая помощь приветствуется.
Обновление. Не голосуйте за ответы, в которых используются конструкторы, которые принимают имя файла в виде строки. Мне действительно нужна помощь с использованием тех, которые принимают Stream ... Я хочу избежать необходимости записывать файл на диск, отправлять его по электронной почте, а затем немедленно удалять его. Поскольку есть метод, который позволяет мне это сделать, я хотел бы использовать его, если это вообще возможно.
Обновление решения
Конраду удалось найти то, что я искал! Большое спасибо, чувак!
Я просто задокументирую предлагаемое решение на случай, если что-то случится с контентом по предоставленной ссылке.
Благодарим за это решение 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);
}
В моем случае это просто означает, что мне придется изменить свой метод, чтобы имя файла и формат файла принимались как строки. Я попробую использовать Octet ... но в противном случае я просто передам официальный тип MIME.
Учитывая все обстоятельства, это довольно очевидное решение ... но я ценю помощь в его решении ... и хорошо, что это решение будет задокументировано для будущих программистов, у которых возникнет такая же проблема.
Еще раз спасибо всем за помощь!