Arquitectura, buenas prácticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016

[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.

mm

Sobre Adrián Díaz

Adrián Díaz es Ingeniero Informático por la Universidad Politécnica de Valencia. Es MVP de Microsoft en la categoría Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnologías Microsoft más de 10 años y desde hace 3 años está centrado en el desarrollo sobre SharePoint. Actualmente es Software & Cloud Architect Lead en ENCAMINA.
Esta entrada ha sido publicada en buenas practicas, sharepoint 2013 y etiquetada como , , , . Enlace permanente .
Suscríbete a Desarrollando sobre SharePoint

Suscríbete a Desarrollando sobre SharePoint

Recibe todas las actualizaciones semanalmente de nuestro blog

You have Successfully Subscribed!

ENCAMINA, piensa en colores