private void NotifyUserofReportView(ReportEmail reportEmail) { var report = _reportManager.Get(reportEmail.ReportId); var recipient = _recipientManager.Get(reportEmail.RecipientId); reportEmail.Recipient = recipient; // Notify listeners var webHooksSent = _webhookManager.ReportViewed(reportEmail.CompanyId, reportEmail, report); // Send a notification email if this is the first time the report is being viewed. if (reportEmail.Views == 1) { var company = _companyManager.Get(report.CompanyId); var owner = _companyManager.GetOwner(reportEmail.CompanyId); var subject = string.Format("{0} viewed your report", recipient.DisplayName); var textReplacements = new TextReplacements { Subject = subject, CompanyName = company.Name, FullName = recipient.DisplayName, FirstName = string.IsNullOrWhiteSpace(recipient.FirstName) ? "this person" : recipient.FirstName, GravatarUrl = GravatarHelper.GravatarHelper.CreateGravatarUrl(recipient.Email, 96, ConfigUtil.DefaultGravatarImage, null, null, null), ReportLink = string.Format("{0}reports/{1}", ConfigUtil.BaseAppUrl, report.UniqueId), ReportPeriodName = report.Date.ToString("MMMM \\'yy", CultureInfo.InvariantCulture), PromoteSlack = !webHooksSent }; _genericEmailManager.SendFromTemplate(owner.Email, subject, TextTemplate.ReportViewedNotificationEmail, textReplacements); } }
public async Task <ActionResult> ForgotPassword(ForgotPasswordViewModel model) { if (ModelState.IsValid) { var user = await UserManager.FindByNameAsync(model.Email); if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id))) { // Don't reveal that the user does not exist or is not confirmed this.SetNotificationMessage(NotificationType.StickySuccess, "We've sent you an email so that you can reset your password."); return(RedirectToAction("Login", "Account")); } // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 // Send an email with this link var code = await UserManager.GeneratePasswordResetTokenAsync(user.Id); var callbackUrl = Url.Action("ResetPassword", "Account", new { code = code }, protocol: Request.Url.Scheme); callbackUrl = callbackUrl + "&email=" + Uri.EscapeDataString(user.Email); var textReplacement = new TextReplacements { BaseUrl = ConfigUtil.BaseAppUrl, RecipientEmail = user.Email, ResetPasswordLink = callbackUrl }; _genericEmailManager.SendFromTemplate(user.Email, "Supdate Password Reset", TextTemplate.ForgotPasswordEmail, textReplacement); this.SetNotificationMessage(NotificationType.StickySuccess, "We've sent you an email so that you can reset your password."); return(RedirectToAction("Login", "Account")); } // If we got this far, something failed, redisplay form return(View(model)); }
public void SendWelcomeEmail(string emailAddress) { var textReplacement = new TextReplacements { BaseUrl = ConfigUtil.BaseAppUrl, RecipientEmail = emailAddress }; _genericEmailManager.SendFromTemplate(emailAddress, "Welcome to Supdate", TextTemplate.WelcomeEmail, textReplacement); }
public void AddTeamMember(LiteUser teamMember, string welcomeMessage, string addedByEmail, string registerUrl) { if (teamMember.AccessibleAreaIds == null || teamMember.AccessibleAreaIds.Count() < 1) { throw new BusinessException(SelectAtLeastOneReportingArea); } var status = _companyRepository.AddTeamMember(teamMember); var thisCompany = _companyRepository.Get(teamMember.CompanyId); TextReplacements textReplacements; string subject; switch (status) { case 0: throw new BusinessException("That email address is already in use by your team"); case 1: // existing user added, notify subject = string.Format("{0} - Access Granted", thisCompany.Name); textReplacements = new TextReplacements { Subject = subject, CompanyName = thisCompany.Name, WelcomeMessage = welcomeMessage, OwnerEmail = addedByEmail, ToEmail = teamMember.Email, RecipientEmail = teamMember.Email }; _genericEmailManager.SendFromTemplate(teamMember.Email, subject, TextTemplate.TeamGrantAccessEmail, textReplacements); break; case 2: // new user: create invite and send registration link var invite = _companyRepository.AddTeamMemberInvite(teamMember); var registerLink = registerUrl.Replace(InviteCode, Uri.EscapeDataString(invite.UniqueId.ToString())); registerLink = registerLink.Replace(InviteEmail, Uri.EscapeDataString(teamMember.Email)); subject = string.Format("{0} - Invitation", thisCompany.Name); textReplacements = new TextReplacements { Subject = subject, CompanyName = thisCompany.Name, WelcomeMessage = welcomeMessage, OwnerEmail = addedByEmail, ToEmail = teamMember.Email, RecipientEmail = teamMember.Email, RegisterLink = new Uri(new Uri(ConfigUtil.BaseAppUrl), registerLink).AbsoluteUri }; _genericEmailManager.SendFromTemplate(teamMember.Email, subject, TextTemplate.TeamInvitationEmail, textReplacements); break; } }
public static string SendSmsReplyIncoming(CMSDataContext db, int receivedId, Person p, string toNumber, SMSNumber fromNumber, string title, string message) { string sSid = GetSid(db); string sToken = GetToken(db); var list = new SMSList { Created = DateTime.Now, SendAt = DateTime.Now, SenderID = db.UserPeopleId ?? 1, SendGroupID = fromNumber.GroupID, Title = title, Message = message, ReplyToId = receivedId }; var item = new SMSItem { ListID = list.Id, PeopleID = p?.PeopleId, Number = toNumber, }; list.SMSItems.Add(item); var r = new TextReplacements(db, message); if (item.PeopleID != null) { message = r.DoReplacements(item); } var response = SendSmsInternal(sSid, sToken, fromNumber.Number, toNumber, message); var succeeded = !IsSmsFailed(response); if (succeeded) { list.SentSMS = 1; item.Sent = true; } db.SMSLists.InsertOnSubmit(list); db.SubmitChanges(); if (succeeded) { db.Connection.Execute( "update dbo.SmsReceived set RepliedTo = @replied where id = @id", new { replied = true, id = receivedId }); } return(ResultMessage(response, toNumber)); }
private void NotifyOwnerOfNewComment(Discussion discussion, Comment newComment, LiteUser owner, bool hasWebhooks) { var subject = string.Format("{0} commented on your report", newComment.AuthorName); var textReplacements = new TextReplacements { Subject = subject, FullName = newComment.AuthorName, Text = subject, DiscussionTitle = discussion.Title, ReportPeriodName = discussion.ReportDate.ToString("MMMM \\'yy", CultureInfo.InvariantCulture), Comment = newComment.Text, GravatarUrl = GravatarHelper.GravatarHelper.CreateGravatarUrl(newComment.AuthorEmail, 96, ConfigUtil.DefaultGravatarImage, null, null, null), ReportLink = string.Format("{0}reports/{1}?discuss={2}&requireLogin=true", ConfigUtil.BaseAppUrl, discussion.ReportGuId, discussion.DiscussionName), PromoteSlack = !hasWebhooks }; _genericEmailManager.SendFromTemplate(owner.Email, subject, TextTemplate.ReportCommentNotificationEmail, textReplacements); }
private void NotifyParticipantsOfNewComment(Discussion discussion, Comment newComment, LiteUser owner) { // Check if there are authors in this discussion part from the owner and the author of this new comment. if (discussion.Comments.Count(c => c.AuthorEmail != owner.Email && c.AuthorEmail != newComment.AuthorEmail) == 0) { //there's no one to notify return; } var subject = string.Format("{0} replied to your comment", newComment.AuthorName); var textReplacements = new TextReplacements { Subject = subject, FullName = newComment.AuthorName, Text = subject, DiscussionTitle = discussion.Title, ReportPeriodName = discussion.ReportDate.ToString("MMMM \\'yy", CultureInfo.InvariantCulture), Comment = newComment.Text, GravatarUrl = GravatarHelper.GravatarHelper.CreateGravatarUrl(newComment.AuthorEmail, 96, ConfigUtil.DefaultGravatarImage, null, null, null), ExcludePasswordResetLink = true, ReportLink = string.Format("{0}reports/{1}?discuss={2}&requireLogin=true", ConfigUtil.BaseAppUrl, discussion.ReportGuId, discussion.DiscussionName), }; var participants = discussion.Comments.Where(c => c.AuthorEmail != owner.Email && c.AuthorEmail != newComment.AuthorEmail).Select(c => c.AuthorEmail).Distinct(); foreach (var email in participants) { var reportEmail = _reportEmailManager.GetByEmailAddress(discussion.CompanyId, discussion.ReportId, email); if (reportEmail != null) { textReplacements.ReportLink = string.Format("{0}reports/email/{1}/{2}?discuss={3}", ConfigUtil.BaseAppUrl, reportEmail.UniqueId, reportEmail.ViewKey, discussion.DiscussionName); } _genericEmailManager.SendFromTemplate(email, subject, TextTemplate.ReportCommentNotificationEmail, textReplacements); } }
public void SendFromTemplate(string toEmail, string subject, TextTemplate template, TextReplacements replacements) { // Setup replacements. if (string.IsNullOrEmpty(replacements.RecipientEmail)) { replacements.RecipientEmail = toEmail; } replacements.BaseUrl = ConfigUtil.BaseAppUrl; // Compile email body and subject. var emailBody = _templateManager.Compile(template, replacements); var emailSubject = _templateManager.Compile(subject, replacements); var categories = GetEmailCategories(template); // Prepare the email message and queue it. var mailMessage = CreateEmailMessage(toEmail, toEmail, emailSubject, emailBody, categories); Task.Run(() => QueueEmail(mailMessage)); }
public static void ProcessQueue(CMSDataContext db, int iListID) { var sSID = GetSid(db); var sToken = GetToken(db); if (sSID.Length == 0 || sToken.Length == 0) { return; } var cb = new SqlConnectionStringBuilder(db.ConnectionString) { InitialCatalog = "ELMAH" }; var ErrorLog = new SqlErrorLog(cb.ConnectionString) { ApplicationName = "BVCMS" }; var smsList = (from e in db.SMSLists where e.Id == iListID select e).Single(); var smsItems = from e in db.SMSItems where e.ListID == iListID select e; var smsGroup = (from e in db.SMSNumbers where e.GroupID == smsList.SendGroupID select e).ToList(); var iCount = 0; var hostUrl = db.Setting("DefaultHost", ""); var r = new TextReplacements(db, smsList.Message); foreach (var item in smsItems) { try { if (item.NoNumber || item.NoOptIn) { continue; } var callbackUrl = hostUrl.HasValue() ? $"{hostUrl}/WebHook/Twilio/{item.Id}" : null; var message = smsList.Message; if (item.PeopleID != null) { message = r.DoReplacements(item); } var response = SendSmsInternal(sSID, sToken, smsGroup[iCount].Number, item.Number, message, callbackUrl); if (!callbackUrl.HasValue()) { UpdateSMSItemStatus(db, item, response); } iCount++; if (iCount >= smsGroup.Count()) { iCount = 0; } } catch (ApiException ae) { if (ae.Code == 21610) // https://www.twilio.com/docs/api/errors/21610 { var person = db.People.FirstOrDefault(p => p.PeopleId == item.PeopleID); person.ReceiveSMS = false; item.ErrorMessage = "User opt-out"; } else { Console.WriteLine(ae); ErrorLog.Log(new Error(ae)); item.ErrorMessage = $"({ae.Code}) {ae.Message}".MaxString(150); } item.ResultStatus = $"error"; db.SubmitChanges(); } catch (Exception ex) { Console.WriteLine(ex); ErrorLog.Log(new Error(ex)); item.ResultStatus = $"error"; item.ErrorMessage = $"{ex.Message}".MaxString(150); db.SubmitChanges(); } } smsList.Sent = true; db.SubmitChanges(); }
public string Compile(TextTemplate template, TextReplacements replacements) { var templateText = GetTemplateText(template); return(Compile(templateText, replacements)); }
public string Compile(string templateText, TextReplacements replacements) { var body = Engine.Razor.RunCompile(templateText, GetMd5Hash(templateText), null, replacements); return(body); }