Esempio n. 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public EmailResult GenericMail(GenericMailDeliveryModel model)
        {
            if (model.Sender != null && !string.IsNullOrEmpty(model.Sender.Email))
            {
                From = new MailAddress(model.Sender.Email,
                                       model.Sender.FirstName + " " + model.Sender.LastName + " (via NINE)").ToString();
            }

            To.Add(model.Receiver.Email);

            foreach (var attachment in model.Attachments)
            {
                Attachments.Add(attachment.FileName, attachment.Bytes);
            }

            Subject = model.Subject;

            if (string.IsNullOrEmpty(model.TemplateName))
            {
                // Kein Template gegeben => Komplett Custom
                return(Email("CustomTextMail2", model.TemplateContent));
            }

            // Es ist ein Template gegeben => das auch verwenden
            return(Email(model.TemplateName, model.TemplateContent));
        }
Esempio n. 2
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);
        }
Esempio n. 3
0
        public ActionResult SendInvitations(OccurrenceMailingModel model)
        {
            var host = AppUser;

            var invitationList = Session["InvitationList"] as InvitationCheckModel;

            var semSubService = new SemesterSubscriptionService();

            // Keine Liste
            // Vermutung, die Session ist abgelaufen
            if (invitationList == null)
            {
                return(View("SendInvitationsError"));
            }

            var attachmentList = new List <CustomMailAttachtmentModel>();

            foreach (var attachment in model.Attachments)
            {
                if (attachment != null)
                {
                    var bytes = new byte[attachment.ContentLength];
                    attachment.InputStream.Read(bytes, 0, attachment.ContentLength);

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



            foreach (var invitation in invitationList.Invitations.Where(i => i.Invite))
            {
                invitation.Invited = false;

                var now  = DateTime.Now;
                var user = new ApplicationUser
                {
                    UserName       = invitation.Email,
                    Email          = invitation.Email,
                    FirstName      = invitation.FirstName,
                    LastName       = invitation.LastName,
                    Registered     = now,
                    MemberState    = MemberState.Student,
                    Remark         = "Einladung von " + host.FullName,
                    ExpiryDate     = null,   // Einladung bleibt dauerhaft bestehen - Deprovisionierung automatisch
                    Submitted      = now,
                    EmailConfirmed = true,   // damit ist auch ein "ForgotPassword" möglich, auch wenn er die Einladung nicht angenommen hat.
                    IsApproved     = true,   // Damit bekommt der Nutzer von Anfang an E-Mails
                    Faculty        = host.Id // Benutzer der eingeladen hat
                };

                // Benutzer anlegen, mit Dummy Passwort


                //string pswd = Membership.GeneratePassword(10, 2);

                var result = UserManager.Create(user, "Pas1234?");
                if (result.Succeeded)
                {
                    // analog Forget E-Mail Versand
                    string code = UserManager.GeneratePasswordResetToken(user.Id);

                    var mailModel = new ForgotPasswordMailModel
                    {
                        User          = user,
                        Token         = code,
                        CustomSubject = model.Subject,
                        CustomBody    = model.Body,
                        Attachments   = attachmentList,
                        IsNewAccount  = true,
                    };


                    try
                    {
                        new MailController().InvitationMail(mailModel, host, model.TemplateLanguage).Deliver();

                        // Student anlegen
                        var student = Db.Students.FirstOrDefault(x => x.UserId.Equals(user.Id));

                        if (student == null)
                        {
                            var sem = SemesterService.GetSemester(invitation.Semester);

                            var org = Db.Organisers.SingleOrDefault(x =>
                                                                    x.ShortName.Equals(invitation.Organiser));

                            var curr = org.Curricula.SingleOrDefault(c => c.ShortName.Equals(invitation.Curriculum));


                            student = new Student
                            {
                                Created       = DateTime.Now,
                                Curriculum    = curr,
                                FirstSemester = sem,
                                UserId        = user.Id
                            };

                            Db.Students.Add(student);
                            Db.SaveChanges();
                        }

                        //semSubService.Subscribe(user.Id, invitation.SemGroup.Id);

                        invitation.Invited = true;
                    }
                    catch (SmtpFailedRecipientException ex)
                    {
                        invitation.Remark = ex.Message;
                    }
                }
                else
                {
                    foreach (var error in result.Errors)
                    {
                        invitation.Remark += error;
                    }
                }
            }


            var deliveryMailModel = new GenericMailDeliveryModel
            {
                Subject         = model.Subject,
                Receiver        = host,
                TemplateContent = new UserMailModel
                {
                    CustomBody = model.Body,
                }
            };


            // Mail an Einladenden versenden
            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 invitationList.Invitations)
            {
                writer.Write("{0};{1};{2};{3};{4}",
                             delivery.LastName, delivery.FirstName, delivery.Email,
                             (delivery.Invite && delivery.Invited) ? "OK" : "FEHLER",
                             delivery.Remark);
                writer.Write(Environment.NewLine);
            }

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

            var sb = new StringBuilder();

            sb.Append("Versandbericht");
            sb.Append(".csv");

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

            try
            {
                new MailController().GenericMail(deliveryMailModel).Deliver();
            }
            catch (Exception ex)
            {
                var logger = LogManager.GetLogger("SendMail");
                logger.ErrorFormat("Mailsent failed: {0}", ex.Message);
            }

            return(View("SendInvitationsSuccess", invitationList));
        }