Comment ajouter une pièce jointe à un courrier électronique à l'aide de System.Net.Mail?

J'ai un document excel représenté comme un byte[] et je suis désireux de les envoyer en tant que pièce jointe dans un email.

Je vais avoir un peu de difficulté à la construction de la pièce jointe.

Je peux créer un Attachement a la suivante constructeurs:

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

Mon idée pour le moment est de créer un MemoryStream du byte[] et passer à la méthode qui crée la pièce jointe.

Malheureusement je ne peut pas voir un moyen d'obtenir de la destination nom de fichier et le type de contenu à partir de la MemoryStream et je ne peux pas voir comment fournir le bon type de contenu. Il y a des options pour le format texte, Pdf, Rtf, etc, mais aucun que je peux voir, que de sauter immédiatement à moi comme celui que je dois utiliser pour un document Excel.

Le plus proche que je peux trouver est MediaTypeNames.Application.Octet qui stipule:

L'Octet membre désigne que la
la pièce jointe contient binaire générique
les données.

Cependant, même si ce n'est le seul à l'utiliser, sauf s'il peut être passé comme une propriété du Ruisseau puis ma méthode pour l'envoi d'e-mails ne seront en mesure d'envoyer un byte[] comme un document Excel...

Est là peut-être une autre sorte de Flux que je pourrais utiliser? Ou vais-je créer mon propre type de Flux qui a les détails dont j'ai besoin.

Sûrement quelqu'un a fait cette chose avant et sûrement que Microsoft aurait réfléchi à ce niveau....

Toute aide serait grandement appréciée.

Mise à jour:
Merci de ne pas voter pour toutes les réponses qui utilise les constructeurs qui prennent le nom de fichier sous forme de chaîne. Je vais vraiment avoir besoin d'aide, à l'aide de ceux qui prennent un Ruisseau...je veux éviter d'avoir à écrire le fichier sur le disque, e-mail, puis supprimez-le immédiatement. Puisqu'il y a une méthode qui me permet de faire ce que je voudrais l'utiliser, si possible.

Solution De Mise À Jour

Conrad réussi à trouver ce que je cherchais! Tas merci man!

Je vais document de la solution proposée juste au cas où quelque chose arrive à tout le contenu sur le lien fourni.

De crédit pour cette solution va à 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);
}

Dans mon cas, cela signifie juste que je vais devoir changer ma méthode de prendre le nom de fichier et fileformat comme des chaînes de caractères. Je vais essayer à l'aide de l'Octet...mais à défaut, je vais passer dans la langue officielle de type MIME.

Toutes choses considérées, c'est plutôt une solution évidente...mais j'apprécie l'aider à le résoudre...et la bonne chose est que cette solution sera documentée pour les futurs programmeurs qui ont le même problème.

Merci encore à tous pour votre aide!

source d'informationauteur mezoid