Я пишу программу для прикрепления файла к электронной почте. В настоящее время я сохраняю файл FileStream
на диск, а затем использую
System.Net.Mail.MailMessage.Attachments.Add(
new System.Net.Mail.Attachment("file name"));
Я не хочу хранить файл на диске, я хочу сохранить файл в памяти и передать его из потока памяти Attachment
.
c#
email
smtp
memorystream
Заин Али
источник
источник
System.Net.Mime.MediaTypeNames.Application.Pdf
writer.Disopose()
было слишком рано для моего решения, но все остальное - отличный пример.ms.Position = 0;
перед созданием вложения должен быть .Немного позднее вступление - но, надеюсь, все же полезно для кого-то там: -
Вот упрощенный фрагмент для отправки строки в памяти в виде вложения электронной почты (в данном конкретном случае файл CSV).
StreamWriter и базовый поток не следует удалять до тех пор, пока сообщение не будет отправлено (во избежание
ObjectDisposedException: Cannot access a closed Stream
).источник
stream.position = 0;
stream.Position=0
.Поскольку я нигде не мог найти подтверждения этому, я проверил, удалит ли удаление MailMessage и / или объекта Attachment загруженный в них поток, как я ожидал.
В следующем тесте действительно видно, что при удалении MailMessage все потоки, используемые для создания вложений, также будут удалены. Итак, пока вы распоряжаетесь своим MailMessage, потоки, которые пошли на его создание, не нуждаются в дополнительной обработке.
источник
Если вы действительно хотите добавить .pdf, я счел необходимым установить позицию потока памяти на ноль.
источник
Если все, что вы делаете, это прикрепляете строку, вы можете сделать это всего за две строки:
Мне не удалось заставить свою работать, используя наш почтовый сервер с StreamWriter.
Я думаю, возможно, потому, что с StreamWriter вам не хватает информации о свойствах файла, и, возможно, нашему серверу не понравилось то, что отсутствовало.
С помощью Attachment.CreateAttachmentFromString () он создал все, что мне было нужно, и отлично работает!
В противном случае я бы предложил взять ваш файл, который находится в памяти, и открыть его с помощью MemoryStream (byte []), и пропустить StreamWriter все вместе.
источник
Я столкнулся с этим вопросом, потому что мне нужно было прикрепить файл Excel, который я генерирую с помощью кода и доступен как
MemoryStream
. Я мог прикрепить его к почтовому сообщению, но он был отправлен как файл размером 64 байта, а не размером ~ 6 КБ, как предполагалось. Итак, решение, которое сработало для меня, было следующее:Установка значения
attachment.ContentDisposition.Size
Разрешить мне отправлять сообщения с правильным размером вложения.источник
используйте ДРУГОЙ ОТКРЫТЫЙ поток памяти:
пример для lauch pdf и отправки pdf в MVC4 C # Controller
источник
stream.Position=0;
это линия, которая мне помогла. без него мой атрибут был всего лишь 504 байта из некоторых килобайт,Думаю, этот код вам поможет:
источник