#c# #email #model-view-controller #office365
#c# #Адрес электронной почты #модель-представление-контроллер #office365
Вопрос:
Попытка отправить электронное письмо через MVC 5 C #. Этот вновь созданный адрес электронной почты находится на сервере Office 365. Пробовал множество онлайн-решений, но безрезультатно. Я получаю следующее сообщение об ошибке: SMTP-серверу требуется безопасное соединение или клиент не прошел проверку подлинности. Ответ сервера был: 5.7.57 SMTP; Клиент не прошел проверку подлинности для отправки анонимной почты во время отправки почты ИЗ [LO3P265CA0018.GBRP265.PROD.OUTLOOK.COM]’. Мой код выглядит следующим образом:
public void ConcernConfirmEmail(Appointments a, EmailConfig ec)
{
Dictionary<string, string> tokens = new Dictionary<string, string>();
tokens.Add("Name", a.sirenDetail.FirstName);
tokens.Add("Time", a.start.ToString("HH:mm"));
tokens.Add("Date", a.start.ToString("dd/MM/yyyy"));
tokens.Add("Location", a.site.SiteDescription);
using (SmtpClient client = new SmtpClient()
{
Host = "smtp.office365.com",
Port = 587,
UseDefaultCredentials = false,
DeliveryMethod = SmtpDeliveryMethod.Network,
Credentials = new NetworkCredential(ec.EmailUser, ec.EmailPassword),
TargetName = "STARTTLS/smtp.office365.com",
EnableSsl = true
})
{
MailMessage message = new MailMessage()
{
From = new MailAddress("emailadress@myorg.net"),
Subject = "Subject",
Sender = new MailAddress("emailadress214@myorg.net", "password"),
Body = PopulateTemplate(tokens, GetTemplate("ConfirmTemplate.html")),
IsBodyHtml = true,
BodyEncoding = System.Text.Encoding.UTF8,
SubjectEncoding = System.Text.Encoding.UTF8,
};
message.To.Add(a.sirenDetail.EmailAddress.ToString());
client.Send(message);
}
}
Ответ №1:
Согласно официальной документации Microsoft, SmtpClass уже давно устарел, Microsoft рекомендует разработчикам использовать новые реализации Smtp с открытым исходным кодом, такие как MailKit.
При использовании MailKit с проверкой подлинности по имени пользователя и паролю необходимо настроить механизм проверки подлинности на использование NTLM.
Вот рабочий пример:
public async Task Send(string emailTo, string subject, MimeMessage mimeMessage, MessagePriority messagePriority = MessagePriority.Urgent)
{
MimeMessage mailMessage = mimeMessage;
mailMessage.Subject = subject;
mailMessage.Priority = messagePriority;
if (emailTo.Contains(';'))
{
foreach (var address in emailTo.Split(';'))
{
mailMessage.To.Add(new MailboxAddress("", address));
}
}
else
{
mailMessage.To.Add(new MailboxAddress("", emailTo));
}
mailMessage.From.Add(new MailboxAddress("Sender", _smtpCredentials.SenderAddress));
using var smtpClient = new SmtpClient
{
SslProtocols = SslProtocols.Tls,
CheckCertificateRevocation = false,
ServerCertificateValidationCallback = (s, c, h, e) => true,
};
await smtpClient.ConnectAsync(_smtpCredentials.Server, _smtpCredentials.Port, SecureSocketOptions.StartTlsWhenAvailable);
await smtpClient.AuthenticateAsync(new SaslMechanismNtlm(new NetworkCredential(_smtpCredentials.User, _smtpCredentials.Password)));
try
{
await smtpClient.SendAsync(mailMessage);
}
catch (Exception ex)
{
}
finally
{
if (smtpClient.IsConnected) await smtpClient.DisconnectAsync(true);
}
}
Самая важная строка здесь
await smtpClient.AuthenticateAsync(new SaslMechanismNtlm(new NetworkCredential(_smtpCredentials.User, _smtpCredentials.Password)));
Это настройка NTLM в качестве механизма аутентификации для использования клиентом.
Но
Если вы не можете изменить библиотеку Smtp прямо сейчас, вы можете попробовать изменить свой код, чтобы он выглядел так, как imcurrent, использующийся в старых службах и работающий нормально:
using (var smtpClient = new SmtpClient(smtpServer)
{
UseDefaultCredentials = false,
DeliveryMethod = SmtpDeliveryMethod.Network,
Credentials = new NetworkCredential(user, password),
EnableSsl = false,
Port = 587
})
Убедитесь, что изменение включено только для параметра EnableSsl, имеющего значение false, и не требуется для установки свойства TargetName.
Надеюсь, это поможет
Комментарии:
1. Я также должен был убедиться, что аутентификация SMTP включена на уровне организации. Это было для конкретного почтового ящика, но этого, похоже, недостаточно. Как включить аутентификацию SMTP глобально для Office365: docs.microsoft.com/en-us/exchange /. …