У меня есть документ 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 ...
Возможно, есть какой-нибудь другой поток, который я мог бы использовать? Или мне придется создать свой собственный тип потока, в котором есть детали, которые мне нужны.
Конечно, кто-то уже делал это раньше, и наверняка Microsoft додумалась бы до этого уровня ...
Любая помощь будет высоко ценится.
Обновление:
Пожалуйста, не голосуйте за любые ответы, которые используют конструкторы, которые принимают имя файла в виде строки. Мне действительно нужна помощь, используя те, которые принимают поток ... Я хочу избежать записи файла на диск, отправки по электронной почте, а затем немедленно удалить его. Поскольку есть метод, который позволяет мне сделать это, я бы хотел использовать его, если это вообще возможно.
Обновление решения
Конраду удалось найти то, что я искал! Спасибо, куча человек!
Я просто документирую предлагаемое решение на случай, если что-то случится с контентом по предоставленной ссылке.
Кредит для этого решения идет на 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);
}
В моем случае это просто означает, что мне придется изменить свой метод, чтобы взять имя файла и формат файла в виде строки. Я попробую использовать Octet one ... но в случае неудачи я просто передам официальный тип MIME.
Учитывая все обстоятельства, это довольно очевидное решение ... но я ценю помощь в его решении ... и хорошо, что это решение будет задокументировано для будущих программистов, имеющих такую же проблему.
Еще раз спасибо всем за помощь!