コード例 #1
0
ファイル: MailingController.cs プロジェクト: sbrinkhorst/NINE
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public ActionResult HostByRoom()
        {
            var model = new OccurrenceMailingModel();

            return(View(model));
        }
コード例 #2
0
ファイル: MailingController.cs プロジェクト: sbrinkhorst/NINE
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public ActionResult AllMembers()
        {
            var model = new OccurrenceMailingModel();

            return(View(model));
        }
コード例 #3
0
ファイル: MailingController.cs プロジェクト: sbrinkhorst/NINE
        public ActionResult StudentGroup(OccurrenceMailingModel model)
        {
            var logger = LogManager.GetLogger("StudentGroup");

            var ids = model.GroupIdList.First().Split(',');


            //if (ModelState.IsValid)
            {
                var groupList = new List <SemesterGroup>();

                var userList = new List <ApplicationUser>();

                // nur noch alle, die in LVs der Gruppen eingetrangen sind
                var           studentService = new StudentService(Db);
                var           sb             = new StringBuilder();
                List <string> userIds        = new List <string>();
                foreach (var semGroupId in ids)
                {
                    var id    = Guid.Parse(semGroupId);
                    var group = Db.SemesterGroups.SingleOrDefault(x => x.Id == id);
                    groupList.Add(group);

                    var groupIds = studentService.GetStudents(group);
                    userIds.AddRange(groupIds);

                    logger.InfoFormat("Students in group {0}: {1}", group.FullName, groupIds.Count);
                }

                logger.InfoFormat("Total entries {0}", userIds.Count);
                var userIdsNoDuplicates = userIds.Distinct().ToList();
                logger.InfoFormat("Total entries after reduction {0}", userIdsNoDuplicates.Count);

                foreach (var userId in userIdsNoDuplicates)
                {
                    ApplicationUser user = UserManager.FindById(userId);
                    if (user != null)
                    {
                        userList.Add(user);
                    }
                }

                foreach (var group in groupList)
                {
                    sb.Append(group.FullName);
                    if (group != groupList.Last())
                    {
                        sb.Append(", ");
                    }
                }

                model.ListName           = sb.ToString();
                model.IsDistributionList = true;

                logger.InfoFormat("UserList with {0} entires", userList.Count);

                if (!User.IsInRole("SysAdmin"))
                {
                    SendMail(userList, model);
                }
                return(View("ReceiverList", userList));
            }

            /*
             * else
             * {
             *  if (!ModelState.IsValid)
             *  {
             *      ViewBag.ErrorMessage = "Fehler im Formular: " + ModelState.ToString();
             *  }
             *  return View("InvalidModel");
             * }
             */
        }
コード例 #4
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));
        }
コード例 #5
0
ファイル: MailingController.cs プロジェクト: weedkiller/NINE
        public ActionResult CurriculumModule(OccurrenceMailingModel model)
        {
            var logger = LogManager.GetLogger("StudentGroup");

            var sem    = Db.Semesters.SingleOrDefault(x => x.Id == model.SemId);
            var module = Db.CurriculumModules.SingleOrDefault(x => x.Id == model.ModuleId);


            var list = new List <ModuleParticipantModel>();

            foreach (var moduleCourse in module.ModuleCourses)
            {
                var courses =
                    moduleCourse.Nexus.Where(x => x.Course.SemesterGroups.Any(g => g.Semester.Id == sem.Id))
                    .Select(x => x.Course).Distinct().ToList();


                foreach (var course in courses)
                {
                    foreach (var subscription in course.Occurrence.Subscriptions)
                    {
                        var participant = list.SingleOrDefault(x => x.UserId.Equals(subscription.UserId));

                        if (participant == null)
                        {
                            participant = new ModuleParticipantModel
                            {
                                UserId = subscription.UserId
                            };
                            list.Add(participant);
                        }
                    }
                }
            }

            var userList = new List <ApplicationUser>();

            foreach (var student in list)
            {
                ApplicationUser user = UserManager.FindById(student.UserId);
                if (user != null)
                {
                    userList.Add(user);
                }
            }

            var sb = new StringBuilder();

            sb.AppendFormat("Modul {0} ({1})", module.Name, module.ShortName);

            model.ListName           = sb.ToString();
            model.IsImportant        = true;
            model.IsDistributionList = false;

            logger.InfoFormat("UserList with {0} entires", userList.Count);

            if (!User.IsInRole("SysAdmin"))
            {
                SendMail(userList, model);
            }
            return(View("ReceiverList", userList));
        }
コード例 #6
0
ファイル: MailingController.cs プロジェクト: weedkiller/NINE
        /// <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 UserMailModel
            {
                CustomSubject      = model.Subject,
                SenderUser         = UserManager.FindByName(User.Identity.Name),
                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.User = user;

                        // Versand versuchen
                        try
                        {
                            new MailController().GenericMessageMail(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.User = mailModel.SenderUser;

            // Versandbericht nur an Staff
            if (mailModel.SenderUser.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().GenericMessageMail(mailModel).Deliver();
            }
            catch (Exception ex)
            {
                logger.ErrorFormat("Mailsent failed: {0}", ex.Message);
            }


            logger.InfoFormat("Mail sent to {0} receivers, # errors [{1}]", receiverList.Count, errorCount);
        }
コード例 #7
0
ファイル: MailingController.cs プロジェクト: weedkiller/NINE
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public ActionResult Guests()
        {
            var model = new OccurrenceMailingModel();

            return(View(model));
        }
コード例 #8
0
ファイル: MailingController.cs プロジェクト: weedkiller/NINE
        public ActionResult AllStudents(OccurrenceMailingModel model)
        {
            var logger = LogManager.GetLogger("AllStudentsMail");


            if (ModelState.IsValid)
            {
                var semester = SemesterService.GetSemester(DateTime.Today);
                var org      = GetMyOrganisation();

                /*
                 * var backgroundMailModel = GetMailModel(model);
                 * backgroundMailModel.OrgId = org.Id;
                 * backgroundMailModel.SemesterId = semester.Id;
                 * backgroundMailModel.SenderId = UserManager.FindByName(User.Identity.Name).Id;
                 * backgroundMailModel.IsImportant = model.IsImportant;
                 * backgroundMailModel.ListName = "Alle Studierende";
                 * backgroundMailModel.IsDistributionList = true;
                 *
                 * BackgroundJob.Enqueue<MailService>(x => x.SendAll(backgroundMailModel));
                 */


                // Alle Studierenden in Studiengängen des Veranstalters
                ICollection <ApplicationUser> userList = new List <ApplicationUser>();

                // nur die aktiven
                var allStudents = Db.Students.Where(x => x.Curriculum.Organiser.Id == org.Id && x.LastSemester == null).ToList();
                // ggf. doppelt vorhandene rauswerfen
                var allUserIds = allStudents.Select(s => s.UserId).Distinct().ToList();


                // als Empfänger kommen nur existierende User in Frage
                foreach (var userId in allUserIds)
                {
                    ApplicationUser user = UserManager.FindById(userId);
                    if (user != null)
                    {
                        userList.Add(user);
                    }
                }


                model.ListName           = "Alle Studierende";
                model.IsDistributionList = true;

                logger.InfoFormat("Active Students [{0}] - UserIds [{1}] - Available Users [{2}]",
                                  allStudents, allUserIds.Count, userList.Count);

                // Der SysAdmin kann nicht versenden - es wird nur geloggt!
                if (!User.IsInRole("SysAdmin"))
                {
                    SendMail(userList, model);
                }

                //ICollection<ApplicationUser> userList = new List<ApplicationUser>();
                return(View("ReceiverList", userList));
            }
            else
            {
                return(View());
            }
        }