#c# #asp.net-core #mailkit
Вопрос:
У меня проблема, связанная с почтовым набором. В среде разработки он работает правильно и правильно отправляет электронные письма. У меня есть бета — версия системы, размещенная на моем домене (где находится сервер электронной почты-kumminui.specodit.pl) Я создал производственную среду в kumminui.pl (таким образом, часть .specodit была удалена). Прямо сейчас электронные письма не работают.
Ошибка № 1 (с портом 587 и именем хоста, равным имени сервера и спискам запуска):
fail: API.Program[0]
Jul 27 10:08:08 specodit.pl dotnet-example[3445]: An error occurred during migration
Jul 27 10:08:08 specodit.pl dotnet-example[3445]: MailKit.Net.Smtp.SmtpCommandException: 146.59.19.44 is _my_ address
Jul 27 10:08:08 specodit.pl dotnet-example[3445]: at MailKit.Net.Smtp.SmtpClient.OnSenderNotAccepted(MimeMessage message, MailboxAddress mailbox, SmtpResponse response)
Jul 27 10:08:08 specodit.pl dotnet-example[3445]: at MailKit.Net.Smtp.SmtpClient.ProcessMailFromResponse(MimeMessage message, MailboxAddress mailbox, SmtpResponse response)
Jul 27 10:08:08 specodit.pl dotnet-example[3445]: at MailKit.Net.Smtp.SmtpClient.FlushCommandQueueAsync(MimeMessage message, MailboxAddress sender, IList`1 recipients, Boolean doAsync, Cancell
Jul 27 10:08:08 specodit.pl dotnet-example[3445]: at MailKit.Net.Smtp.SmtpClient.SendAsync(FormatOptions options, MimeMessage message, MailboxAddress sender, IList`1 recipients, Boolean doAsyn
Jul 27 10:08:08 specodit.pl dotnet-example[3445]: at StableManagement.Services.MailService.SendMessage(Notification notification) in /home/admin/web/kumminui.pl/App/StableManagement/Services/M
Jul 27 10:08:08 specodit.pl dotnet-example[3445]: at StableManagement.Data.ScheduleTask.ScheduledItemChangeState(DateTime scheduleFor) in /home/admin/web/kumminui.pl/App/StableManagement/Data/
Jul 27 10:08:08 specodit.pl dotnet-example[3445]: at StableManagement.Data.ScheduleTask.RecoverScheduledTasks() in /home/admin/web/kumminui.pl/App/StableManagement/Data/ScheduleTask.cs:line 48
Jul 27 10:08:08 specodit.pl dotnet-example[3445]: at API.Program.Main(String[] args) in /home/admin/web/kumminui.pl/App/StableManagement/Program.cs:line 33
Я отправляю электронное письмо с помощью .NET Core и MailKit:
private async Task<MimeMessage> PrepareMessage(AppUser user, string subject, BodyBuilder body)
{
var emailSMTPUserName = (await _settingsRepository.Get("emailSMTPUserName"))?.Value ?? "admin@kumminui.pl";
MimeMessage message = new MimeMessage();
MailboxAddress from = new MailboxAddress("Kumminui - Administracja", emailSMTPUserName);
message.From.Add(from);
MailboxAddress to = new MailboxAddress(user.FirstName " " user.LastName, user.Email);
message.To.Add(to);
message.Subject = subject;
var path = "./Data/htmls/emails/assets/logo.png";
var image = body.LinkedResources.Add(path);
image.ContentId = MimeUtils.GenerateMessageId();
image.ContentDisposition = new ContentDisposition() { Disposition = ContentDisposition.Inline };
body.HtmlBody = body.HtmlBody.Replace("./assets/logo.png", string.Format("cid:{0}", image.ContentId));
message.Body = body.ToMessageBody();
return message;
}
И Отправить:
public async Task SendMessage(Notification notification)
{
MimeMessage message;
using (var memory = new MemoryStream(notification.Message, false))
{
message = MimeMessage.Load(memory);
}
var emailSMTPHost = (await _settingsRepository.Get("emailSMTPHost"))?.Value;
var emailSMTPPort = (await _settingsRepository.Get("emailSMTPPort"))?.Value;
var emailSMTPUserName = (await _settingsRepository.Get("emailSMTPUserName"))?.Value;
var emailSMTPPassword = (await _settingsRepository.Get("emailSMTPPassword"))?.Value;
if (emailSMTPHost is not null
amp;amp; emailSMTPPort is not null
amp;amp; emailSMTPUserName is not null
amp;amp; emailSMTPPassword is not null)
{
SmtpClient client = new SmtpClient();
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
await client.ConnectAsync(emailSMTPHost, Int32.Parse(emailSMTPPort), SecureSocketOptions.Auto);
await client.AuthenticateAsync(emailSMTPUserName, emailSMTPPassword);
Console.WriteLine(client.IsAuthenticated);
await client.SendAsync(message);
await client.DisconnectAsync(true);
client.Dispose();
}
}
Сообщение загружается из базы данных и отправляется пользователю в определенный момент. В чем может быть проблема с производственной средой? Эти приложения работают на одном компьютере, меняется только домен.
Журнал SMTP:
Connected to smtps://specodit.pl:465/
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: S: 220 specodit.pl ESMTP Exim 4.90_1 Ubuntu Tue, 27 Jul 2021 10:40:18 0000
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: C: EHLO [146.59.19.44]
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: S: 250-specodit.pl Hello [146.59.19.44] [146.59.19.44]
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: S: 250-SIZE 52428800
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: S: 250-8BITMIME
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: S: 250-PIPELINING
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: S: 250-AUTH PLAIN LOGIN
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: S: 250-CHUNKING
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: S: 250 HELP
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: C: AUTH PLAIN AGFkbWluQGt1bW1pbnVpLnBsAGMxOU91bkNsN08=
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: S: 235 Authentication succeeded
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: C: MAIL FROM:<admin@kumminui.pl> SIZE=51244 BODY=8BITMIME
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: C: RCPT TO:<biuro@specodit.pl>
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: S: 550 146.59.19.44 is _my_ address
Jul 27 10:40:18 specodit.pl dotnet-example[9875]: C: RSET
Ответ №1:
Ошибка, возвращаемая как часть RCPT TO
команды, выглядит странно, учитывая, как сообщение об ошибке, по-видимому, относится к EHLO
команде:
C: EHLO [146.59.19.44]
SMTP-сервер отклоняет вас, потому что IP-адрес, на который претендует клиент, является тем же IP-адресом, что и сервер.
Вы можете переопределить это, установив client.LocalDomain
свойство, которое будет использоваться в EHLO
команде вместо автоматически обнаруженного IP-адреса. Вы можете попробовать установить для этого значение (например, «localhost»?) и посмотреть, решит ли это проблему.