Beispiel #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="receiverList"></param>
        /// <param name="model"></param>
        /// <param name="pckSize"></param>
        public void SendMail(ICollection <ApplicationUser> receiverList, OccurrenceMailingModel model, int pckSize = 0)
        {
            var logger = LogManager.GetLogger("SendMail");

            logger.InfoFormat("Subject [{0}], Receiverlist has [{1}] entries", model.Subject, receiverList.Count);


            // Das Mail-Model aufbauen
            var mailModel = new GenericMailDeliveryModel
            {
                Subject         = model.Subject,
                Sender          = UserManager.FindByName(User.Identity.Name),
                TemplateContent = new UserMailModel
                {
                    CustomBody         = model.Body,
                    IsImportant        = model.IsImportant,
                    ListName           = model.ListName,
                    IsDistributionList = model.IsDistributionList
                }
            };

            var size  = 0;
            var count = 0;

            foreach (var attachment in model.Attachments)
            {
                if (attachment != null)
                {
                    size += attachment.ContentLength;
                    count++;

                    var bytes = new byte[attachment.ContentLength];
                    attachment.InputStream.Read(bytes, 0, attachment.ContentLength);

                    mailModel.Attachments.Add(new CustomMailAttachtmentModel
                    {
                        FileName = Path.GetFileName(attachment.FileName),
                        Bytes    = bytes,
                    });
                }
            }

            if (count > 0 && size > 0)
            {
                logger.InfoFormat("# Attachments [{0}], Size [{1:0.00}] MBytes", count, size / (double)(1024 * 1024));
            }


            // 1 Mail für jeden
            var deliveryModel = new MailDeliverSummaryReportModel();
            var errorCount    = 0;

            foreach (var user in receiverList)
            {
                // Mails werden nur versendet, wenn die Mail Adresse bestätigt ist
                if (!user.EmailConfirmed)
                {
                    // In den Bericht aufnehmen
                    errorCount++;
                    deliveryModel.Deliveries.Add(new MailDeliveryReportModel
                    {
                        User = user,
                        DeliverySuccessful = false,
                        ErrorMessage       = "Mailadresse nicht bestätigt. Grund: " + user.AccountErrorMessage
                    });
                }
                else
                {
                    // hier erst auf Like E-Mail überprüfen
                    // wenn die E-Mail unwichtig ist und der benutzer keine E-Mail erhalten möchte
                    // dann bekommt er auch keine - es wird aber im Versandprotokoll vermerkt
                    if (!model.IsImportant && !user.LikeEMails)
                    {
                        errorCount++;
                        deliveryModel.Deliveries.Add(new MailDeliveryReportModel
                        {
                            User = user,
                            DeliverySuccessful = false,
                            ErrorMessage       = "Benutzer möchte keine E-Mails erhalten"
                        });
                    }
                    else
                    {
                        mailModel.Receiver = user;

                        // Versand versuchen
                        try
                        {
                            new MailController().GenericMail(mailModel).Deliver();

                            deliveryModel.Deliveries.Add(new MailDeliveryReportModel
                            {
                                User = user,
                                DeliverySuccessful = true,
                            });
                        }
                        catch (Exception ex)
                        {
                            errorCount++;
                            var strError = string.Format("Fehler bei Versand. Grund: {0}. Mailadresse wird auf ungültig gesetzt.", ex.Message);

                            deliveryModel.Deliveries.Add(new MailDeliveryReportModel
                            {
                                User = user,
                                DeliverySuccessful = false,
                                ErrorMessage       = strError
                            });

                            /*
                             * user.EmailConfirmed = false;
                             * // Ein Expiry ist nicht sinnvoll / möglich, da E-Mail Adresse ja ohnehin nicht erreichbar
                             * user.Remark = strError;
                             * user.Submitted = DateTime.Now;
                             * UserManager.Update(user);
                             */
                        }
                    }
                }
            }

            // Kopie an Absender
            mailModel.Receiver = mailModel.Sender;

            // Versandbericht nur an Staff
            if (mailModel.Sender.MemberState == MemberState.Staff)
            {
                var ms     = new MemoryStream();
                var writer = new StreamWriter(ms, Encoding.Default);

                writer.Write(
                    "Name;Vorname;E-Mail;Versand;Bemerkung");

                writer.Write(Environment.NewLine);

                foreach (var delivery in deliveryModel.Deliveries)
                {
                    if (delivery.DeliverySuccessful)
                    {
                        writer.Write("{0};{1};;{2};",
                                     delivery.User.LastName, delivery.User.FirstName,
                                     delivery.DeliverySuccessful ? "OK" : "FEHLER");
                    }
                    else
                    {
                        writer.Write("{0};{1};{2};{3};{4}",
                                     delivery.User.LastName, delivery.User.FirstName, delivery.User.Email,
                                     delivery.DeliverySuccessful ? "OK" : "FEHLER",
                                     delivery.ErrorMessage);
                    }
                    writer.Write(Environment.NewLine);
                }

                writer.Flush();
                writer.Dispose();

                var sb = new StringBuilder();
                sb.Append("Versandbericht");
                sb.Append(".csv");

                mailModel.Attachments.Add(new CustomMailAttachtmentModel
                {
                    FileName = sb.ToString(),
                    Bytes    = ms.GetBuffer()
                });
            }

            try
            {
                new MailController().GenericMail(mailModel).Deliver();
            }
            catch (Exception ex)
            {
                logger.ErrorFormat("Mailsent failed: {0}", ex.Message);
            }


            logger.InfoFormat("Mail sent to {0} receivers, # errors [{1}]", receiverList.Count, errorCount);
        }
Beispiel #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="receiverList"></param>
        /// <param name="sender"></param>
        /// <param name="model"></param>
        public void SendMail(ICollection <ApplicationUser> receiverList, ApplicationUser sender, MailJobModel model)
        {
            var viewsPath = Path.GetFullPath(HostingEnvironment.MapPath(@"~/Views/Emails"));
            var engines   = new ViewEngineCollection();
            var engine    = new FileSystemRazorViewEngine(viewsPath);

            engines.Add(engine);
            var emailService = new Postal.EmailService(engines);


            // Das Mail-Model aufbauen
            var mailModel = new CustomBodyEmail()
            {
                From               = sender.Email,
                Subject            = model.Subject,
                Body               = model.Body,
                IsImportant        = model.IsImportant,
                IsDistributionList = model.IsDistributionList,
                ListName           = model.ListName
            };

            foreach (var attachment in model.Files)
            {
                MemoryStream ms = new MemoryStream(attachment.Bytes);

                var a = new System.Net.Mail.Attachment(ms, attachment.FileName);

                mailModel.Attachments.Add(a);
            }


            // 1 Mail für jeden
            var deliveryModel = new MailDeliverSummaryReportModel();
            var errorCount    = 0;

            foreach (var user in receiverList)
            {
                // Mails werden nur versendet, wenn die Mail Adresse bestätigt ist
                if (!user.EmailConfirmed)
                {
                    // In den Bericht aufnehmen
                    errorCount++;
                    deliveryModel.Deliveries.Add(new MailDeliveryReportModel
                    {
                        User = user,
                        DeliverySuccessful = false,
                        ErrorMessage       = "Mailadresse nicht bestätigt. Grund: " + user.AccountErrorMessage
                    });
                }
                else
                {
                    // hier erst auf Like E-Mail überprüfen
                    // wenn die E-Mail unwichtig ist und der benutzer keine E-Mail erhalten möchte
                    // dann bekommt er auch keine - es wird aber im Versandprotokoll vermerkt
                    if (!model.IsImportant && !user.LikeEMails)
                    {
                        errorCount++;
                        deliveryModel.Deliveries.Add(new MailDeliveryReportModel
                        {
                            User = user,
                            DeliverySuccessful = false,
                            ErrorMessage       = "Benutzer möchte keine E-Mails erhalten"
                        });
                    }
                    else
                    {
                        mailModel.To = user.Email;

                        // Versand versuchen
                        try
                        {
                            emailService.Send(mailModel);

                            deliveryModel.Deliveries.Add(new MailDeliveryReportModel
                            {
                                User = user,
                                DeliverySuccessful = true,
                            });
                        }
                        catch (Exception ex)
                        {
                            errorCount++;
                            var strError = string.Format("Fehler bei Versand. Grund: {0}. Mailadresse wird auf ungültig gesetzt.", ex.Message);

                            deliveryModel.Deliveries.Add(new MailDeliveryReportModel
                            {
                                User = user,
                                DeliverySuccessful = false,
                                ErrorMessage       = strError
                            });

                            /*
                             * user.EmailConfirmed = false;
                             * // Ein Expiry ist nicht sinnvoll / möglich, da E-Mail Adresse ja ohnehin nicht erreichbar
                             * user.Remark = strError;
                             * user.Submitted = DateTime.Now;
                             * UserManager.Update(user);
                             */
                        }
                    }
                }
            }

            // Kopie an Absender
            mailModel.To = sender.Email;

            // Versandbericht nur an Staff
            if (sender.MemberState == MemberState.Staff)
            {
                var ms     = new MemoryStream();
                var writer = new StreamWriter(ms, Encoding.Default);

                writer.Write(
                    "Name;Vorname;E-Mail;Versand;Bemerkung");

                writer.Write(Environment.NewLine);

                foreach (var delivery in deliveryModel.Deliveries)
                {
                    writer.Write("{0};{1};{2};{3};{4}",
                                 delivery.User.LastName, delivery.User.FirstName, delivery.User.Email,
                                 delivery.DeliverySuccessful ? "OK" : "FEHLER",
                                 delivery.ErrorMessage);
                    writer.Write(Environment.NewLine);
                }

                writer.Flush();
                writer.Dispose();

                var sb = new StringBuilder();
                sb.Append("Versandbericht");
                sb.Append(".csv");

                var bytes = ms.GetBuffer();
                var ms2   = new MemoryStream(bytes);

                var a = new System.Net.Mail.Attachment(ms2, sb.ToString());

                mailModel.Attachments.Add(a);
            }

            try
            {
                emailService.Send(mailModel);
            }
            finally { }
        }