Estou escrevendo um programa para anexar um arquivo a um e-mail. Atualmente estou salvando o arquivo usando FileStream
no disco, e então uso
System.Net.Mail.MailMessage.Attachments.Add(
new System.Net.Mail.Attachment("file name"));
Não quero armazenar o arquivo no disco, quero armazenar o arquivo na memória e do fluxo de memória passar isso para Attachment
.
c#
email
smtp
memorystream
Zain Ali
fonte
fonte
System.Net.Mime.MediaTypeNames.Application.Pdf
writer.Disopose()
era muito cedo para minha solução, mas todos os outros são um ótimo exemplo.ms.Position = 0;
antes de criar o anexo.Uma entrada um pouco tardia - mas espero que ainda seja útil para alguém por aí: -
Aqui está um snippet simplificado para enviar uma string na memória como um anexo de e-mail (um arquivo CSV neste caso específico).
O StreamWriter e o fluxo subjacente não devem ser descartados até que a mensagem tenha sido enviada (para evitar
ObjectDisposedException: Cannot access a closed Stream
).fonte
stream.position = 0;
stream.Position=0
.Como não consegui encontrar a confirmação disso em lugar nenhum, testei se o descarte do MailMessage e / ou do objeto Attachment eliminaria o fluxo carregado neles como eu esperava que aconteceria.
Parece com o seguinte teste que, quando MailMessage é descartado, todos os fluxos usados para criar anexos também serão descartados. Portanto, contanto que você descarte sua MailMessage, os fluxos que foram usados para criá-la não precisam de tratamento além disso.
fonte
Se você realmente deseja adicionar um .pdf, achei necessário definir a posição do fluxo de memória para zero.
fonte
Se tudo o que você está fazendo é anexar uma string, você pode fazer isso em apenas 2 linhas:
Não consegui fazer o meu funcionar usando nosso servidor de e-mail com StreamWriter.
Acho que talvez porque com o StreamWriter você esteja perdendo muitas informações de propriedade do arquivo e talvez nosso servidor não tenha gostado do que estava faltando.
Com Attachment.CreateAttachmentFromString (), ele criou tudo que eu precisava e funciona muito bem!
Caso contrário, sugiro pegar o arquivo que está na memória e abri-lo usando MemoryStream (byte []) e pular o StreamWriter todos juntos.
fonte
I pousou sobre esta questão, porque eu precisava para anexar um arquivo do Excel eu gerar através de código e está disponível como
MemoryStream
. Eu poderia anexá-lo à mensagem de e-mail, mas ele foi enviado como um arquivo de 64 bytes em vez de aproximadamente 6 KB, como deveria. Então, a solução que funcionou para mim foi esta:Definir o valor de
attachment.ContentDisposition.Size
deixe-me enviar mensagens com o tamanho correto de anexo.fonte
use OUTRO fluxo de memória ABERTO:
exemplo para lançar pdf e enviar pdf em MVC4 C # Controller
fonte
stream.Position=0;
é a linha que me ajudou. sem ele, meu anexo era de apenas 504 bytes instaurado de alguns kBsAcho que este código vai te ajudar:
fonte