Joindre un fichier à partir de MemoryStream à un MailMessage en C#
Je suis en train d'écrire un programme pour joindre un fichier à un e-mail. Actuellement, je suis du fichier de sauvegarde à l'aide de FileStream
dans le disque, puis-je utiliser
System.Net.Mail.MailMessage.Attachments.Add(
new System.Net.Mail.Attachment("file name"));
Je ne veux pas stocker le fichier dans le disque, je veux stocker un fichier dans la mémoire et de la mémoire de flux de transmettre à des Attachment
.
Vous devez vous connecter pour publier un commentaire.
Voici un exemple de code.
Edit 1
Vous pouvez spécifier d'autres types de fichiers par le Système.Net.Le Mime.MimeTypeNames comme
System.Net.Mime.MediaTypeNames.Application.Pdf
Basé sur Type Mime vous devez spécifier l'extension appropriée dans le nom de fichier par exemple
"myFile.pdf"
System.Net.Mime.MediaTypeNames.Application.Pdf
writer.Disopose()
était trop tôt pour ma solution, mais tous les autres en est l'exemple parfait.ms.Position = 0;
avant la création de la pièce jointe.Un peu en retard mais j'espère toujours utile à quelqu'un là-bas:-
Voici un extrait simplifié pour l'envoi d'un mémoire de chaîne en tant que pièce jointe à un email (un fichier CSV dans ce cas particulier).
Le StreamWriter et le flux sous-jacent ne doit pas être éliminé jusqu'à ce qu'après que le message a été envoyé (pour éviter
ObjectDisposedException: Cannot access a closed Stream
).stream.position = 0;
stream.Position=0
.Puisque je ne pouvais pas trouver la confirmation de ce n'importe où, j'ai testé si l'élimination de la MailMessage et/ou de la pièce Jointe a pour but de disposer d'un ruisseau chargé en eux comme je m'y attendais allait se passer.
Il n'apparaît pas avec le test suivant que lorsque le MailMessage est éliminé, tous les cours d'eau utilisés pour créer des pièces jointes seront également éliminés. Donc, tant que vous jetez votre MailMessage le flux de création n'ont pas besoin de manipulation au-delà.
Si vous voulez ajouter un .pdf, je l'ai trouvé également nécessaire de définir la position du flux de mémoire à Zéro.
Si tout ce que vous avez à faire est d'attacher une chaîne, vous pouvez le faire en seulement 2 lignes:
Je n'ai pas pu obtenir le mien fonctionne à l'aide de notre serveur de messagerie avec StreamWriter.
Je pense peut-être parce qu'avec StreamWriter vous manque beaucoup de fichier les informations de propriété et peut-être que notre serveur n'aime pas ce qui manquait.
Avec Pièce Jointe.CreateAttachmentFromString() il a créé tout ce dont j'ai besoin et fonctionne très bien!
Sinon, je vous suggère de prendre votre fichier dans la mémoire et de l'ouvrir à l'aide de MemoryStream(byte[]), et le saut de l'StreamWriter tous ensemble.
J'ai atterri sur cette question parce que j'avais besoin de joindre un fichier Excel je générer du code et est disponible en
MemoryStream
. J'ai pu le joindre au message, mais il a été envoyé comme 64Bytes fichier au lieu d'un ~6KB comme il se doit. Donc, la solution qui a fonctionné pour moi c'était ça:Réglage de la valeur de
attachment.ContentDisposition.Size
permettez-moi d'envoyer des messages avec la bonne taille de pièce jointe.utiliser les AUTRES memorystream:
exemple pour la lauch pdf et envoyer des fichiers pdf en MVC4 C# Contrôleur
stream.Position=0;
est la ligne qui m'a aidé. sans elle, mon attcahment était juste 504 octets instaed de quelques kbJe pense que ce code va vous aider à: