J'écris un programme pour joindre un fichier à un e-mail. Actuellement, j'enregistre le fichier en utilisant FileStream
sur le disque, puis j'utilise
System.Net.Mail.MailMessage.Attachments.Add(
new System.Net.Mail.Attachment("file name"));
Je ne veux pas stocker de fichier sur le disque, je veux stocker le fichier en mémoire et à partir du flux de mémoire, passez-le à Attachment
.
c#
email
smtp
memorystream
Zain Ali
la source
la source
System.Net.Mime.MediaTypeNames.Application.Pdf
writer.Disopose()
était trop tôt pour ma solution mais tous les autres sont un excellent exemple.ms.Position = 0;
avant de créer la pièce jointe.Une entrée un peu tardive - mais j'espère toujours utile à quelqu'un là-bas: -
Voici un extrait de code simplifié pour envoyer une chaîne en mémoire sous forme de pièce jointe à un e-mail (un fichier CSV dans ce cas particulier).
Le StreamWriter et le flux sous-jacent ne doivent pas être supprimés tant que le message n'a pas été envoyé (à éviter
ObjectDisposedException: Cannot access a closed Stream
).la source
stream.position = 0;
stream.Position=0
.Étant donné que je n'ai trouvé aucune confirmation de cela, j'ai testé si l'élimination du MailMessage et / ou de l'objet Attachment éliminerait le flux chargé dans ces derniers comme je m'y attendais.
Il apparaît avec le test suivant que lorsque le MailMessage est supprimé, tous les flux utilisés pour créer des pièces jointes seront également supprimés. Donc, tant que vous supprimez votre MailMessage, les flux qui ont servi à sa création n'ont pas besoin d'être traités au-delà de cela.
la source
Si vous souhaitez réellement ajouter un .pdf, j'ai trouvé nécessaire de définir la position du flux de mémoire sur zéro.
la source
Si vous ne faites que joindre une chaîne, vous pouvez le faire en seulement 2 lignes:
Je n'ai pas pu faire fonctionner le mien en utilisant notre serveur de messagerie avec StreamWriter.
Je pense que peut-être parce qu'avec StreamWriter il vous manque beaucoup d'informations sur les propriétés de fichiers et peut-être que notre serveur n'a pas aimé ce qui manquait.
Avec Attachment.CreateAttachmentFromString (), il a créé tout ce dont j'avais besoin et fonctionne très bien!
Sinon, je suggère de prendre votre fichier qui est en mémoire et de l'ouvrir à l'aide de MemoryStream (octet []), et de sauter le StreamWriter tous ensemble.
la source
J'ai atterri sur cette question car j'avais besoin de joindre un fichier Excel que je génère via du code et qui est disponible en tant que
MemoryStream
. Je pourrais le joindre au message électronique, mais il a été envoyé sous forme de fichier de 64 octets au lieu de ~ 6 Ko comme prévu. Donc, la solution qui a fonctionné pour moi était la suivante:Définition de la valeur de
attachment.ContentDisposition.Size
laissez-moi envoyer des messages avec la taille correcte de la pièce jointe.la source
utiliser AUTRE flux de mémoire OPEN:
exemple pour lancer un pdf et envoyer un pdf dans MVC4 C # Controller
la source
stream.Position=0;
est la ligne qui m'a aidé. sans cela, mon attachement ne faisait que 504 octets instaed de quelques kBsJe pense que ce code vous aidera:
la source