Korzystam z SmtpClient
biblioteki do wysyłania e-maili za pomocą:
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("from@hostname", "to@hostname", "Subject", "Body");
Kod działa dobrze w moim środowisku testowym, ale kiedy używam produkcyjnych serwerów SMTP, kod kończy się niepowodzeniem z komunikatem SmtpException
„Niepowodzenie wysyłania poczty”. z wewnętrznym IOException
„Nie można odczytać danych z połączenia transportowego: net_io_connectionclosed”.
Potwierdziłem, że zapory nie stanowią problemu. Port otwiera się dobrze między klientem a serwerem. Nie jestem pewien, co jeszcze może spowodować ten błąd.
Dla każdego, kto natknie się na ten post w poszukiwaniu rozwiązania i skonfigurowałeś SMTP sendgrid za pośrednictwem platformy Azure.
Nazwa użytkownika nie jest nazwą użytkownika skonfigurowaną podczas tworzenia obiektu sendgrid w lazurowym. Aby znaleźć swoją nazwę użytkownika;
Mam nadzieję że to pomoże!
źródło
Zmień port z 465 na 587 i będzie działać.
źródło
Może być też konieczna zmiana ustawienia „mniej bezpieczne aplikacje” na koncie Gmail. EnableSsl, użyj portu 587 i włącz „mniej bezpieczne aplikacje”. Jeśli wyszukujesz w Google mniej bezpieczną część dotyczącą aplikacji, są strony pomocy Google, które prowadzą bezpośrednio do strony Twojego konta. To był mój problem, ale dzięki wszystkim powyższym odpowiedziom wszystko działa.
źródło
Wypróbowałem wszystkie powyższe odpowiedzi, ale nadal otrzymuję ten błąd na koncie Office 365. Wydaje się, że kod działa dobrze z kontem Google i smtp.gmail.com, zezwalając na mniej bezpieczne aplikacje.
Jakieś inne sugestie, które mógłbym wypróbować?
Oto kod, którego używam
AKTUALIZACJA I JAK TO ROZWIĄZAŁEM:
Rozwiązany problem poprzez zmianę klienta Smtp na Mailkit. Klient System.Net.Mail Smtp nie jest obecnie zalecany do używania przez firmę Microsoft ze względu na problemy z bezpieczeństwem i zamiast tego należy używać MailKit. Korzystanie z Mailkit dało mi wyraźniejsze komunikaty o błędach, które mogłem zrozumieć, znajdując główną przyczynę problemu (problem z licencją). Możesz pobrać Mailkit, pobierając go jako pakiet Nuget .
Przeczytaj dokumentację dotyczącą klienta Smtp, aby uzyskać więcej informacji: https://docs.microsoft.com/es-es/dotnet/api/system.net.mail.smtpclient?redirectedfrom=MSDN&view=netframework-4.7.2
Oto jak zaimplementowałem SmtpClient z MailKit
źródło
Czy Twoja biblioteka SMTP obsługuje szyfrowane połączenie? Serwer poczty może oczekiwać bezpiecznego połączenia TLS i dlatego może je zamknąć w przypadku braku uzgadniania TLS
źródło
SmtpClient
biblioteka .NET , obsługuje szyfrowanie, serwer wymaga szyfrowania, a ja ustawiłemclient.EnableSssl = true;
. Chociaż myślę, że zamierzam to trochę dalej przekonywać w przypadku Wiresharka.Jeśli używasz serwera SMTP w tym samym urządzeniu i SMTP jest powiązany z adresem IP zamiast „Dowolne przypisane”, może się nie powieść, ponieważ próbuje użyć adresu IP (np. 127.0.0.1), którego SMTP obecnie nie działa na.
źródło
Aby podnieść to, o czym żartobliwie wspomniał w komentarzu, robiłem wszystko, o czym wspomniano w tym wątku i wykreślałem ... ponieważ mój był w pętli do powtarzania; po pierwszym przejściu przez pętlę czasami kończyło się niepowodzeniem. Zawsze pracowałem za pierwszym razem przez pętlę.
Dla jasności: pętla obejmuje utworzenie SmtpClient, a następnie wykonanie .Send z odpowiednimi danymi. SmtpClient został utworzony wewnątrz bloku try / catch, aby wychwycić błędy i upewnić się, że obiekt został zniszczony przed końcem pętli.
W moim przypadku rozwiązaniem było upewnienie się, że SmtpClient został usunięty za każdym razem w pętli (za pomocą instrukcji using () lub ręcznie). Nawet jeśli obiekt SmtpClient jest niejawnie niszczony w pętli, wydaje się, że .NET pozostawia rzeczy leżące w pobliżu, aby spowodować konflikt przy następnej próbie.
źródło
Zmień numer portu na 587 z 465
źródło
usuwanie
wydawało się, że rozwiązuje to za mnie.
źródło
W moim przypadku klient zapomniał dodać nowy adres IP w swoich ustawieniach SMTP. Otwórz IIS 6.0 na serwerze, który konfiguruje smtp, kliknij prawym przyciskiem myszy serwer wirtualny Smtp, wybierz Właściwości, zakładka Dostęp, kliknij Połączenia, dodaj adres IP nowego serwera. Następnie kliknij Relay, dodaj także adres IP nowego serwera. To rozwiązało mój problem.
źródło
Spróbuj tego: Oto kod, którego używam do wysyłania e-maili do wielu użytkowników.
źródło
SmtpClient
jest również jednorazowegousing
W przypadku, gdy wszystkie powyższe rozwiązania nie działają, spróbuj zaktualizować następujący plik na swoim serwerze (przez publikację, mam na myśli, a kompilacja wcześniejsza byłaby pomocna).
Po aktualizacji zobaczysz ten błąd. jak rozwiązałem za pomocą tego rozwiązania.
źródło
W przypadku programu Outlook użyj następującego ustawienia, które nie powoduje błędu
Nazwa serwera SMTP smtp-mail.outlook.com
Port SMTP 587
źródło
Ten błąd jest bardzo ogólny. Może być spowodowany wieloma przyczynami, na przykład nieprawidłowym serwerem poczty. Niektóre firmy hostingowe używają formatu mail.domainname. Jeśli użyjesz tylko nazwy domeny, to nie zadziała. w razie potrzeby sprawdź dane logowania nazwa hosta nazwa użytkownika hasło Skontaktuj się z firmą hostingową.
źródło
W moim przypadku adres IP serwera WWW został zablokowany na serwerze poczty, musi zostać odblokowany przez firmę hostingową i umieszczony na białej liście. Użyj również portu 587.
źródło
Jeśli Twoim serwerem pocztowym jest Gmail (smtp.google.com), ten błąd pojawi się po osiągnięciu limitu wiadomości. Gmail umożliwia wysyłanie przez SMTP tylko do 2000 wiadomości w ciągu 24 godzin.
źródło
Napotkałem to podczas korzystania z smtp.office365.com, używając portu 587 z SSL. Mogłem zalogować się na konto za pomocą portalu portal.office.com i potwierdzić, że konto ma licencję. Ale kiedy uruchomiłem kod, aby wysłać e-maile, ciągle otrzymywałem błąd net_io_connectionclosed.
Zajęło mi trochę czasu, zanim to rozgryzłem, ale administrator Exchange znalazł winowajcę. Używamy O365, ale serwer Exchange był w środowisku hybrydowym. Chociaż konto, którego próbowaliśmy użyć, było zsynchronizowane z usługą Azure AD i miało ważną licencję O365, z jakiegoś powodu skrzynka pocztowa nadal znajdowała się na hybrydowym serwerze Exchange, a nie na serwerze Exchange online. Po tym, jak administrator giełdy użył polecenia „Move-Mailbox”, aby przenieść skrzynkę pocztową z hybrydowego serwera wymiany do O365, mogliśmy użyć kodu do wysyłania e-maili za pomocą o365.
źródło
Przygotowanie: 1. HostA to wirtualny serwer SMTP z domyślnym portem 25 2. HostB to stacja robocza, na której wysyłam pocztę za pomocą SmtpClient i symuluję niestabilną sieć używam niezdarnie
Przypadek 1 podany, jeśli HostB to 2008R2, kiedy wysyłam e-mail. Następnie pojawia się ten problem.
Przypadek 2 podany Jeśli HostB to wersja 2012 lub nowsza Kiedy wysyłam e-mail. Następnie poczta została wysłana.
Wniosek: ta główna przyczyna jest związana z systemem Windows Server 2008R2.
źródło