Como enviar archivos adjuntos de Infopath 2010 como adjuntos de correo electrónico.

El reto de hoy es generar el código necesario para poder enviar un documento adjunto de un formulario de Infopath 2010 como un adjunto de un correo electrónico. Como base es necesario tener al menos un control de tipo adjunto y un botón en el formulario. En el botón es necesario ingresar el siguiente código:


- Importante incluir las siguientes referencias:


using System.IO;
using System.Net.Mail;
using System.Text;


- Algunas variables y constantes necesarias para el proceso:


private const int SP1Header_Size = 20;
private const int FIXED_HEADER = 16;
private int fileSize;
private int attachmentNameLength;
private string attachmentName;
private byte[] decodedAttachment;


- Dos funciones principales que cumplen la función de decodificadores del archivo adjunto:


public void InfoPathAttachmentDecoder(string theBase64EncodedString)
  {
   byte [] theData = Convert.FromBase64String(theBase64EncodedString);
   using(MemoryStream ms = new MemoryStream(theData))
   {
    BinaryReader theReader = new BinaryReader(ms);   
    DecodeAttachment(theReader);
   }
  }


  private void DecodeAttachment(BinaryReader theReader)
  {
   //Position the reader to obtain the file size.
   byte[] headerData = new byte[FIXED_HEADER];
   headerData = theReader.ReadBytes(headerData.Length);


   fileSize = (int)theReader.ReadUInt32();
   attachmentNameLength = (int)theReader.ReadUInt32() * 2;
   
   byte[] fileNameBytes = theReader.ReadBytes(attachmentNameLength);
   //InfoPath uses UTF8 encoding.
   Encoding enc = Encoding.Unicode;
   attachmentName = enc.GetString(fileNameBytes, 0, attachmentNameLength – 2);
   decodedAttachment = theReader.ReadBytes(fileSize);
  }


- Y finalmente la llamada a los procedimientos en el botón del formularios, este código aplica cuando es un solo campo de documento adjunto:


 XPathNavigator Adjunto = this.MainDataSource.CreateNavigator().SelectSingleNode(“/my:misCampos/my:Adjuntos/my:Documento”, this.NamespaceManager);
String textoAdjunto = Adjunto.Value;
if (textoAdjunto.Length > 0)
{
                InfoPathAttachmentDecoder(textoAdjunto);
                MemoryStream streamAdjunto = new MemoryStream(decodedAttachment);
                Attachment adjuntoCorreo = new Attachment(streamAdjunto, attachmentName);
                MailMessage mail = new MailMessage();
                SmtpClient SMTPServer = new SmtpClient(“servidor_correo”);
                mail.From = new MailAddress(“remitente@midominio.com“);
                mail.To.Add(“destinatario@otrodominio.com“);
                mail.Subject = “Adjunto desde Infopath”;
                mail.Body = “prueba”;
                mail.Attachments.Add(adjuntoCorreo);
                SMTPServer.Send(mail);
}


- Este código aplica cuando es una tabla de repetición:


XPathNavigator root = MainDataSource.CreateNavigator();
XPathNodeIterator RepTable = root.Select(“/my:misCampos/my:Adjuntos”, NamespaceManager);
MailMessage mail = new MailMessage();
SmtpClient SMTPServer = new SmtpClient(“servidor_correo”);
mail.From = new MailAddress(“remitente@midominio.com“);
mail.To.Add(“destinatario@otrodominio.com“);
mail.Subject = “Adjuntos desde infopath”;
mail.Body = “prueba”;
while (RepTable.MoveNext())
{
                XPathNavigator Adjunto = RepTable.Current.SelectSingleNode(“my:Documento”, NamespaceManager);
                String textoAdjunto = Adjunto.Value;               
                if (textoAdjunto.Length > 0)
                {
                    InfoPathAttachmentDecoder(textoAdjunto);
                    MemoryStream streamAdjunto = new MemoryStream(decodedAttachment);
                    Attachment adjuntoCorreo = new Attachment(streamAdjunto, attachmentName);
                    mail.Attachments.Add(adjuntoCorreo);                   
                }
}
SMTPServer.Send(mail);


Algunos enlaces de referencia:


- http://support.microsoft.com/kb/2517906


- http://support.microsoft.com/kb/892730


- http://www.csharp411.com/c-convert-string-to-stream-and-stream-to-string/


- http://social.msdn.microsoft.com/Forums/en-US/sharepointinfopath/thread/87e79f00-0277-4dbe-9092-c9e9bafe23a0/

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>