public static void SendEmails() { try { var emailsSent = 0; var session = XpoHelper.GetNewSession(); XPQuery<Phonebook> phonebookQuery = session.Query<Phonebook>(); List<Phonebook> phonebooks = (from p in phonebookQuery where p.ImportTasks.Count > 0 select p).ToList(); foreach (Phonebook phonebook in phonebooks) { phonebook.ImportTasks.Reload(); foreach (ImportTask importTask in phonebook.ImportTasks) { if (importTask.ImportTaskConfiguration.Steps() > 0) { phonebook.Employees.Reload(); importTask.UpdateRequests.Reload(); importTask.Filters.Reload(); List<Employee> filteredEmployees = importTask.FilteredEmployeesWithUpdateRequests(session); foreach (Employee employee in filteredEmployees) { int nextStep = importTask.NextRequiredStepForEmployee(employee); int lastStepCompleted = importTask.UpdateRequestStepCompletedForEmployee(employee); int maxSteps = importTask.ImportTaskConfiguration.Steps(); UpdateRequest lastCompletedUpdateRequest = importTask.LastCompletedUpdateRequestForEmployee(employee); UpdateRequest nextUpdateRequest = importTask.UpdateRequestForEmployeeWithStep(nextStep, employee); var isReminder = false; if (nextStep > 0 && nextStep <= maxSteps) { bool shouldSendEmail = false; if (lastCompletedUpdateRequest != null) { // send email if now is x days after last step completed . date && // if sent date is not null and later than x days after sent if (lastCompletedUpdateRequest.CompletedDate.HasBeenSet()) { if (lastCompletedUpdateRequest.CompletedDate.TimeUntilNow().Minutes > importTask.ImportTaskConfiguration.DaysBetweenEmails) { if (nextUpdateRequest.LastSentDate.HasBeenSet() == false) { shouldSendEmail = true; } else if (nextUpdateRequest.LastSentDate.TimeUntilNow().Minutes > importTask.ImportTaskConfiguration.DaysBetweenEmails) { shouldSendEmail = true; } else if (nextUpdateRequest.LastSentDate.TimeUntilNow().Minutes > importTask.ImportTaskConfiguration.DaysUntilEmailReminder) { isReminder = true; shouldSendEmail = true; } } } } else if (nextUpdateRequest != null) { // send email if sent date is not null and later than x days after sent if (nextUpdateRequest.LastSentDate.HasBeenSet() == false) { shouldSendEmail = true; } else if (nextUpdateRequest.LastSentDate.TimeUntilNow().Minutes > importTask.ImportTaskConfiguration.DaysBetweenEmails) { shouldSendEmail = true; } else if (nextUpdateRequest.LastSentDate.TimeUntilNow().Minutes > importTask.ImportTaskConfiguration.DaysUntilEmailReminder) { isReminder = true; shouldSendEmail = true; } } if (shouldSendEmail) { // create new update request employee.Reload(); UpdateRequest nextRequest = importTask.UpdateRequestForEmployeeWithStep(lastStepCompleted + 1, employee); if (nextRequest != null) { ImportTaskEmail email = importTask.ImportTaskConfiguration.ImportTaskEmails.ToList<ImportTaskEmail>().Where(x => x.Step == nextStep).FirstOrDefault(); string emailLink = Utilities.Domain() + UrlManager.EmployeeEditWithRequestUpdateOid(nextRequest.Oid); string name = String.IsNullOrEmpty(employee.FullName()) ? "there" : employee.FullName(); string subject = String.IsNullOrEmpty(email.Subject) == false ? email.Subject : "Update your data"; subject = subject.Replace(EmployeeFullNamePlaceHolder, name); if (isReminder) { subject += " (Reminder)"; } string emailText = email.EmailText; string toEmail = employee.EmailAddress; string body = emailText + "<br/>" + emailLink; body = body.Replace(EmployeeFullNamePlaceHolder, employee.FullName()); Email mail = new Email() { Subject = subject, ToEmail = toEmail, Body = body }; ValidationResult validation = new EmailValidator().Validate(mail); if (validation.IsValid == true) { if (nextRequest.OriginalSentDate.HasBeenSet() == false) { nextRequest.OriginalSentDate = DateTime.Now; } nextRequest.LastSentDate = DateTime.Now; nextRequest.TimesSent++; nextRequest.Save(); Debug.WriteLine("Sending email to: " + toEmail + " with body: " + body); if (toEmail == "*****@*****.**") { mail.Authenticate("*****@*****.**", "yfwlmyeevmvbdbjq").Send(); } emailsSent++; } else { Debug.WriteLine("Error sending email to: " + toEmail + " with error: " + String.Join(",", validation.Errors)); } } else { Debug.WriteLine("Next request was null - meaning employee is done."); } } } } } } } session.Disconnect(); session.Dispose(); Debug.Write(emailsSent + " would be sent /n"); } catch (Exception e) { Debug.Write("background email task threw ex" + e); } }