Categorías: buenas practicas sharepoint 2013

[SharePoint2013] Extendiendo capacidades a las utilidades «base» de SharePoint

Siempre he considerado que SharePoint es una gran herramienta para desarrollar y que hay muchas cosas que nos pueden valer para nuestros desarrollos, pero naturalmente como en todo en esta vida hay cosas que se pueden mejorar y son cosas que son pequeños detalles. Estos detalles que son los más pequeños son lo que hacen que se gane una mala reputación.
Por ejemplo una de estas cosas que más chocan vienen con esta librería SPUtility esta librería propia de SharePoint nos proporciona una serie de funciones/procedimientos que son muy validas para nuestros desarrollos a diarios pero algo que podía ser o considerarse brillante no es mas que algo que esta bien y en parte la tienen en casos como la siguiente función  SendMail.

Esta función como su nombre indica esta función envía mails en base a una serie de parámetros. Pero tiene varios inconvenients la primera y grande es que no permite enviar ficheros adjuntos y la segunda es que esta limitada el número de caracteres que podemos enviar en cada correo. Mi opinión es que esta función esta heredada desde el 2003 y nadie de Microsoft se ha sentado y ha pensado en como mejorarla y adaptarla a los circunstancias actuales.

Pero como por suerte o por desgracia (según con la persona que hables para mi suerte) SharePoint puede extender capacidades que hay en ASP.NET pues utilizando el servidor SMTP que hay en SharePoint podemos crearnos una función en la que implementemos un envió de mails pero que podamos hacer lo mismo que en cualquier servidor SMTP. El código no tiene mucho misterio y seria el siguiente :

 public static ResponseWCF SendMail(string sender, List<string> recipients, List<string> cc, string subject, string body, List<FileAtachmenet> atachment)            
        {
            ResponseWCF result = new ResponseWCF();

            if (recipients == null)
            {
                result.code = 2;
                return result;
            }
            if (cc == null) cc = new List<string>();
            if (atachment == null) atachment = new List<FileAtachmenet>();
            try
            {                                
                string smtpServer = SPAdministrationWebApplication.Local.OutboundMailServiceInstance.Server.Address;                
                string smtpFrom = string.IsNullOrEmpty(sender) ? SPAdministrationWebApplication.Local.OutboundMailSenderAddress : sender;
                MailAddressCollection toCollecion = new MailAddressCollection();
                foreach (string elemento in recipients)
                {
                    toCollecion.Add(new MailAddress(elemento));
                }
                MailAddressCollection ccColection = new MailAddressCollection();
                foreach (string elemento in cc)
                {
                    ccColection.Add(new MailAddress(elemento));
                }
                MailMessage mailMessage = new MailMessage(smtpFrom,toCollecion.ToString());
                if (cc.Count > 0)
                {
                    mailMessage.CC.Add(ccColection.ToString());
                }
                mailMessage.Subject = subject;
                mailMessage.Body = body;
                mailMessage.IsBodyHtml = true;

                    if (atachment.Count > 0)
                    {
                        foreach (FileAtachmenet elemento in atachment)
                        {
                            Stream stream = new MemoryStream(elemento.atachment);
                            Attachment atach = new Attachment(stream, elemento.name);
                            mailMessage.Attachments.Add(atach);
                        }
                    }                                                
                SmtpClient smtpClient = new SmtpClient(smtpServer);
                smtpClient.Send(mailMessage);
                result.code = 0;
            }
            catch (Exception ex)
            {
                log.Error(ex.ToString());
                result.code = 1;
                result.exception += ex.ToString();
            }
            return result;
        }

Lo que tiene de interesante es que este código lo podemos utilizar dentro de una de nuestras librerías propias y utilizarlo en todos los proyectos, con lo que estaríamos reutilizando una función muy interesante. Pero todavía le podemos dar un toque mucho mejor y ese no es otro es que todas las aplicaciones de nuestra empresa/organización utilicen esta función independiente de la tecnología con la que están implantado. A que mola? Pues para ello no haría falta nada más que crearnos un servicio WCF dentro de nuestro SharePoint en el que tuviéramos alojado esta funcionalidad y ya tendríamos algo centralizado, reutilizado y de calidad. Para que os hagais una idea esta servicio lo tenenmos en funcionamiento en un cliente con una arquitectura SOA con muchas aplicaciones JAVA y se utiliza SharePoint como Gestor documental y para elementos de colaboración, es decir SharePoint no es un solar y puede estar muy presente en cualquier organización.
Muchas veces buscamos soluciones más complicadas y más populares para dar soluciones a problemas que nosotros mismos nos buscamos. Hay que quitar el mito de que desarrollar en SharePoint va contra los desarrolladores y que no se pueden dar soluciones de calidad, escalabes y reutilizables para muestra este botón.

Compartir
Publicado por
Adrián Díaz

Este sitio web utiliza cookies para que tengas la mejor experiencia de usuario. Si continuas navegando, estás dando tu consentimiento para aceptar las cookies y también nuestra política de cookies (esperemos que no te empaches con tanta cookie 😊)