Мы внедряем пользовательскую почтовую программу, которая принимает SmtpClient
в качестве параметра, в зависимости от того, отлаживаем мы или нет, мы используем несколько иную реализацию SmtpClient
:
public static void AddSmtpMailer(this IServiceCollection services, IHostingEnvironment environment)
{
services.AddTransient<IMailer<BaseModel>>(x => new Mailer<BaseModel>(
environment.IsDevelopment()
? new SmtpClient
{
PickupDirectoryLocation = @"c:\temp",
DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory
}
: new SmtpClient
{
Host = "mail.someplace.com",
Port = 25,
EnableSsl = true,
Credentials = new NetworkCredential("user", "password")
},
environment.ContentRootPath, environment.IsLive()));
}
Однако мы находим что, когда мы пытаемся отправить несколько электронных писем в быстрой последовательности, мы получаем эту ошибку:
Поэтому мой вопрос таков: получаем ли мы каждый раз новый экземпляр SmtpClient
? Потому что это похоже на проблему, связанную с отправкой нескольких писем с одинаковым SmtpClient
. Создаем ли мы один экземпляр SmtpClient
при запуске и повторно используем его каждый раз?
Обратите внимание, мы также попробовали .AddScoped
, но обнаружили то же поведение.
фактический код, который использует SmtpClient:
public sealed class Mailer<T> :IDisposable, IMailer<T> where T : BaseModel
{
private readonly SmtpClient _smtpClient;
private readonly string _contentRootPath;
private readonly bool _forceSandbox;
public Mailer(SmtpClient smtpClient, string contentRootPath, bool isLive)
{
_smtpClient = smtpClient;
_contentRootPath = contentRootPath;
_forceSandbox = !isLive;
}
public async Task<bool> SendEmail(T model, string template)
{
if (template.Contains(".cshtml"))
template = template.Replace(".cshtml", "");
Email.DefaultSender = new SmtpSender(_smtpClient);
Email.DefaultRenderer = new RazorRenderer();
var email = Email
.From(model.From.Email, model.From.Name.NullOrEmptyTo(model.From.Email))
.To(EmailAddressHelper.GetAddressesFromModel(model.Recipients, _forceSandbox))
.Subject(model.Subject)
.UsingTemplateFromFile($@"{_contentRootPath}\views\{template}.cshtml", model)
.Attach(EmailAttachmentHelper.GetAttachmentsFromModel(model.Attachments));
if (model.CcRecipients != null && model.CcRecipients.Any())
email.CC(EmailAddressHelper.GetAddressesFromModel(model.CcRecipients, _forceSandbox));
if (model.BccRecipients != null && model.BccRecipients.Any())
email.BCC(EmailAddressHelper.GetAddressesFromModel(model.BccRecipients, _forceSandbox));
email.Data.Headers = EmailHeaderHelper.GetHeaders(model.UniqueID, model.Headers);
var result = await email.SendAsync();
return result.Successful;
}
public void Dispose()
{
_smtpClient?.Dispose();
}
}