public void TestCreateIcal() { using (var db = new MedSimDbContext()) { var bm = GetTestAllRolesPrincipal(); var course = db.Courses.Find(Guid.Parse("0ca5d24f-292e-4004-bb08-096db4b440ad")); using (var appt = new AppointmentStream()) { using (var cal = Appointment.CreateCourseAppointment(course, bm.Identity)) { appt.Add(cal); using (var fileStream = File.Create(AppDomain.CurrentDomain.BaseDirectory + "calendar.ics")) { appt.GetStreams().First().CopyTo(fileStream); } } using (var cal = Appointment.CreateFacultyCalendar(course)) { appt.Replace(cal); using (var fileStream = File.Create(AppDomain.CurrentDomain.BaseDirectory + "calendar2Appt.ics")) { appt.GetStreams().First().CopyTo(fileStream); } } } } }
/// <summary> /// /// </summary> /// <param name="course"></param> /// <param name="user"></param> /// <returns>a lookup true = successfully emailed, false = email failed</returns> public static async Task<ILookup<bool, CourseParticipant>> SendEmail(Course course, IPrincipal user) { using (var cal = Appointment.CreateCourseAppointment(course, user.Identity)) { using (var appt = new AppointmentStream(cal)) { var map = ((Expression<Func<CourseParticipant, CourseParticipantDto>>)new CourseParticipantMaps().MapToDto).Compile(); var faculty = course.CourseParticipants.Where(cp => !map(cp).IsEmailed) .ToLookup(cp => cp.IsFaculty); IEnumerable<Attachment> attachments = new Attachment[0]; using (var client = new SmtpClient()) { var mailMessages = new List<ParticipantMail>(); var sendMail = new Action<CourseParticipant>(cp => { var mail = new MailMessage(); mail.To.AddParticipants(cp.Participant); var confirmEmail = new CourseInvite { CourseParticipant = cp }; mail.CreateHtmlBody(confirmEmail); appt.AddAppointmentsTo(mail); foreach (var a in attachments) { a.ContentStream.Position = 0; mail.Attachments.Add(a); } mailMessages.Add(new ParticipantMail { Message = mail, SendTask = client.SendMailAsync(mail), CourseParticipant = cp }); }); foreach (var cp in faculty[false]) { sendMail(cp); } if (faculty[true].Any()) { if (course.FacultyMeetingUtc.HasValue) { using (var fm = Appointment.CreateFacultyCalendar(course)) { appt.Add(fm); } } attachments = GetFilePaths(course).Select(fp => new Attachment(fp.Value, System.Net.Mime.MediaTypeNames.Application.Zip) { Name = fp.Key }) .Concat(new[] { new Attachment(CreateDocxTimetable.CreateTimetableDocx(course, WebApiConfig.DefaultTimetableTemplatePath), OpenXmlDocxExtensions.DocxMimeType) { Name = CreateDocxTimetable.TimetableName(course)} }); foreach (var cp in faculty[true]) { sendMail(cp); } } await Task.WhenAll(mailMessages.Select(mm => mm.SendTask)); mailMessages.ForEach(mm => mm.Message.Dispose()); return mailMessages.ToLookup(k => k.SendTask.Status == TaskStatus.RanToCompletion, v => v.CourseParticipant); } } } }