SmtpException: невозможно прочитать данные из транспортного соединения: net_io_connectionclosed

Я использую библиотеку SmtpClient для отправки электронных писем, используя следующее:

SmtpClient client = new SmtpClient();
client.Host = "hostname";
client.Port = 465;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.EnableSsl = true;
client.Credentials = new NetworkCredential("User", "Pass);
client.Send("[email protected]", "[email protected]", "Subject", "Body");

Код отлично работает в моей тестовой среде, но когда я использую серверы SMTP производства, код выходит из строя с SmtpException "Отказ отправки почты". с внутренней IOException "Невозможно прочитать данные из транспортного соединения: net_io_connectionclosed".

Я подтвердил, что брандмауэры не являются проблемой. Порт открывается очень хорошо между клиентом и сервером. Я не уверен, что еще может сделать эту ошибку.

Ответ 1

EDIT: версия Super Redux

Попробуйте порт 587 вместо 465. Порт 465 технически устарел.


После кучи обнюхивания пакетов я понял это. Во-первых, здесь короткий ответ:

Только .NET SmtpClient поддерживает шифрование через STARTTLS. Если установлен флаг EnableSsl, сервер должен ответить на EHLO на STARTTLS, иначе он выдает исключение. Подробнее см. Документацию MSDN.

Во-вторых, быстрый урок истории SMTP для тех, кто наткнется на эту проблему в будущем:

В тот же день, когда службам также предлагалось шифрование, им был назначен другой номер порта, и на этом номере порта они немедленно инициировали соединение SSL. Со временем они поняли, что глупо тратить два номера портов на одну услугу, и они разработали способ предоставления сервисов для обеспечения открытого текста и шифрования в том же порту с использованием STARTTLS. Коммуникация начнет использовать открытый текст, а затем используйте команду STARTTLS для обновления до зашифрованного соединения. STARTTLS стал стандартом для шифрования SMTP. К сожалению, поскольку это всегда происходит при внедрении нового стандарта, существует мешанина совместимости со всеми клиентами и серверами.

В моем случае мой пользователь пытался подключить программное обеспечение к серверу, который заставлял немедленное соединение SSL, что является унаследованным методом, который не поддерживается Microsoft в .NET.

Ответ 2

Измените порт с 465 до 587, и он будет работать.

Ответ 3

Для тех, кто наткнулся на это сообщение, ища решение, и вы настроили SMTP sendgrid через Azure.

Имя пользователя не является именем пользователя, которое вы создали, когда вы создали объект sendgrid в лазурном режиме. Чтобы найти свое имя пользователя;

  • Нажмите на свой объект sendgrid в лазури и нажмите "Управление". Вы будете перенаправлены на сайт SendGrid.
  • Подтвердите свою электронную почту, а затем скопируйте имя пользователя, отображаемое там. Это автоматически сгенерированное имя пользователя.
  • Добавьте имя пользователя из SendGrid в свои настройки SMTP в файле web.config.

Надеюсь это поможет!

Ответ 4

Вам также может потребоваться изменить настройки "менее безопасных приложений" в вашей учетной записи Gmail. EnableSsl, используйте порт 587 и включите "менее безопасные приложения". Если вы используете Google менее защищенную часть приложений, есть страницы справки Google, которые свяжут вас прямо со страницей вашей учетной записи. Это была моя проблема, но теперь все работает, благодаря всем ответам выше.

Ответ 5

Я попробовал все ответы выше, но все еще получаю эту ошибку с учетной записью Office 365. Код, кажется, хорошо работает с учетной записью Google и smtp.gmail.com, когда разрешены менее безопасные приложения.

Любые другие предложения, которые я мог бы попробовать?

Вот код, который я использую

int port = 587;
string host = "smtp.office365.com";
string username = "[email protected]";
string password = "password";
string mailFrom = "[email protected]";
string mailTo = "[email protected]";
string mailTitle = "Testtitle";
string mailMessage = "Testmessage";

using (SmtpClient client = new SmtpClient())
{
    MailAddress from = new MailAddress(mailFrom);
    MailMessage message = new MailMessage
    {
        From = from
    };
    message.To.Add(mailTo);
    message.Subject = mailTitle;
    message.Body = mailMessage;
    message.IsBodyHtml = true;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.UseDefaultCredentials = false;
    client.Host = host;
    client.Port = port;
    client.EnableSsl = true;
    client.Credentials = new NetworkCredential
    {
        UserName = username,
        Password = password
    }; 
    client.Send(message);
}

ОБНОВЛЕНИЕ И КАК Я РЕШЕН ЭТО:

Решил проблему, сменив Smtp Client на Mailkit. SMTP-клиент System.Net.Mail теперь не рекомендуется использовать Microsoft из-за проблем с безопасностью, и вы должны вместо этого использовать MailKit. Использование Mailkit дало мне более четкие сообщения об ошибках, которые я мог понять, чтобы найти основную причину проблемы (проблема лицензии). Вы можете получить Mailkit, загрузив его как пакет Nuget.

Прочтите документацию о клиенте Smtp для получения дополнительной информации: https://docs.microsoft.com/es-es/dotnet/api/system.net.mail.smtpclient?redirectedfrom=MSDN&view=netframework-4.7.2

Вот как я реализовал SmtpClient с помощью MailKit

        int port = 587;
        string host = "smtp.office365.com";
        string username = "[email protected]";
        string password = "password";
        string mailFrom = "[email protected]";
        string mailTo = "[email protected]";
        string mailTitle = "Testtitle";
        string mailMessage = "Testmessage";

        var message = new MimeMessage();
        message.From.Add(new MailboxAddress(mailFrom));
        message.To.Add(new MailboxAddress(mailTo));
        message.Subject = mailTitle;
        message.Body = new TextPart("plain") { Text = mailMessage };

        using (var client = new SmtpClient())
        {
            client.Connect(host , port, SecureSocketOptions.StartTls);
            client.Authenticate(username, password);

            client.Send(message);
            client.Disconnect(true);
        }

Ответ 6

Поддерживает ли ваша библиотека SMTP зашифрованное соединение? Почтовый сервер может ожидать безопасного соединения TLS и, следовательно, закрывает соединение в отсутствие подтверждения связи TLS

Ответ 7

Если вы используете SMTP-сервер в том же поле, и ваш SMTP привязан к IP-адресу вместо "Any Assigned", он может выйти из строя, потому что он пытается использовать IP-адрес (например, 127.0.0.1), который SMTP в настоящее время не работает.

Ответ 8

В случае, если все вышеперечисленные решения не сработают для вас, попробуйте обновить следующий файл на вашем сервере (по публикации я имею в виду, и сборка до этого будет полезна).

bin-> projectname.dll 

После обновления вы увидите эту ошибку. как я решил с этим решением.

Ответ 9

Чтобы поднять то, что было упомянуто в комментарии, я делал все, что упоминалось в этой теме, и вычеркиваю... потому что моя была в петле, которую можно было пробегать снова и снова; после первого раза через цикл, это иногда терпит неудачу. Всегда работал в первый раз через цикл.

Чтобы быть ясным: цикл включает в себя создание SmtpClient, а затем делает.Отправить с нужными данными. SmtpClient был создан внутри блока try/catch, чтобы поймать ошибки и убедиться, что объект был уничтожен до нижней части цикла.

В моем случае решение заключалось в том, чтобы убедиться, что SmtpClient был удален после каждого раза в цикле (либо с помощью использования(), либо путем ручного управления). Даже если объект SmtpClient неявно уничтожается в цикле,.NET, похоже, оставляет материал, находящийся в конфликте со следующей попыткой.

Ответ 10

Попробуйте следующее: Вот код, который я использую для отправки писем нескольким пользователям.

 public string gmail_send()
    {
        using (MailMessage mailMessage =
        new MailMessage(new MailAddress(toemail),
    new MailAddress(toemail)))
        {
            mailMessage.Body = body;
            mailMessage.Subject = subject;
            try
            {
                SmtpClient SmtpServer = new SmtpClient();
                SmtpServer.Credentials =
                    new System.Net.NetworkCredential(email, password);
                SmtpServer.Port = 587;
                SmtpServer.Host = "smtp.gmail.com";
                SmtpServer.EnableSsl = true;
                mail = new MailMessage();
                String[] addr = toemail.Split(','); // toemail is a string which contains many email address separated by comma
                mail.From = new MailAddress(email);
                Byte i;
                for (i = 0; i < addr.Length; i++)
                    mail.To.Add(addr[i]);
                mail.Subject = subject;
                mail.Body = body;
                mail.IsBodyHtml = true;
                mail.DeliveryNotificationOptions =
                    DeliveryNotificationOptions.OnFailure;
                //   mail.ReplyTo = new MailAddress(toemail);
                mail.ReplyToList.Add(toemail);
                SmtpServer.Send(mail);
                return "Mail Sent";
            }
            catch (Exception ex)
            {
                string exp = ex.ToString();
                return "Mail Not Sent ... and ther error is " + exp;
            }
        }
    }

Ответ 11

//Try this out... Port 465 is not there anymore for use
     string emailFrom = "sender email here";
    string recieverEmail ="reciever email here";
            string subject = "subject here";
            string body = "message here";
            MailMessage maile = new MailMessage(emailFrom, recieverEmail, subject,body);
            SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
            client.Credentials = new System.Net.NetworkCredential("senders gmail account username here", "senders gmail account password here");
            client.EnableSsl = true;

Ответ 12

Для Outlook используйте следующую настройку, которая не дает мне ошибку

Имя SMTP-сервера smtp-mail.outlook.com

Порт SMTP 587

Ответ 13

Эта ошибка очень общая. Это может быть вызвано многими причинами, такими как почтовый сервер. Некоторые хостинговые компании используют формат mail.domainname. Если вы просто используете доменное имя, это не сработает. проверить учетные данные имя хоста имя пользователя пароль при необходимости Проверить с хостинговой компанией.

<smtp from="[email protected]">
        <!-- Uncomment to specify SMTP settings -->
        <network host="domain.com" port="25" password="[email protected]" userName="[email protected]"/>
      </smtp>
    </mailSettings>

Ответ 14

В моем случае клиент забыл добавить новый IP-адрес в свои настройки SMTP. Откройте IIS 6.0 на сервере, который настраивает smtp, щелкните правой кнопкой мыши виртуальный сервер Smtp, выберите "Свойства", вкладку "Доступ", нажмите "Подключения", добавьте IP-адрес нового сервера. Затем нажмите Relay, также добавьте IP-адрес нового сервера. Это решило мою проблему.

Ответ 15

Измените номер порта на 587 с 465

Ответ 16

Подготовьте: 1. HostA - виртуальный SMTP-сервер с портом 25 по умолчанию. 2. HostB - это рабочая станция, на которой я отправляю почту с SmtpClient и имитирую нестабильную сеть. Я использую неуклюжие

Случай 1, если HostB является 2008R2 Когда я отправляю электронное письмо. Затем эта проблема возникает.

Случай 2, если HostB - версия 2012 года или более поздняя. Когда я отправляю электронное письмо. Затем была отправлена почта.

Вывод: эта основная причина связана с Windows Server 2008R2.