Piszę program do załączania pliku do wiadomości e-mail. Obecnie zapisuję plik za pomocą FileStream
na dysku, a następnie używam
System.Net.Mail.MailMessage.Attachments.Add(
new System.Net.Mail.Attachment("file name"));
Nie chcę przechowywać pliku na dysku, chcę przechowywać plik w pamięci i ze strumienia pamięci przekazać to do Attachment
.
c#
email
smtp
memorystream
Zain Ali
źródło
źródło
System.Net.Mime.MediaTypeNames.Application.Pdf
writer.Disopose()
było za wcześnie na moje rozwiązanie, ale wszystkie inne są świetnym przykładem.ms.Position = 0;
przed utworzeniem załącznika powinien być .Trochę późny wpis - ale mam nadzieję, że nadal komuś tam się przyda: -
Oto uproszczony fragment do wysyłania ciągu w pamięci jako załącznika do wiadomości e-mail (w tym konkretnym przypadku plik CSV).
StreamWriter i źródłowy strumień nie powinny być usuwane, dopóki nie zostanie wysłany komunikat (aby uniknąć
ObjectDisposedException: Cannot access a closed Stream
).źródło
stream.position = 0;
stream.Position=0
.Ponieważ nigdzie nie mogłem znaleźć potwierdzenia tego, przetestowałem, czy pozbycie się MailMessage i / lub obiektu Attachment spowoduje usunięcie załadowanego do nich strumienia, tak jak się spodziewałem.
W przypadku następującego testu wygląda na to, że po usunięciu wiadomości MailMessage wszystkie strumienie używane do tworzenia załączników również zostaną usunięte. Tak długo, jak usuniesz swoją MailMessage, strumienie, które zostały użyte do jej utworzenia, nie będą wymagały obsługi poza tym.
źródło
Jeśli faktycznie chcesz dodać plik .pdf, uznałem za konieczne ustawienie pozycji strumienia pamięci na zero.
źródło
Jeśli wszystko, co robisz, to dołączanie łańcucha, możesz to zrobić w zaledwie 2 wierszach:
Nie mogłem zmusić mojego do pracy przy użyciu naszego serwera pocztowego ze StreamWriter.
Myślę, że może dlatego, że w przypadku StreamWriter brakuje wielu informacji o właściwościach plików, a może nasz serwer nie spodobał się tego, czego brakowało.
Dzięki Attachment.CreateAttachmentFromString () stworzył wszystko, czego potrzebowałem i działa świetnie!
W przeciwnym razie sugerowałbym wzięcie pliku, który jest w pamięci i otwarcie go za pomocą MemoryStream (bajt []) i pominięcie StreamWriter razem.
źródło
Wylądowałem na tym pytaniu, ponieważ musiałem załączyć plik Excel, który wygenerowałem za pomocą kodu i jest dostępny jako
MemoryStream
. Mogłem dołączyć go do wiadomości e-mail, ale został wysłany jako plik 64-bajtowy zamiast ~ 6KB, jak było to zamierzone. Tak więc rozwiązanie, które działało dla mnie, było następujące:Ustawienie wartości opcji
attachment.ContentDisposition.Size
pozwól mi wysyłać wiadomości z odpowiednim rozmiarem załącznika.źródło
użyj INNEGO OTWARTEGO strumienia pamięci:
przykład dla lauch pdf i wyślij pdf w kontrolerze MVC4 C #
źródło
stream.Position=0;
to linia, która mi pomogła. bez tego moja uwaga wynosiła tylko 504 bajty zamiast niektórych KBMyślę, że ten kod ci pomoże:
źródło