Skip to content

Commit

Permalink
fix: Make MailSender singleton
Browse files Browse the repository at this point in the history
  • Loading branch information
hez2010 committed Apr 14, 2024
1 parent b72f995 commit 1332846
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 21 deletions.
6 changes: 3 additions & 3 deletions src/GZCTF/Controllers/AccountController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ public async Task<IActionResult> Register([FromBody] RegisterModel model, Cancel
}
else
{
if (!mailSender.SendConfirmEmailUrl(user.UserName, user.Email, link))
if (!mailSender.SendConfirmEmailUrl(user.UserName, user.Email, link, localizer))
return BadRequest(new RequestResponse(localizer[nameof(Resources.Program.Account_EmailSendFailed)]));
}

Expand Down Expand Up @@ -174,7 +174,7 @@ public async Task<IActionResult> Recovery([FromBody] RecoveryModel model, Cancel
}
else
{
if (!mailSender.SendResetPasswordUrl(user.UserName, user.Email, link))
if (!mailSender.SendResetPasswordUrl(user.UserName, user.Email, link, localizer))
return BadRequest(new RequestResponse(localizer[nameof(Resources.Program.Account_EmailSendFailed)]));
}

Expand Down Expand Up @@ -434,7 +434,7 @@ public async Task<IActionResult> ChangeEmail([FromBody] MailChangeModel model)
}
else
{
if (!mailSender.SendChangeEmailUrl(user!.UserName, model.NewMail, link))
if (!mailSender.SendChangeEmailUrl(user!.UserName, model.NewMail, link, localizer))
return BadRequest(new RequestResponse(localizer[nameof(Resources.Program.Account_EmailSendFailed)]));
}

Expand Down
2 changes: 1 addition & 1 deletion src/GZCTF/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@

#region Services and Repositories

builder.Services.AddTransient<IMailSender, MailSender>()
builder.Services.AddSingleton<IMailSender, MailSender>()
.Configure<EmailConfig>(builder.Configuration.GetSection(nameof(EmailConfig)));

builder.Services.Configure<RegistryConfig>(builder.Configuration.GetSection(nameof(RegistryConfig)));
Expand Down
13 changes: 9 additions & 4 deletions src/GZCTF/Services/Interface/IMailSender.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace GZCTF.Services.Interface;
using Microsoft.Extensions.Localization;

namespace GZCTF.Services.Interface;

public interface IMailSender
{
Expand All @@ -23,21 +25,24 @@ public interface IMailSender
/// <param name="userName">用户名</param>
/// <param name="email">用户新注册的Email</param>
/// <param name="confirmLink">确认链接</param>
public bool SendConfirmEmailUrl(string? userName, string? email, string? confirmLink);
/// <param name="localizer">本地化</param>
public bool SendConfirmEmailUrl(string? userName, string? email, string? confirmLink, IStringLocalizer<Program> localizer);

/// <summary>
/// 发送邮箱重置邮件
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="email">用户的电子邮件</param>
/// <param name="resetLink">重置链接</param>
public bool SendChangeEmailUrl(string? userName, string? email, string? resetLink);
/// <param name="localizer">本地化</param>
public bool SendChangeEmailUrl(string? userName, string? email, string? resetLink, IStringLocalizer<Program> localizer);

/// <summary>
/// 发送密码重置邮件
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="email">用户的电子邮件</param>
/// <param name="resetLink">重置链接</param>
public bool SendResetPasswordUrl(string? userName, string? email, string? resetLink);
/// <param name="localizer">本地化</param>
public bool SendResetPasswordUrl(string? userName, string? email, string? resetLink, IStringLocalizer<Program> localizer);
}
25 changes: 12 additions & 13 deletions src/GZCTF/Services/MailSender.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ public sealed class MailSender : IMailSender, IDisposable
private readonly EmailConfig? _options;
private readonly IOptionsSnapshot<GlobalConfig> _globalConfig;
private readonly ILogger<MailSender> _logger;
private readonly IStringLocalizer<Program> _localizer;
private readonly SmtpClient? _smtpClient;
private readonly CancellationTokenSource _cancellationTokenSource = new();
private readonly CancellationToken _cancellationToken;
Expand All @@ -26,12 +25,10 @@ public sealed class MailSender : IMailSender, IDisposable
public MailSender(
IOptions<EmailConfig> options,
IOptionsSnapshot<GlobalConfig> globalConfig,
ILogger<MailSender> logger,
IStringLocalizer<Program> localizer)
ILogger<MailSender> logger)
{
_globalConfig = globalConfig;
_logger = logger;
_localizer = localizer;
_options = options.Value;
_cancellationToken = _cancellationTokenSource.Token;

Expand Down Expand Up @@ -70,7 +67,7 @@ public async Task SendUrlAsync(MailContent content)
{
var template = _globalConfig.Value.EmailTemplate switch
{
GlobalConfig.DefaultEmailTemplate => _localizer[nameof(Resources.Program.MailSender_Template)],
GlobalConfig.DefaultEmailTemplate => content.Localizer[nameof(Resources.Program.MailSender_Template)],
_ => _globalConfig.Value.EmailTemplate
};

Expand Down Expand Up @@ -133,16 +130,16 @@ private async Task MailSenderWorker()
}
}

public bool SendConfirmEmailUrl(string? userName, string? email, string? confirmLink) =>
SendUrlIfPossible(userName, email, confirmLink, MailType.ConfirmEmail);
public bool SendConfirmEmailUrl(string? userName, string? email, string? confirmLink, IStringLocalizer<Program> localizer) =>
SendUrlIfPossible(userName, email, confirmLink, MailType.ConfirmEmail, localizer);

public bool SendChangeEmailUrl(string? userName, string? email, string? resetLink) =>
SendUrlIfPossible(userName, email, resetLink, MailType.ChangeEmail);
public bool SendChangeEmailUrl(string? userName, string? email, string? resetLink, IStringLocalizer<Program> localizer) =>
SendUrlIfPossible(userName, email, resetLink, MailType.ChangeEmail, localizer);

public bool SendResetPasswordUrl(string? userName, string? email, string? resetLink) =>
SendUrlIfPossible(userName, email, resetLink, MailType.ResetPassword);
public bool SendResetPasswordUrl(string? userName, string? email, string? resetLink, IStringLocalizer<Program> localizer) =>
SendUrlIfPossible(userName, email, resetLink, MailType.ResetPassword, localizer);

bool SendUrlIfPossible(string? userName, string? email, string? resetLink, MailType type)
bool SendUrlIfPossible(string? userName, string? email, string? resetLink, MailType type, IStringLocalizer<Program> localizer)
{
if (_smtpClient is null)
return false;
Expand All @@ -154,7 +151,7 @@ bool SendUrlIfPossible(string? userName, string? email, string? resetLink, MailT
return false;
}

var content = new MailContent(userName, email, resetLink, type, _localizer);
var content = new MailContent(userName, email, resetLink, type, localizer);

_mailQueue.Enqueue(content);
_resetEvent.Set();
Expand Down Expand Up @@ -248,4 +245,6 @@ public class MailContent(
/// 发信时间
/// </summary>
public string Time { get; set; } = DateTimeOffset.UtcNow.ToString("u");

public IStringLocalizer<Program> Localizer => localizer;
}

0 comments on commit 1332846

Please sign in to comment.