/// <summary> /// /// </summary> /// <returns></returns> public ActionResult HostByRoom() { var model = new OccurrenceMailingModel(); return(View(model)); }
/// <summary> /// /// </summary> /// <returns></returns> public ActionResult AllMembers() { var model = new OccurrenceMailingModel(); return(View(model)); }
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"); * } */ }
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)); }
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)); }
/// <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); }
/// <summary> /// /// </summary> /// <returns></returns> public ActionResult Guests() { var model = new OccurrenceMailingModel(); return(View(model)); }
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()); } }