public ActionResult UpdateUnansweredFAQ(UpdateUnansweredFAQModel model) { if (model != null) { UnAnsweredFAQ faq = (from f in base.db.UnAnsweredFAQs where (f.unanswered_faq_id == model.unanswered_faq_id) select f) .FirstOrDefault(); if (faq != null) { faq.faq_answer = model.faq_answer; base.db.Entry(faq).State = System.Data.Entity.EntityState.Modified; base.db.SaveChanges(); Task.Factory.StartNew(() => { SendFAQReply(faq.faq, model.faq_answer, faq.faq_email_id, faq.to_email_address, faq.faq_email_subject); }); return(base.SuccessMessage(string.Empty)); } } return(base.NoSuccessMessage(Constants.ERROR_IN_EXECUTION)); }
private async Task <object> SendAutoReply(FAQEmail aEmail) { if (aEmail != null) { EmailDownloader aDownloader = new EmailDownloader(aEmail.faq_email_id); aDownloader.FaqLogger = this.FaqLogger; List <Message> UnreadEmails = await aDownloader.UnreadEmails(); if (UnreadEmails != null && UnreadEmails.Count > 0) { StringBuilder builder = null; foreach (Message aUnreadEmail in UnreadEmails) { FAQEmailsDownload newEmail = new FAQEmailsDownload() { download_date = DateTime.Now , email_uid = aUnreadEmail.Headers.MessageId , faq_email_id = aEmail.faq_email_id }; this.db.FAQEmailsDownloads.Add(newEmail); this.db.SaveChanges(); builder = new StringBuilder(); OpenPop.Mime.MessagePart plainText = aUnreadEmail.FindFirstPlainTextVersion(); if (plainText != null) { // We found some plaintext! builder.Append(plainText.GetBodyAsText()); } else { // Might include a part holding html instead OpenPop.Mime.MessagePart html = aUnreadEmail.FindFirstHtmlVersion(); if (html != null) { // We found some html! builder.Append(html.GetBodyAsText()); } } if (builder != null && !string.IsNullOrEmpty(builder.ToString())) { CanvasRespondRule answerFound = AnswerFinder.FindAnswer(AutoResponderRuleTypes.FAQs, builder.ToString()); if (answerFound != null) { SmtpPopSetting settings = (from s in db.SmtpPopSettings where (s.smtp_pop_id == aEmail.smtp_pop_id) select s ).FirstOrDefault(); if (settings != null) { string sEmailReceivedFrom = aUnreadEmail.Headers.From.MailAddress.Address; using (MailMessage mail = new MailMessage(aEmail.user_name, sEmailReceivedFrom)) { using (SmtpClient client = new SmtpClient(settings.smtp_server, settings.smpt_port)) { client.EnableSsl = settings.smtp_use_ssl; client.DeliveryMethod = SmtpDeliveryMethod.Network; client.UseDefaultCredentials = false; client.Credentials = new NetworkCredential(aEmail.user_name, aEmail.use_password); if (!builder.ToString().Trim().ToLower().StartsWith("re:")) { mail.Subject = string.Concat("RE: ", aUnreadEmail.Headers.Subject); } mail.Body = answerFound.CanvasAnswer; try { //client.SendCompleted += (s, e) => //{ //}; //client.SendAsync(mail, null); client.Send(mail); Log(string.Format("Question '{0}' replied with answer '{1}' to email account '{2}'" , builder.ToString(), answerFound.CanvasAnswer, sEmailReceivedFrom)); AnsweredFAQ aAnswer = new AnsweredFAQ() { answer_date_time = DateTime.Now , answer_replied_with = answerFound.CanvasAnswer , faq = builder.ToString() , canvas_rule_id = answerFound.CanvasRuleId , faq_email_id = aEmail.faq_email_id }; this.db.AnsweredFAQs.Add(aAnswer); this.db.SaveChanges(); } catch (Exception ex) { Log(string.Concat("EXCEPTION : ", ex.Message)); } } } } } else { Log(string.Format("No answer was found against FAQ '{0}'", builder.ToString())); UnAnsweredFAQ unAnswered = new UnAnsweredFAQ() { faq = builder.ToString() , faq_email_id = aEmail.faq_email_id , to_email_address = aUnreadEmail.Headers.From.MailAddress.Address , faq_email_subject = aUnreadEmail.Headers.Subject }; db.UnAnsweredFAQs.Add(unAnswered); db.SaveChanges(); } } } } } return(null); }