Beispiel #1
0
        public static void SendMail(IList <string> mailAdresses, IList <string> ccAddresses, Enumerables.MailAction action, ILogEmailRepository logEmailRepository, Reserva reserva, byte[] attachment = null)
        {
            ContactCenterDA.Repositories.CC.TH.ObraRepository obraRepository = new ContactCenterDA.Repositories.CC.TH.ObraRepository();
            string htmlBody      = "";
            string htmlImageBody = "";
            string subject       = "";

            try
            {
                var smtpClient = new SmtpClient();

                #region Get Config Variables
                String correo   = "";
                String password = "";
                if (Sesion.aplicacion.CorreoNotificacion.Equals(String.Empty))
                {
                    correo   = ConfigurationManager.AppSettings["mailAccount"];
                    password = ConfigurationManager.AppSettings["mailPassword"];
                }
                else
                {
                    correo   = Sesion.aplicacion.CorreoNotificacion;
                    password = Sesion.aplicacion.Contraseña;
                }
                var mailAccount  = correo;
                var mailPassword = password;

                var smtp            = ConfigurationManager.AppSettings["smtp"];
                var mailDisplayName = ConfigurationManager.AppSettings["mailDisplayName"];
                var port            = ConfigurationManager.AppSettings["port"];
                var sslEnabled      = Convert.ToBoolean(ConfigurationManager.AppSettings["sslEnabled"]);
                var domain          = ConfigurationManager.AppSettings["Domain"];

                #endregion

                #region Create SMTP
                smtpClient.Host = smtp;
                smtpClient.Port = Convert.ToInt16(port);
                smtpClient.UseDefaultCredentials = false;
                smtpClient.DeliveryMethod        = SmtpDeliveryMethod.Network;
                if (domain != null)
                {
                    smtpClient.Credentials = new NetworkCredential(mailAccount, mailPassword, domain);
                }
                else
                {
                    smtpClient.Credentials = new NetworkCredential(mailAccount, mailPassword);
                }
                smtpClient.EnableSsl = sslEnabled;
                #endregion Create SMTP

                #region Create Mail an recievers
                var mail = new MailMessage();
                mail.From = new MailAddress(mailAccount, mailDisplayName);
                foreach (var mailDirection in mailAdresses.Where(x => !string.IsNullOrEmpty(x)))
                {
                    mail.To.Add(new MailAddress(mailDirection.ToLower()));
                }
                foreach (var mailCC in ccAddresses.Where(x => !string.IsNullOrEmpty(x)))
                {
                    mail.CC.Add(new MailAddress(mailCC.ToLower()));
                }

                #endregion

                #region Create Mail Variables

                //System.Globalization.CultureInfo cultureinfo = new System.Globalization.CultureInfo("es-PE");
                var nombre     = reserva.Cliente.Nombre + " " + reserva.Cliente.ApellidoPaterno + " " + reserva.Cliente.Apellidomaterno;
                var obra       = reserva.Obra.Nombre;
                var fecha      = reserva.FechaReserva.ToString("dd/MM/yyyy" /*, cultureinfo*/);
                var teatro     = reserva.Obra.Teatro.Nombre;
                var hora       = reserva.Horario;
                var totalObras = reserva.ListaDetalles.Count();
                var ubicacion  = reserva.Asientos;
                var precio     = reserva.PrecioTotal;


                #endregion Create Mail Variables

                #region Set Mail Variable Values


                #endregion Set Mail Variable Values

                #region Set Mail Body

                switch (action)
                {
                case Enumerables.MailAction.TeatroConfirmacionReserva:
                    htmlBody = ContactCenterBL.Properties.Resources.nuevomail;
                    htmlBody = htmlBody.Replace("%Nombre", nombre);
                    htmlBody = htmlBody.Replace("%Obra", obra);
                    htmlBody = htmlBody.Replace("%Fecha", fecha);
                    htmlBody = htmlBody.Replace("%Teatro", teatro);
                    htmlBody = htmlBody.Replace("%Hora", fecha + " - " + hora);
                    htmlBody = htmlBody.Replace("%Total", totalObras.ToString());
                    htmlBody = htmlBody.Replace("%Ubicacion", ubicacion);
                    htmlBody = htmlBody.Replace("%Precio", precio.ToString("#.00"));

                    htmlImageBody = ContactCenterBL.Properties.Resources.detail;
                    htmlImageBody = htmlImageBody.Replace("%Nombre", nombre);
                    htmlImageBody = htmlImageBody.Replace("%Obra", obra);
                    htmlImageBody = htmlImageBody.Replace("%Fecha", fecha);
                    htmlImageBody = htmlImageBody.Replace("%Teatro", teatro);
                    htmlImageBody = htmlImageBody.Replace("%Hora", fecha + " - " + hora);
                    htmlImageBody = htmlImageBody.Replace("%Total", totalObras.ToString());
                    htmlImageBody = htmlImageBody.Replace("%Ubicacion", ubicacion);
                    htmlImageBody = htmlImageBody.Replace("%Precio", precio.ToString("#.00"));

                    List <String> zonas = new List <String>();
                    foreach (DetalleReserva detalleRes in reserva.ListaDetalles.OrderBy(tx => tx.NombreZona).ToList())
                    {
                        if (!zonas.Contains(detalleRes.NombreZona))
                        {
                            zonas.Add(detalleRes.NombreZona);
                        }
                    }

                    string detalle    = "";
                    string filAsiento = "";
                    int    contador   = 0;
                    foreach (String nomZona in zonas)
                    {
                        foreach (DetalleReserva detalleRes2 in reserva.ListaDetalles.Where(tx => tx.NombreZona == nomZona))
                        {
                            filAsiento += detalleRes2.NombreFila + " / " + detalleRes2.NombreAsiento + ", ";
                        }
                        filAsiento = filAsiento.TrimEnd(',', ' ');
                        //detalle += "<tr><td style= 'text-align:right;'>Sector</td><td>:</td><td></td><td></td><td style= 'text-align:left;'>" + nomZona + "</td></tr><tr><td style= 'text-align:right;' >Ubicaciones</td><td>:</td><td></td><td></td><td style= 'text-align:left;'>" + filAsiento + "</td></tr>";
                        detalle   += $"<p style='margin-top:3%; margin-bottom: 2%'>ZONA: {nomZona}</p> <p style='margin-top:3%; margin-bottom: 2%'> UBICACIÓN: {filAsiento}</p>";
                        filAsiento = "";
                    }

                    htmlBody      = htmlBody.Replace("varDetalle", detalle);
                    htmlImageBody = htmlImageBody.Replace("varDetalle", detalle);
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(action), action, null);
                }

                #endregion Set Mail Body

                #region Set Mail Subject

                switch (action)
                {
                case Enumerables.MailAction.TeatroConfirmacionReserva:
                    subject = Constantes.Subjects.TeatroConfirmacionReserva;
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(action), action, null);
                }

                #endregion Set Mail Subject

                #region Get Mail Body embedded images paths


                Byte[]       ba = obraRepository.GetImage(reserva.Obra.IdObra);
                MemoryStream ms = new MemoryStream(ba);
                //var cabeceraImgPath = Path.Combine("../../Resources/cabecera_correo2.jpg");
                //var rootFolder = AppDomain.CurrentDomain.BaseDirectory;
                //var cabepath = Path.Combine(rootFolder, "../../Resources/cabecera_correo2.jpg");
                Image        ImageCabe     = ContactCenterBL.Properties.Resources.cabecera;
                Byte[]       imageCabeByte = Convertir_Imagen_Bytes(ImageCabe);
                MemoryStream ca            = new MemoryStream(imageCabeByte);


                Image image = Image.FromStream(ca);
                Guid  id    = Guid.NewGuid();
                image.Save($"C:\\BackupTeatro\\{id.ToString()}.jpg");
                string path = $"C:\\BackupTeatro\\{id.ToString()}.jpg";


                Image image2 = Image.FromStream(ms);
                Guid  id2    = Guid.NewGuid();
                image2.Save($"C:\\BackupTeatro\\{id2.ToString()}.jpg");
                string path2 = $"C:\\BackupTeatro\\{id2.ToString()}.jpg";

                htmlBody = htmlBody.Replace("%Cabecera", path);
                htmlBody = htmlBody.Replace("%ImagenObra", path2);

                htmlImageBody = htmlImageBody.Replace("%Cabecera", path);
                htmlImageBody = htmlImageBody.Replace("%ImagenObra", path2);


                Image imageMail = TheArtOfDev.HtmlRenderer.WinForms.HtmlRender.RenderToImageGdiPlus(htmlImageBody);
                //imageMail.Save($"C:\\BackupTeatro\\test2.jpg");
                //Image imagex = Image.FromFile($"C:\\BackupTeatro\\test2.jpg");
                Byte[]       imageMailBytes        = Convertir_Imagen_Bytes(imageMail);
                MemoryStream imageMailMemoryStream = new MemoryStream(imageMailBytes);
                //mail.Attachments.Add(new Attachment(imageMailMemoryStream, "Compra.jpg"));



                var imageMailLinked = new LinkedResource(imageMailMemoryStream, MediaTypeNames.Image.Jpeg);
                imageMailLinked.ContentId = "obraimagen";

                Byte[]       pdfFile   = PdfSharpConvert(htmlBody);
                MemoryStream pdfStream = new MemoryStream(pdfFile);
                mail.Attachments.Add(new Attachment(pdfStream, "Confirmación de compra.pdf"));

                if (File.Exists(path2))
                {
                    File.Delete(path2);
                }
                if (File.Exists(path))
                {
                    File.Delete(path);
                }

                htmlBody      = htmlBody.Replace($"C:\\BackupTeatro\\{id.ToString()}.jpg", "%Cabecera");
                htmlBody      = htmlBody.Replace($"C:\\BackupTeatro\\{id2.ToString()}.jpg", "%ImagenObra");
                htmlImageBody = htmlImageBody.Replace($"C:\\BackupTeatro\\{id.ToString()}.jpg", "%Cabecera");
                htmlImageBody = htmlImageBody.Replace($"C:\\BackupTeatro\\{id2.ToString()}.jpg", "%ImagenObra");

                #endregion Get Mail Body embedded images paths

                #region Set embedded images mail id

                //var cabecera = new LinkedResource(ca, MediaTypeNames.Image.Jpeg);
                //cabecera.ContentId = "Cabecera";
                ////cabecera.TransferEncoding = TransferEncoding.Base64;

                //var logo = new LinkedResource(ms, MediaTypeNames.Image.Jpeg);
                //logo.ContentId = "ImagenObra";
                ////logo.TransferEncoding = TransferEncoding.Base64;

                #endregion

                #region Set Body and Images

                var newHtml = ContactCenterBL.Properties.Resources._base;

                var html = AlternateView.CreateAlternateViewFromString(newHtml, null, MediaTypeNames.Text.Html);
                //html.TransferEncoding = TransferEncoding.Base64;
                html.LinkedResources.Add(imageMailLinked);
                //html.LinkedResources.Add(cabecera);

                #endregion Set Body and Images

                #region Set values to mail

                mail.Subject         = subject;
                mail.SubjectEncoding = Encoding.UTF8;
                mail.IsBodyHtml      = true;
                mail.AlternateViews.Add(html);

                #endregion Set values to mail



                #region Send Mail

                smtpClient.SendAsync(mail, null);

                smtpClient.SendCompleted += (s, e) =>
                {
                    LogEmail logEmail = new LogEmail();
                    logEmail.Asunto          = subject;
                    logEmail.CorreoDestino   = string.Join(",", mailAdresses.Select(x => x.ToString()).ToArray());
                    logEmail.CorreoDestinoCC = string.Join(",", ccAddresses.Select(x => x.ToString()).ToArray());
                    logEmail.Estado          = "OK";
                    logEmail.IdObra          = reserva.Obra.IdObra;
                    logEmail.FechaEnvio      = DateTime.Now;
                    logEmail.MensajeImagen   = htmlImageBody;
                    logEmail.FechaCreacion   = DateTime.Now;
                    logEmail.UsuarioCreacion = Sesion.usuario.Login;
                    logEmail.Mensaje         = htmlBody;
                    logEmail.Intento         = 1;
                    logEmail.Descripcion     = String.Empty;
                    if (e.Error != null)
                    {
                        logEmail.Estado = "FALLO";
                        if (e.Error.InnerException != null)
                        {
                            logEmail.Descripcion = e.Error.InnerException.Message;
                        }
                        else
                        {
                            logEmail.Descripcion = e.Error.Message;
                        }
                    }

                    logEmailRepository.Insert(logEmail);
                    if (e.Error != null)
                    {
                        MessageBox.Show("No se envió el correo\n\n" +
                                        "Cliente: \n" + nombre + "\n" +
                                        "Obra: \n" + obra + "\n" +
                                        "Fecha Reserva: \n" + reserva.FechaReserva.ToShortDateString() + "\n" +
                                        "Correo: \n" + reserva.Cliente.Correo + "\n\n" +
                                        "Error: \n" + e.Error.Message, "Error enviando email", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    smtpClient.Dispose();
                    mail.Dispose();
                    //logo.Dispose();
                };

                #endregion Send Mail
            }
            catch (Exception ex)
            {
                LogEmail logEmail = new LogEmail();
                logEmail.Asunto          = subject;
                logEmail.CorreoDestino   = string.Join(",", mailAdresses.Select(x => x.ToString()).ToArray());
                logEmail.CorreoDestinoCC = string.Join(",", ccAddresses.Select(x => x.ToString()).ToArray());
                logEmail.Estado          = "OK";
                logEmail.IdObra          = reserva.Obra.IdObra;
                logEmail.FechaEnvio      = DateTime.Now;
                logEmail.MensajeImagen   = htmlImageBody;
                logEmail.FechaCreacion   = DateTime.Now;
                logEmail.UsuarioCreacion = Sesion.usuario.Login;
                logEmail.Mensaje         = htmlBody;
                logEmail.Intento         = 1;
                logEmail.Estado          = "FALLO";
                logEmail.Descripcion     = ex.Message;

                logEmailRepository.Insert(logEmail);

                MessageBox.Show("No se envió el correo\n\n" +
                                "Cliente: \n" + reserva.Cliente.Nombre + " " + reserva.Cliente.ApellidoPaterno + " " + reserva.Cliente.Apellidomaterno + "\n" +
                                "Obra: \n" + reserva.Obra.Nombre + "\n" +
                                "Fecha Reserva: \n" + reserva.FechaReserva.ToShortDateString() + "\n" +
                                "Correo: \n" + reserva.Cliente.Correo + "\n\n" +
                                "Error: \n" + ex.Message, "Error enviando email", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
 public void SendMail(IList <string> mailAdresses, IList <string> ccAddresses, Enumerables.MailAction action, Reserva reserva, byte[] attachment = null)
 {
     MailHelper.SendMail(mailAdresses, ccAddresses, action, logEmailRepository, reserva, attachment);
 }