SMTPEXCeption: Kan geen gegevens uit de transportverbinding lezen: Net_io_ConnectionClosed

Ik gebruik de SmtpClientbibliotheek om e-mails te verzenden met het volgende:

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");

De code werkt prima in mijn testomgeving, maar wanneer ik de productie SMTP-servers gebruik, mislukt de code met een SmtpException“Fout Mail.” Met een innerlijke IOException“Kan geen gegevens uit de transportverbinding lezen: Net_io_ConnectionClosed”.

Ik heb bevestigd dat firewalls geen probleem zijn. De poort opent prima tussen de klant en de server. Ik weet niet zeker wat anders deze fout kan gooien.


1, Autoriteit 100%

bewerken: Super redux-versie

Probeer poort 587 in plaats van 465. Poort 465 wordt technisch verouderd.


Na een stel pakket snuffelen was ik het uit. Ten eerste is dit het korte antwoord:

De .NET SmtpClientAlleen ondersteunt codering via starttls. Als de EnableSslVlag is ingesteld, moet de server reageren op EHLO met een starttls, anders gooit deze een uitzondering. Zie de MSDN documentatie voor meer details.

Ten tweede, een snelle SMTP-geschiedenisles voor degenen die in de toekomst op dit probleem struikelen:

Vroeger, toen services ook codering wilden aanbieden, kregen ze een ander poortnummer toegewezen en op dat poortnummer startten ze onmiddellijk een SSL-verbinding. Naarmate de tijd verstreek, realiseerden ze zich dat het dwaas was om twee poortnummers voor één service te verspillen en ze bedachten een manier voor services om platte tekst en codering op dezelfde poort toe te staan met behulp van STARTTLS. Communicatie zou beginnen met het gebruik van platte tekst en vervolgens de opdracht STARTTLS gebruiken om te upgraden naar een versleutelde verbinding. STARTTLS werd de standaard voor SMTP-codering. Helaas, zoals altijd gebeurt wanneer een nieuwe standaard wordt geïmplementeerd, is er een mengelmoes van compatibiliteit met alle clients en servers die er zijn.

In mijn geval probeerde mijn gebruiker de software te verbinden met een server die een onmiddellijke SSL-verbinding forceerde, wat de oude methode is die niet wordt ondersteund door Microsoft in .NET.


Antwoord 2, autoriteit 13%

Voor iedereen die dit bericht tegenkomt op zoek naar een oplossing en je hebt SMTP sendgrid via Azure ingesteld.

De gebruikersnaam is niet de gebruikersnaam die u hebt ingesteld toen u het sendgrid-object in azure hebt gemaakt. Om uw gebruikersnaam te vinden;

  • Klik op uw sendgrid-object in azure en klik op beheren. U wordt doorgestuurd naar de SendGrid-site.
  • Bevestig je e-mail en kopieer de gebruikersnaam die daar wordt weergegeven. Het is een automatisch gegenereerde gebruikersnaam.
  • Voeg de gebruikersnaam van SendGrid toe aan uw SMTP-instellingen in het web.config-bestand.

Hopelijk helpt dit!


Antwoord 3, autoriteit 10%

Verander poort van 465 naar 587 en het zal werken.


Antwoord 4, autoriteit 6%

Ik heb alle bovenstaande antwoorden geprobeerd, maar krijg nog steeds deze foutmelding met Office 365-account. De code lijkt goed te werken met Google-account en smtp.gmail.com wanneer minder veilige apps worden toegestaan.

Nog andere suggesties die ik zou kunnen proberen?

Hier is de code die ik gebruik

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);
}

UPDATE EN HOE IK HET OPGELOST:

Probleem opgelost door Smtp-client te wijzigen in Mailkit. De System.Net.Mail Smtp-client wordt nu niet aanbevolen door Microsoft vanwege beveiligingsproblemen en u zou in plaats daarvan MailKit moeten gebruiken. Het gebruik van Mailkit gaf me duidelijkere foutmeldingen die ik begreep om de oorzaak van het probleem (licentieprobleem) te vinden. Je kunt Mailkit krijgen door het te downloaden als een Nuget-pakket.

Lees de documentatie over Smtp Client voor meer informatie:
https ://docs.microsoft.com/es-es/dotnet/api/system.net.mail.smtpclient?redirectedfrom=MSDN&view=netframework-4.7.2

Hier is hoe ik SmtpClient met MailKit heb geïmplementeerd

       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);
        }

Antwoord 5, autoriteit 5%

Mogelijk moet u ook de instelling voor ‘minder veilige apps’ in uw Gmail-account wijzigen. EnableSsl, gebruik poort 587 en schakel “minder veilige apps” in. Als u het gedeelte met minder veilige apps googlet, zijn er Google-helppagina’s die u rechtstreeks naar de pagina voor uw account linken. Dat was mijn probleem, maar alles werkt nu dankzij alle bovenstaande antwoorden.


Antwoord 6

Ondersteunt uw SMTP-bibliotheek een versleutelde verbinding? De mailserver verwacht mogelijk een veilige TLS-verbinding en sluit daarom de verbinding bij afwezigheid van een TLS-handshake


Antwoord 7

Als u een SMTP-server op dezelfde box gebruikt en uw SMTP is gebonden aan een IP-adres in plaats van “Any Assigned”, kan het mislukken omdat het een IP-adres probeert te gebruiken (zoals 127.0.0.1) dat SMTP is momenteel niet mee bezig.


Antwoord 8

verwijderen

client.UseDefaultCredentials = false; 

leek het voor mij op te lossen.


Antwoord 9

Om te verheffen wat Jocull in een opmerking noemde, deed ik alles wat in deze thread werd genoemd en haalde ik eruit… omdat de mijne in een lus zat die steeds opnieuw moest worden uitgevoerd; na de eerste keer door de lus, zou het soms mislukken. Werkte altijd de eerste keer door de lus.

Voor alle duidelijkheid: de lus omvat het maken van SmtpClient en vervolgens het doen van .Send met de juiste gegevens. De SmtpClient is gemaakt in een try/catch-blok, om fouten op te vangen en om er zeker van te zijn dat het object wordt vernietigd voor het einde van de lus.

In mijn geval was de oplossing om ervoor te zorgen dat SmtpClient na elke keer in de lus werd verwijderd (ofwel via de instructie using() of door een handmatige verwijdering uit te voeren). Zelfs als het SmtpClient-object impliciet in de lus wordt vernietigd, lijkt .NET dingen rond te laten slingeren om in conflict te komen met de volgende poging.


Antwoord 10

Verander uw poortnummer in 587 van 465


Antwoord 11

In mijn geval is de klant vergeten een nieuw IP-adres toe te voegen in zijn SMTP-instellingen. Open IIS 6.0 in de server die de smtp instelt, klik met de rechtermuisknop op virtuele Smtp-server, kies Eigenschappen, tabblad Toegang, klik op Verbindingen, voeg IP-adres van de nieuwe server toe. Klik vervolgens op Relay, voeg ook het IP-adres van de nieuwe server toe. Dit loste mijn probleem op.


Antwoord 12

Ik kwam dit tegen bij het gebruik van smtp.office365.com, met poort 587 met SSL. Ik kon me aanmelden bij het account via portal.office.com en ik kon bevestigen dat het account een licentie had. Maar toen ik de code activeerde om e-mails te verzenden, kreeg ik steeds de fout net_io_connectionclosed.

nam me wat tijd om erachter te komen, maar de Exchange Admin vond de schuldige. We gebruiken O365, maar de Exchange Server was in een hybride omgeving. Hoewel het account dat we probeerden te gebruiken, werd gesynchroniseerd met Azure AD en hadden ze een geldige O365-licentie, om de een of andere reden was de mailbox nog steeds op de hybride Exchange-server – niet online uitwisselen. Nadat de Exchange Admin de opdracht “Move-mailbox” heeft gebruikt om de mailbox van de hybride Exchange-server naar O365 te verplaatsen, kunnen we de code gebruiken om e-mails te verzenden met O365.


13

Probeer dit: hier is de code die ik gebruik om e-mails naar meerdere gebruiker te verzenden.

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;
            }
        }
    }

14

Gebruik voor Outlook na instelling die geen fout aan mij geeft

SMTP-servernaam SMTP-mail.outlook.com

SMTP-poort 587


15

Deze fout is erg generiek. Het kan te wijten zijn aan vele reden zoals
De mailserver is onjuist.
Sommige hostingbedrijf gebruikt Mail.DomainName-indeling.
Als u gewoon domeinnaam gebruikt, werkt het niet.
Controleer inloggegevens
hostnaam
Gebruikersnaam Wachtwoord indien nodig
Controleer met het hostingbedrijf.

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

16

In mijn geval is de Web Server IP geblokkeerd op de mailserver, het moet worden gedeblokkeerd door uw hostingbedrijf en het whitelisted maken. Gebruik ook poortpoort 587.


17

Als uw e-mailserver Gmail (smtp.google.com) is, krijgt u deze foutmelding wanneer u de berichtenlimiet bereikt. Met Gmail kunnen maximaal 2000 berichten per 24 uur via SMTP worden verzonden.


Antwoord 18

Mijn oorspronkelijke probleem gaat over intermitterende verzendfouten. bijv. De eerste Send()slaagt, de tweede Send()mislukt, de derde Send()slaagt. Aanvankelijk dacht ik dat ik niet goed weggooide. Dus nam ik mijn toevlucht tot using().

Hoe dan ook, later heb ik de UseDefaultCredentials = falsetoegevoegd, en de Send() werd uiteindelijk stabiel.
Ik weet echter niet waarom.


Antwoord 19

Als je Sendgrid gebruikt en deze foutmelding krijgt, is dat omdat basisverificatie niet meer is toegestaan door sendgrid. We moeten een API-sleutel maken en deze gebruiken als NetworkCredential. gebruikersnaam = “apikey” wachtwoord is uw API-sleutel
Referentie – https://docs.sendgrid. com/voor-ontwikkelaars/e-mail verzenden/integreren-met-de-smtp-api


Antwoord 20

Voorbereiden:
1. HostA is een virtuele SMTP-server met standaardpoort 25
2. HostB is een werkstation waarop ik mail verstuur met SmtpClient
en simuleer een onstabiel netwerk
Ik gebruik onhandige

Geval 1
Gegeven als HostB 2008R2 is
Als ik e-mail stuur.
Dan doet zich dit probleem voor.

Geval 2
Gegeven Als HostB een versie van 2012 of hoger is
Als ik e-mail stuur.
Toen werd de e-mail verzonden.

Conclusie: deze hoofdoorzaak is gerelateerd aan Windows Server 2008R2.

Other episodes