Как добавить вложение в электронное письмо с помощью System.Net.Mail? - PullRequest
17 голосов
/ 09 февраля 2009

У меня есть документ 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.

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

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

Ответы [ 4 ]

12 голосов
/ 09 февраля 2009

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

2 голосов
/ 24 июля 2017

Поскольку ссылка из принятого ответа исчезла, вот она из 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("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;
}
0 голосов
/ 09 февраля 2009

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

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

0 голосов
/ 09 февраля 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...