Estoy escribiendo un programa para adjuntar un archivo al correo electrónico. Actualmente estoy guardando el archivo usando FileStream
en el disco, y luego uso
System.Net.Mail.MailMessage.Attachments.Add(
new System.Net.Mail.Attachment("file name"));
No quiero almacenar el archivo en el disco, quiero almacenar el archivo en la memoria y desde el flujo de memoria pasar esto a Attachment
.
c#
email
smtp
memorystream
Zain Ali
fuente
fuente
System.Net.Mime.MediaTypeNames.Application.Pdf
writer.Disopose()
era demasiado pronto para mi solución, pero todo lo demás es un gran ejemplo.ms.Position = 0;
antes de crear el archivo adjunto.Una entrada un poco tardía, pero con suerte todavía será útil para alguien:
Aquí hay un fragmento simplificado para enviar una cadena en memoria como un archivo adjunto de correo electrónico (un archivo CSV en este caso particular).
El StreamWriter y el flujo subyacente no deben eliminarse hasta que se haya enviado el mensaje (para evitarlo
ObjectDisposedException: Cannot access a closed Stream
).fuente
stream.position = 0;
stream.Position=0
.Como no pude encontrar la confirmación de esto en ninguna parte, probé si deshacerse del MailMessage y / o el objeto Attachment eliminaría la secuencia cargada en ellos como esperaba.
Parece con la siguiente prueba que cuando se elimina el mensaje de correo, también se eliminarán todas las secuencias utilizadas para crear archivos adjuntos. Por lo tanto, siempre que elimine su MailMessage, las secuencias que se utilizaron para crearlo no necesitan un manejo más allá de eso.
fuente
Si realmente desea agregar un .pdf, me pareció necesario establecer la posición del flujo de memoria en cero.
fuente
Si todo lo que está haciendo es adjuntar una cuerda, puede hacerlo en solo 2 líneas:
No pude hacer que el mío funcionara usando nuestro servidor de correo con StreamWriter.
Creo que tal vez porque con StreamWriter te falta mucha información de propiedad de archivos y tal vez a nuestro servidor no le gustó lo que faltaba.
Con Attachment.CreateAttachmentFromString () creó todo lo que necesitaba y funciona muy bien.
De lo contrario, sugiero tomar su archivo que está en la memoria y abrirlo usando MemoryStream (byte []), y omitir el StreamWriter todos juntos.
fuente
Llegué a esta pregunta porque necesitaba adjuntar un archivo de Excel que genero a través del código y está disponible como
MemoryStream
. Podría adjuntarlo al mensaje de correo, pero se envió como un archivo de 64 bytes en lugar de un ~ 6 KB como estaba previsto. Entonces, la solución que funcionó para mí fue esta:Establecer el valor de
attachment.ContentDisposition.Size
Permítame enviar mensajes con el tamaño correcto de archivo adjunto.fuente
utilizar OTRO flujo de memoria ABIERTO:
ejemplo para lauch pdf y enviar pdf en MVC4 C # Controller
fuente
stream.Position=0;
es la línea que me ayudó. sin él, mi attcahment tenía solo 504 bytes instalados de algunos kBsCreo que este código te ayudará:
fuente