Posteado por: toniogago | 16 noviembre 2009

Adjuntar archivo en eMail con ASP.NET


En un post anterior expliqué cómo enviar un correo con WebDav y Exchange Server (ver) y en otro expliqué cómo renderizar directamente el contendio de un informe en PDF (ver).
Ahora voy a explicar cómo aduntar ese PDF al correo electrónico.

Cuando empecé a buscar información sobre cómo adjuntar un archivo a un correo electrónico encontré enseguida la solución y es muy simple. Básicamente se trata de separar el correo en partes delimitadas por una frontera (boundary) y especificar que el contenido está compuesto por partes (multipart).

'El Boundary o Frontera que delimita las partes de mensaje
'debe ser una cadena única.
Dim strBoundary as String = "MiBoundaryXXYYZZ"

Modificamos la cabecebera con el siguiente texto:

strEMAIL &= "Content-Type: multipart/mixed; " & vbNewLine
strEMAIL &= " boundary=""" & strBoundary & """" & vbNewLine
strEMAIL &= "Content-Disposition: inline;" & vbNewLine & vbNewLine

La primera parte del mensaje será el texto:

strEMAIL &= "--" & strBoundary & vbNewLine
strEMAIL &= "Content-type: text/html; charset=utf-8" & vbNewLine & vbNewLine
strEMAIL &= strText & vbNewLine

La segunda parte del mensaje será el archivo adjunto:

strEMAIL &= "--" & strBoundary & vbNewLine
strEMAIL &= "Content-Type: application/pdf; name=""archivo.pdf""" & vbNewLine
strEMAIL &= "Content-Transfer-Encoding: base64" & vbNewLine
strEMAIL &= "Content-Disposition: attachment; filename=""archivo.pdf""" & vbNewLine & vbNewLine

Para insertar el archivo echaremos mano de las peticiones web con HttpWebRequest.

Dim PDFRequest As System.Net.HttpWebRequest
Dim PDFResponse As System.Net.HttpWebResponse
Dim CadenaPDF as String
'La página en la que renderizamos el PDF es aammPDF.aspx
CadenaPDF = "http://localhost/adelantomateriales/aammPDF.aspx"
MyCredentialCache.Add(New System.Uri(CadenaPDF), _
"NTLM", _
New System.Net.NetworkCredential(strAlias, strPassword, strDomain) _
)
PDFRequest = CType(System.Net.WebRequest.Create(CadenaPDF), _
System.Net.HttpWebRequest)
PDFRequest.Method = "POST"
PDFRequest.ContentType = "application/x-www-form-urlencoded"
PDFRequest.Credentials = MyCredentialCache
PDFResponse = CType(PDFRequest.GetResponse(), System.Net.HttpWebResponse)
Dim StreamPDF As New StreamReader(CType(PDFResponse.GetResponseStream, System.IO.Stream))
Dim br As IO.BinaryReader = New IO.BinaryReader(PDFResponse.GetResponseStream)
Dim docPDF As Byte() = br.ReadBytes(PDFResponse.ContentLength)
strEMAIL &= Convert.ToBase64String(docPDF).ToString & vbNewLine
'Terminamos el mensaje con un doble guión al final del Boundary
strEMAIL &= "--" & strBoundary & "--"

El usuario recibirá el correo con el PDF adjunto.

Un saludo.

Anuncios

Responses

  1. He buscado por toda la red una respuesta para adjuntar archivos pdf, finalmente he llegado a tu blog y me he encontrado con el codigo indicado ya tenia algo resuelto pero no podia adjuntar el archivo finalmente he conseguido adjuntar el archivo pero al llegar a la bandeja de entrada el archivo llega dañado y no lo puedo abrir, alguna sugerencia te dejo mi codigo.
    Saludos.
    Dim myCredentialCache As Net.CredentialCache = New Net.CredentialCache()
    Dim xmlReq As MSXML2.XMLHTTP30 = New MSXML2.XMLHTTP30()
    Dim strSenderAlias As String = “Cuenta@mail.com”
    Dim strFrom As String = “Cuenta@mail.comm”
    Dim strTo As String = “Cuenta@mail.comm”
    Dim strSubject As String = “Cuenta ”
    Dim strBody As String = “”
    Dim sUri As String
    Dim strBoundary As String = “MiBoundaryXXYYZZ”
    Dim adjunto As String = “C:\reporte.pdf”
    sUri = “http://&&&&&/Exchange/” & strSenderAlias & “/##DavMailSubmissionURI##”
    xmlReq.open(“PUT”, sUri, False, “username”, “Password”)
    Dim mySentTime As DateTime = New DateTime()
    Dim strReq As String

    strReq = “From: ” & strFrom & vbNewLine & “To: ” & strTo & vbNewLine & “Subject: ” & strSubject & vbNewLine & “Date: ” & DateTime.Today.Now & vbNewLine & “X-Mailer: My DAV mailer” & vbNewLine & “MIME-Version: 1.0” & vbNewLine & “–” & strBoundary & vbNewLine & “Content-Type: application/pdf; filename=””inven.pdf””” & vbNewLine & “Content-Transfer-Encoding: base64” & vbNewLine & “Content-Disposition: attachment; filename=””inven.pdf””” & vbNewLine & vbNewLine & vbNewLine & “Charset = “”iso-8859-1″”” & vbNewLine & “Content-Transfer-Encoding: 7bit” ‘& vbNewLine & vbNewLine & vbNewLine & strBody

    Dim PDFRequest As System.Net.HttpWebRequest
    Dim PDFResponse As System.Net.HttpWebResponse
    Dim CadenaPDF As String
    ‘La página en la que renderizamos el PDF es aammPDF.aspx
    CadenaPDF = “http://localhost/web/default.aspx”
    myCredentialCache.Add(New System.Uri(CadenaPDF), “NTLM”, New System.Net.NetworkCredential(“Anonimo”, “password”, “localhost”))
    PDFRequest = CType(System.Net.WebRequest.Create(CadenaPDF), _
    System.Net.HttpWebRequest)
    PDFRequest.Method = “POST”
    PDFRequest.ContentType = “application/x-www-form-urlencoded”
    PDFRequest.Credentials = myCredentialCache

    PDFResponse = CType(PDFRequest.GetResponse(), System.Net.HttpWebResponse)
    Dim StreamPDF As New StreamReader(CType(PDFResponse.GetResponseStream, System.IO.Stream))
    Dim br As IO.BinaryReader = New IO.BinaryReader(PDFResponse.GetResponseStream)
    Dim docPDF As Byte() = br.ReadBytes(PDFResponse.ContentLength)
    strReq &= Convert.ToBase64String(docPDF).ToString & vbNewLine
    ‘Terminamos el mensaje con un doble guión al final del Boundary
    strReq &= “–” & strBoundary & “–”

    xmlReq.setRequestHeader(“Translate”, “f”)
    xmlReq.setRequestHeader(“Content-Type”, “message/rfc822”)
    xmlReq.setRequestHeader(“Content-Length”, “” & strReq.Length)

    xmlReq.send(strReq)
    Console.WriteLine(xmlReq.status)
    If (xmlReq.status = “201”) Then
    MsgBox(“Error”)
    Else
    MsgBox(“Correcto”)
    End If
    Console.WriteLine(xmlReq.statusText)
    Console.WriteLine(xmlReq.responseText)
    xmlReq = Nothing
    Catch ex As Exception

    End Try

    • Hola,
      seguramente haya algún fallo en la composición del mensaje.
      Comprueba el doble guión final del mensaje.

      A mí me había pasado algo similar. El fallo lo tenía en la generación del PDF. El PDF Request lo utilizamos para llamar a una página que nos va a devolver un archivo PDF. Prueba a llamar a dicha página a ver si te devuelve un archivo PDF y lo puedes abrir. Por lo que veo en tu código estás llamando a default.aspx.

      El código lo hice basándome en un post anterior en el que una página me devolvía un informe de Reporting Services directamente en formato PDF.


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: