/// <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(); }
public SendEmailTask(IMailMergeService mailMergeService, ITemplateRenderer renderer, ITenantContext tenantContext, IStringLocalizer <EmailResource> localizer, ILogger <SendEmailTask> logger) { _mailMergeService = mailMergeService; _renderer = renderer; _localizer = localizer; _tenantContext = tenantContext; _logger = logger; }
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); } }
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); } }
/// <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) { }
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); } }
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); } } }
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); } }
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); } }