lunes, 27 de agosto de 2012

MailMessage–Adjuntar Archivo sin bloquearlo (2/3)

 

Introducción


Cuando se necesita enviar un mail que adjunte un documento se suele proporcionando directamente la ruta directa al archivo, la librería smtp que proporciona .net realizara correctamente el attach pero lo mantendrá bloqueado, es por eso que una operación posterior que requiera eliminarlo generara un mensaje como ser

imagen1

 

Adjuntar Archivo sin bloquearlo


Para adjuntar un archivo sin bloquearlo la clave esta en asignar un stream al attach del mail y no directamente el archivos indicando su ruta física.

En este caso se crea un método que ayudara en esta tarea, tomando la ruta del archivo y devolviendo el Stream:

public Stream GetStreamFile(string filePath)
{
    using (FileStream fileStream = File.OpenRead(filePath))
    {
        MemoryStream memStream = new MemoryStream();
        memStream.SetLength(fileStream.Length);
        fileStream.Read(memStream.GetBuffer(), 0, (int)fileStream.Length);

        return memStream;
    }
}

Este método es usado en la línea:

mail.Attachments.Add(new Attachment(GetStreamFile(pdfpath), Path.GetFileName(pdfpath), "application/pdf"));

además de asignar el Stream del archivo se proporciona el nombre y el tipo que se adjunta.

El código completo del test usa la librería iTextSharp para crear un archivo pdf de prueba que será adjunto al mail y finalmente eliminado.

[TestMethod]
public void SendMailAttachFile()
{

    //
    // se genera el pdf que luego se adjuntara al mail
    //
    string pdfpath = Path.Combine(TestContext.TestDeploymentDir, "PDFMailAttach.pdf");

    Document document = new Document();
    PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(pdfpath, FileMode.Create));

    document.Open();
    document.Add(new Paragraph("Documento Adjunto sin Bloquear"));
    document.Close();



    //
    // se define la lista de destinatarios
    //
    List<string> destinatarios = new List<string>()
    {
        "xx@gmail.com",
        "xx@hotmail.com"
    };


    //
    // se crea el mensaje
    //
    string body = "";
   
    using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MailSendTest.MailBody.txt"))
    using (StreamReader reader = new StreamReader(stream))
    {
        body = reader.ReadToEnd();
    }

    MailMessage mail = new MailMessage()
    {
        Body = body,
        Subject = "Mail Test con adjunto",
        IsBodyHtml = false
    };

    //mail.Attachments.Add(new Attachment(pdfpath, "application/pdf"));
    mail.Attachments.Add(new Attachment(GetStreamFile(pdfpath), Path.GetFileName(pdfpath), "application/pdf"));

    //
    // se asignan los destinatarios
    //
    foreach (string item in destinatarios)
    {
        mail.To.Add(new MailAddress(item));
    }


    //
    // se define el smtp
    //
    SmtpClient smtp = new SmtpClient();
    smtp.Send(mail);


    //
    // se elimina el archivo porque no estara bloqueado
    //
    File.Delete(pdfpath);

    Assert.IsFalse(File.Exists(pdfpath));

}

Código


[c#]
 

4 comentarios: