/// <summary>
 /// CTOR. None of the dependency injection parameters must have scoped lifetime.
 /// </summary>
 /// <param name="backgroundWebHost"></param>
 /// <param name="mailMergeService"></param>
 /// <param name="logger"></param>
 public TeamApplicationEmailTask(BackgroundWebHost backgroundWebHost, IMailMergeService mailMergeService,
                                 SiteContext siteContext,
                                 ILogger <TeamApplicationEmailTask> logger)
     : base(backgroundWebHost, mailMergeService, logger)
 {
     _siteContext = siteContext;
 }
 /// <summary>
 /// CTOR. None of the dependency injection parameters must have scoped lifetime.
 /// </summary>
 /// <param name="backgroundWebHost"></param>
 /// <param name="mailMergeService"></param>
 /// <param name="timeZoneConverter"></param>
 /// <param name="logger"></param>
 public FixtureEmailTask(BackgroundWebHost backgroundWebHost, IMailMergeService mailMergeService,
                         Axuno.Tools.DateAndTime.TimeZoneConverter timeZoneConverter,
                         ILogger <FixtureEmailTask> logger)
     : base(backgroundWebHost, mailMergeService, logger)
 {
     _timeZoneConverter = timeZoneConverter;
 }
 public AbstractEmailTask(BackgroundWebHost backgroundWebHost, IMailMergeService mailMergeService, ILogger <AbstractEmailTask> logger)
 {
     BackgroundWebHost = backgroundWebHost;
     MailMergeService  = mailMergeService;
     Logger            = logger;
     Timeout           = TimeSpan.FromMinutes(1);
     MailMessage       = MailMergeService.CreateStandardMessage();
 }
示例#4
0
 public SendEmailTask(IMailMergeService mailMergeService, ITemplateRenderer renderer, ITenantContext tenantContext, IStringLocalizer <EmailResource> localizer, ILogger <SendEmailTask> logger)
 {
     _mailMergeService = mailMergeService;
     _renderer         = renderer;
     _localizer        = localizer;
     _tenantContext    = tenantContext;
     _logger           = logger;
 }
示例#5
0
        public async IAsyncEnumerable <MailMergeMessage> GetMailMergeMessages(ITenantContext tenantContext, ITemplateRenderer renderer, IMailMergeService mailMergeService, IStringLocalizer <EmailResource> localizer, [EnumeratorCancellation] CancellationToken cancellationToken)
        {
            if (Parameters.Email is null || Parameters.Subject is null || Parameters.CallbackUrl is null ||
                Parameters.TemplateNameTxt is null || Parameters.TemplateNameHtml is null ||
                Parameters.DeadlineUtc is null)
            {
                throw new ArgumentNullException(nameof(Parameters), "One or more required parameters are null");
            }

            var model = new ChangeUserAccountModel()
            {
                Email       = Parameters.Email,
                CallbackUrl = Parameters.CallbackUrl,
                Deadline    = Parameters.DeadlineUtc
            };

            {
                using var cs = new CultureSwitcher(Parameters.CultureInfo, Parameters.CultureInfo);

                var mailMergeMessage = mailMergeService.CreateStandardMessage();
                mailMergeMessage.EnableFormatter = false;
                mailMergeMessage.Subject         = Parameters.Subject; // already localized

                mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, tenantContext.SiteContext.Email.GeneralFrom.DisplayName, tenantContext.SiteContext.Email.GeneralFrom.Address));
                mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, Parameters.Email));

                mailMergeMessage.PlainText = await renderer.RenderAsync(Parameters.TemplateNameTxt, model,
                                                                        Parameters.CultureInfo.TwoLetterISOLanguageName);

                mailMergeMessage.HtmlText = await renderer.RenderAsync(Parameters.TemplateNameHtml, model,
                                                                       Parameters.CultureInfo.TwoLetterISOLanguageName);

                yield return(mailMergeMessage);
            }
        }
示例#6
0
        public async IAsyncEnumerable <MailMergeMessage> GetMailMergeMessages(ITenantContext tenantContext, ITemplateRenderer renderer, IMailMergeService mailMergeService, IStringLocalizer <EmailResource> localizer, [EnumeratorCancellation] CancellationToken cancellationToken)
        {
            if (Parameters.Email is null || Parameters.NewEmail is null || Parameters.CallbackUrl is null ||
                Parameters.DeadlineUtc is null)
            {
                throw new ArgumentNullException(nameof(Parameters), "One or more required parameters are null");
            }

            {
                using var cs = new CultureSwitcher(Parameters.CultureInfo, Parameters.CultureInfo);

                // First email goes to the new email address

                var model = new ChangeUserAccountModel()
                {
                    Email       = Parameters.NewEmail,
                    CallbackUrl = Parameters.CallbackUrl,
                    Deadline    = Parameters.DeadlineUtc
                };

                var mailMergeMessage = mailMergeService.CreateStandardMessage();
                mailMergeMessage.EnableFormatter = false;
                mailMergeMessage.Subject         = localizer["Please confirm your new primary email"].Value;

                mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, tenantContext.SiteContext.Email.GeneralFrom.DisplayName, tenantContext.SiteContext.Email.GeneralFrom.Address));
                mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, Parameters.NewEmail));

                mailMergeMessage.PlainText = await renderer.RenderAsync(TemplateName.ConfirmNewPrimaryEmailTxt, model,
                                                                        Parameters.CultureInfo.TwoLetterISOLanguageName);

                mailMergeMessage.HtmlText = await renderer.RenderAsync(TemplateName.ConfirmNewPrimaryEmailHtml, model,
                                                                       Parameters.CultureInfo.TwoLetterISOLanguageName);

                yield return(mailMergeMessage);

                // Second email goes to the current email address

                model = new ChangeUserAccountModel()
                {
                    Email       = Parameters.NewEmail,
                    CallbackUrl = string.Empty, // not used in the template
                    Deadline    = null          // not used in the template
                };

                mailMergeMessage = mailMergeService.CreateStandardMessage();
                mailMergeMessage.EnableFormatter = false;
                mailMergeMessage.Subject         = localizer["Your primary email is about to be changed"].Value;

                mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, tenantContext.SiteContext.Email.GeneralFrom.DisplayName, tenantContext.SiteContext.Email.GeneralFrom.Address));
                mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, Parameters.Email));

                mailMergeMessage.PlainText = await renderer.RenderAsync(TemplateName.NotifyCurrentPrimaryEmailTxt, model,
                                                                        Parameters.CultureInfo.TwoLetterISOLanguageName);

                mailMergeMessage.HtmlText = await renderer.RenderAsync(TemplateName.NotifyCurrentPrimaryEmailHtml, model,
                                                                       Parameters.CultureInfo.TwoLetterISOLanguageName);

                yield return(mailMergeMessage);
            }
        }
示例#7
0
 /// <summary>
 /// CTOR. None of the dependency injection parameters must have scoped lifetime.
 /// </summary>
 /// <param name="backgroundWebHost"></param>
 /// <param name="mailMergeService"></param>
 /// <param name="logger"></param>
 public ContactEmailTask(BackgroundWebHost backgroundWebHost, IMailMergeService mailMergeService,
                         ILogger <ContactEmailTask> logger)
     : base(backgroundWebHost, mailMergeService, logger)
 {
 }
示例#8
0
        public async IAsyncEnumerable <MailMergeMessage> GetMailMergeMessages(ITenantContext tenantContext, ITemplateRenderer renderer, IMailMergeService mailMergeService, IStringLocalizer <EmailResource> localizer, [EnumeratorCancellation] CancellationToken cancellationToken)
        {
            var model = new ChangeFixtureModel
            {
                Fixture = (await tenantContext.DbContext.AppDb.MatchRepository.GetPlannedMatchesAsync(
                               new PredicateExpression(PlannedMatchFields.Id == Parameters.MatchId), cancellationToken))
                          .FirstOrDefault()
            };

            if (model.Fixture is null)
            {
                throw new Exception($"No fixture found for match id '{Parameters.MatchId}'");
            }
            ;

            var teamUserRoundInfos = await tenantContext.DbContext.AppDb.TeamRepository.GetTeamUserRoundInfosAsync(
                new PredicateExpression((TeamUserRoundFields.TeamId == model.Fixture.HomeTeamId |
                                         TeamUserRoundFields.TeamId == model.Fixture.GuestTeamId)
                                        .And(TeamUserRoundFields.TournamentId == tenantContext.TournamentContext.MatchPlanTournamentId)),
                cancellationToken);

            model.Username = teamUserRoundInfos.First(tur => tur.UserId == Parameters.ChangedByUserId).CompleteName;

            var plainTextContent = await renderer.RenderAsync(Templates.Email.TemplateName.ChangeFixtureTxt, model,
                                                              Parameters.CultureInfo.TwoLetterISOLanguageName);

            var recipientGroups = new[]
            {
                teamUserRoundInfos.Where(tur => tur.TeamId == model.Fixture.HomeTeamId), // home team users
                teamUserRoundInfos.Where(tur => tur.TeamId == model.Fixture.GuestTeamId) // guest team users
            };

            // each recipient group will get the same email text
            foreach (var recipients in recipientGroups)
            {
                var mailMergeMessage = mailMergeService.CreateStandardMessage();
                mailMergeMessage.EnableFormatter = false;
                mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, tenantContext.SiteContext.Email.GeneralFrom.DisplayName, tenantContext.SiteContext.Email.GeneralFrom.Address));

                foreach (var tur in recipients)
                {
                    if (string.IsNullOrWhiteSpace(mailMergeMessage.Subject))
                    {
                        using (new CultureSwitcher(Parameters.CultureInfo, Parameters.CultureInfo))
                        {
                            mailMergeMessage.Subject = localizer["Fixture change for team '{0}'", tur.TeamNameForRound].Value;
                        }
                    }

                    mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To,
                                                                                 $"{tur.CompleteName}", tur.Email));

                    if (!string.IsNullOrEmpty(tur.Email2))
                    {
                        mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.CC,
                                                                                     $"{tur.CompleteName}", tur.Email2));
                    }
                }

                // Send registration info also to league administration
                mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.Bcc,
                                                                             tenantContext.SiteContext.Email.GeneralBcc.DisplayName,
                                                                             tenantContext.SiteContext.Email.GeneralBcc.Address));

                mailMergeMessage.PlainText = plainTextContent;

                yield return(mailMergeMessage);
            }
        }
示例#9
0
        public async IAsyncEnumerable <MailMergeMessage> GetMailMergeMessages(ITenantContext tenantContext, ITemplateRenderer renderer, IMailMergeService mailMergeService, IStringLocalizer <EmailResource> localizer, [EnumeratorCancellation] CancellationToken cancellationToken)
        {
            var fixtures = await tenantContext.DbContext.AppDb.MatchRepository.GetPlannedMatchesAsync(
                new PredicateExpression(PlannedMatchFields.PlannedStart
                                        .Between(Parameters.ReferenceDateUtc, Parameters.ReferenceDateUtc.AddDays(1).AddSeconds(-1))
                                        .And(PlannedMatchFields.PlannedStart.IsNotNull()
                                             .And(PlannedMatchFields.PlannedEnd.IsNotNull().And(PlannedMatchFields.TournamentId ==
                                                                                                tenantContext.TournamentContext
                                                                                                .MatchPlanTournamentId)))),
                cancellationToken);

            if (!fixtures.Any())
            {
                yield break;
            }

            var teamIds = new HashSet <long>();

            fixtures.ForEach(f =>
            {
                teamIds.Add(f.HomeTeamId);
                teamIds.Add(f.GuestTeamId);
            });

            var teamUserRoundInfos = await tenantContext.DbContext.AppDb.TeamRepository.GetTeamUserRoundInfosAsync(
                new PredicateExpression(TeamUserRoundFields.TeamId.In(teamIds).And(TeamUserRoundFields.TournamentId == tenantContext.TournamentContext.MatchPlanTournamentId)), cancellationToken);

            foreach (var fixture in fixtures)
            {
                var model = new RemindMatchResultModel
                {
                    Fixture = fixture,
                };

                var recipientGroups = new[]
                {
                    teamUserRoundInfos.Where(tur => tur.TeamId == fixture.HomeTeamId || tur.TeamId == fixture.GuestTeamId && tur.IsManager), // all team managers
                };

                var plainTextContent = await renderer.RenderAsync(
                    Templates.Email.TemplateName.RemindMatchResultTxt, model,
                    Parameters.CultureInfo.TwoLetterISOLanguageName);

                // each recipient group will get the same email text
                foreach (var recipients in recipientGroups)
                {
                    var mailMergeMessage = mailMergeService.CreateStandardMessage();
                    mailMergeMessage.EnableFormatter = false;
                    mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, tenantContext.SiteContext.Email.GeneralFrom.DisplayName, tenantContext.SiteContext.Email.GeneralFrom.Address));

                    foreach (var tur in recipients)
                    {
                        if (string.IsNullOrWhiteSpace(mailMergeMessage.Subject))
                        {
                            using (new CultureSwitcher(Parameters.CultureInfo, Parameters.CultureInfo))
                            {
                                mailMergeMessage.Subject = localizer["Missing result for match '{0}' vs. '{1}'", model.Fixture.HomeTeamNameForRound, model.Fixture.GuestTeamNameForRound].Value;
                            }
                        }

                        mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To,
                                                                                     $"{tur.CompleteName}", tur.Email));

                        if (!string.IsNullOrEmpty(tur.Email2))
                        {
                            mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.CC,
                                                                                         $"{tur.CompleteName}", tur.Email2));
                        }
                    }

                    // Send registration info also to league administration
                    mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.Bcc,
                                                                                 tenantContext.SiteContext.Email.GeneralBcc.DisplayName,
                                                                                 tenantContext.SiteContext.Email.GeneralBcc.Address));

                    mailMergeMessage.PlainText = plainTextContent;

                    yield return(mailMergeMessage);
                }
            }
        }
示例#10
0
        public async IAsyncEnumerable <MailMergeMessage> GetMailMergeMessages(ITenantContext tenantContext, ITemplateRenderer renderer, IMailMergeService mailMergeService, IStringLocalizer <EmailResource> localizer, [EnumeratorCancellation] CancellationToken cancellationToken)
        {
            if (Parameters.ContactForm is null)
            {
                throw new ArgumentNullException(nameof(Parameters.ContactForm), "One or more required parameters are null");
            }

            var model = new { Form = Parameters.ContactForm };

            {
                using var cs = new CultureSwitcher(Parameters.CultureInfo, Parameters.CultureInfo);

                var mailMergeMessage = mailMergeService.CreateStandardMessage();
                mailMergeMessage.EnableFormatter = false;
                mailMergeMessage.Subject         = model.Form.Subject; // user-generated, cannot localize!

                mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, tenantContext.SiteContext.Email.ContactFrom.Address));
                mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, tenantContext.SiteContext.Email.ContactTo.Address));

                mailMergeMessage.PlainText = await renderer.RenderAsync(Templates.Email.TemplateName.ContactFormTxt, model,
                                                                        Parameters.CultureInfo.TwoLetterISOLanguageName);

                yield return(mailMergeMessage);
            }
        }
示例#11
0
        public async IAsyncEnumerable <MailMergeMessage> GetMailMergeMessages(ITenantContext tenantContext, ITemplateRenderer renderer, IMailMergeService mailMergeService, IStringLocalizer <EmailResource> localizer, [EnumeratorCancellation] CancellationToken cancellationToken)
        {
            var roundWithType = (await tenantContext.DbContext.AppDb.RoundRepository.GetRoundsWithTypeAsync(
                                     new PredicateExpression(
                                         RoundFields.TournamentId == tenantContext.TournamentContext.ApplicationTournamentId &
                                         RoundFields.Id == Parameters.RoundId), cancellationToken)).First();

            var teamUserRoundInfos = await tenantContext.DbContext.AppDb.TeamRepository.GetTeamUserRoundInfosAsync(
                new PredicateExpression(TeamUserRoundFields.TeamId == Parameters.TeamId &
                                        TeamUserRoundFields.TournamentId ==
                                        tenantContext.TournamentContext.ApplicationTournamentId), cancellationToken);

            var tournament =
                await tenantContext.DbContext.AppDb.TournamentRepository.GetTournamentAsync(new PredicateExpression(TournamentFields.Id ==
                                                                                                                    tenantContext.TournamentContext.ApplicationTournamentId), cancellationToken);

            var registeredBy = teamUserRoundInfos.First(tur => tur.UserId == Parameters.RegisteredByUserId);

            var model = new ConfirmTeamApplicationModel
            {
                IsNewApplication     = Parameters.IsNewApplication,
                RegisteredByName     = registeredBy.CompleteName,
                RegisteredByEmail    = registeredBy.Email,
                TeamName             = teamUserRoundInfos.First(tur => tur.TeamId == Parameters.TeamId).TeamNameForRound,
                TournamentName       = tournament !.Name,
                RoundDescription     = roundWithType.Description,
                RoundTypeDescription = roundWithType.RoundType.Description,
                UrlToEditApplication = Parameters.UrlToEditApplication
            };

            foreach (var tur in teamUserRoundInfos)
            {
                using var cs = new CultureSwitcher(Parameters.CultureInfo, Parameters.CultureInfo);

                model.IsRegisteringUser = Parameters.RegisteredByUserId == tur.UserId;

                var mailMergeMessage = mailMergeService.CreateStandardMessage();
                mailMergeMessage.EnableFormatter = false;
                mailMergeMessage.Subject         = model.IsNewApplication
                    ? localizer["Confirmation of the team registration"].Value
                    : localizer["Update of team registration"].Value;

                mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, tenantContext.SiteContext.Email.GeneralFrom.DisplayName, tenantContext.SiteContext.Email.GeneralFrom.Address));
                mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To,
                                                                             $"{tur.CompleteName}, Team '{tur.TeamName}'", tur.Email));
                if (!string.IsNullOrEmpty(tur.Email2))
                {
                    mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.CC,
                                                                                 $"{tur.CompleteName}, Team '{tur.TeamName}'", tur.Email2));
                }

                if (model.IsRegisteringUser)
                {
                    // Send registration info also to league administration
                    mailMergeMessage.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.Bcc,
                                                                                 tenantContext.SiteContext.Email.GeneralBcc.DisplayName,
                                                                                 tenantContext.SiteContext.Email.GeneralBcc.Address));
                }

                mailMergeMessage.PlainText = await renderer.RenderAsync(Templates.Email.TemplateName.ConfirmTeamApplicationTxt, model,
                                                                        Parameters.CultureInfo.TwoLetterISOLanguageName);

                yield return(mailMergeMessage);
            }
        }