コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        public void SendWelcomeEmail(string emailAddress)
        {
            var textReplacement = new TextReplacements
            {
                BaseUrl        = ConfigUtil.BaseAppUrl,
                RecipientEmail = emailAddress
            };

            _genericEmailManager.SendFromTemplate(emailAddress, "Welcome to Supdate", TextTemplate.WelcomeEmail, textReplacement);
        }
コード例 #4
0
        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;
            }
        }
コード例 #5
0
ファイル: TwilioHelper.cs プロジェクト: rastographics/bvcms
        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));
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
            }
        }
コード例 #8
0
        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));
        }
コード例 #9
0
ファイル: TwilioHelper.cs プロジェクト: rastographics/bvcms
        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();
        }
コード例 #10
0
        public string Compile(TextTemplate template, TextReplacements replacements)
        {
            var templateText = GetTemplateText(template);

            return(Compile(templateText, replacements));
        }
コード例 #11
0
        public string Compile(string templateText, TextReplacements replacements)
        {
            var body = Engine.Razor.RunCompile(templateText, GetMd5Hash(templateText), null, replacements);

            return(body);
        }