Не удается отправить электронные письма с использованием класса SmtpClient по умолчанию [duplicate]

У меня была точно такая же проблема, и, наконец, она была решена.

Я поместил все зависимые DLL в ту же папку, где был сохранен mylib.dll, и убедитесь, что JAVA Compiler смог его найти (если в пути компиляции нет mylib.dll, будет ошибка сообщая об этом во время компиляции). Важно отметить, что вы должны убедиться, что все зависимые библиотеки имеют одну и ту же версию с mylib.dll, например, если ваша версия mylib.dll является версией, тогда вы также должны поместить в нее версию всех зависимых библиотек ,

Надеюсь, это поможет другим, кто столкнулся с одной и той же проблемой.

80
задан Jake C 26 November 2013 в 23:47
поделиться

11 ответов

EDIT: Super Redux Version

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


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

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

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

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

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

139
ответ дан Jake C 20 August 2018 в 19:44
поделиться
  • 1
    как я могу узнать, имеют ли сервер, с которым я подключаюсь, те же проблемы? Я пытаюсь использовать SmtpClient с yahoo и / или gmail и получить описанную ошибку. Когда я пытаюсь использовать сервер обмена в 2013 году, мой код работает нормально. – raider33 23 March 2014 в 15:52
  • 2
    Самый простой способ тестирования - попробовать использовать порт 587, а не 465. Хотя некоторые SMTP-серверы поддерживают TLS на 465 (а иногда и даже 25), для поддержки TLS требуется только порт 587. В дополнение к этому использование порта 465 устарело с 1998 года ( ru.wikipedia.org/wiki/SMTPS ), хотя на практике многие серверы имеют возможность для старых клиентов. – Jake C 24 March 2014 в 17:20
  • 3
    Да, переход на 587 сделал трюк. Спасибо, что указал мне в правильном направлении. – raider33 24 March 2014 в 20:49
  • 4
    587 работает, хотя smtp.att.yahaoo.com говорит, что использует 465. Спасибо человеку. – Sam 20 August 2014 в 06:33
  • 5
    Для фактического решения см. stackoverflow.com/a/1014876/247702 при использовании (устаревшего) System.Web.Mail, который поддерживает неявный SSL. – Stijn 26 April 2015 в 15:49

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

3
ответ дан 1234varun 20 August 2018 в 19:44
поделиться
  • 1
    Это стандартная библиотека .NET SmtpClient, она поддерживает encrytpion, сервер требует шифрования, и я установил client.EnableSssl = true;. Хотя я думаю, что буду продолжать это немного дальше с Wireshark. – Jake C 27 November 2013 в 01:41

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

12
ответ дан ADM-IT 20 August 2018 в 19:44
поделиться
  • 1
    Я не уверен, что произошло, но это работает с gmail smtp. можете ли вы объяснить, почему это работает? – Crismogram 31 March 2016 в 15:53
  • 2
    – Alexis Villar 31 October 2018 в 03:55

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

bin-> projectname.dll 

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

1
ответ дан Ajay Kumar 20 August 2018 в 19:44
поделиться
  • 1
    Удивительно, но это сработало для меня! Разрешить включение небезопасных приложений и установить порт уже на 587. – TechyGypo 14 September 2017 в 17:43
  • 2
    Спасибо, только что понял, что я был не единственным с этой проблемой. рад помочь. – Ajay Kumar 15 September 2017 в 13:52

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

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

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

0
ответ дан Andy 20 August 2018 в 19:44
поделиться

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

7
ответ дан Bill Mahoney 20 August 2018 в 19:44
поделиться
  • 1
    Спасибо, Билл. Это все еще работает с моей стандартной учетной записью gmail. Если вы не используете «менее безопасные приложения», вы должны использовать аутентификацию 2-части OAuth2. Это нецелесообразно, когда вы просто хотите отправить подтверждение по электронной почте с веб-сайта. – Dan Randolph 6 June 2017 в 15:22
  • 2
    Где «менее безопасные приложения», settting. Я ищу свою учетную запись gmail. – Sam 28 February 2018 в 16:52
  • 3
    Я нашел «Менее безопасные приложения». настройка - это не в настройках Gmail, а в настройках учетной записи Google: Моя учетная запись & gt; Вход и безопасность myaccount.google.com/… – HFloyd 14 March 2018 в 19:00

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

2
ответ дан flickerfly 20 August 2018 в 19:44
поделиться

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

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

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

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

11
ответ дан nologo 20 August 2018 в 19:44
поделиться
  • 1
    Это может показаться глупым, но что-то еще, что вы можете проверить, - это правильный пароль для настройки SMTP SendGrid. Первоначально наша установка работала, и однажды мы начали получать сообщение об исключении OP. Поиски в WWW в основном указывали на другие конфигурации SMTP-сервера, когда, в конце концов, он оказался неверным. Кто-то из команды изменил пароль в файле конфигурации на вариант, где первая буква была не капитализирована. – methon.dagger 25 February 2017 в 08:40
  • 2
    В моем случае имя пользователя было неправильным и имело опечатку. Но неправильный пароль также может дать «Невозможно прочитать данные из транспортного соединения: net_io_connection закрыто». ошибка. Поэтому проверьте как имя пользователя, так и пароль. А для пользователей Azure имя пользователя имеет форму «azure_guid-withoutdashes@azure.com" (например: azure_e9e062db4bfd491296bec77bcff49ed9@azure.com) – Raj Rao 26 June 2018 в 15:25
//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;
0
ответ дан SelakaN 20 August 2018 в 19:44
поделиться

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

 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;
            }
        }
    }
0
ответ дан yasmuru 20 August 2018 в 19:44
поделиться
  • 1
    SmtpClient также является одноразовым, поэтому его следует обернуть в блок using – jocull 10 April 2014 в 19:14
0
ответ дан Hisham shahid 31 October 2018 в 15:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: