2017-09-13 1 views
0

geschieht also hier ist mein Code, der verwendet wird E-Mails von Unity zu senden C# Skript:C# smtpfailedrecipientexception; Wie Funktion verlassen, wenn diese

public void SendMail() // Mail send function 
    { 
     string emailAddress; // variable to store user inputted email 
     emailAddress = emailInput.text; // variable becomes the email the user types in 
     mail.From = new MailAddress("hiddenfornow"); 
     mail.To.Add(emailAddress); 
     SmtpClient smtpServer = new SmtpClient("smtp.gmail.com"); 
     smtpServer.Port = 587; 
     mail.Subject = "Test Subject" + currentDate; 
     mail.IsBodyHtml = true; // allows for html 
     mail.Body = "Testing testing"; 
     smtpServer.Credentials = new System.Net.NetworkCredential("hiddenfornow", "hiddenfornow") as ICredentialsByHost; 
     smtpServer.EnableSsl = true; 
     SceneManager.LoadScene("TestScene"); // reloads the scene after user clicks button   
     ServicePointManager.ServerCertificateValidationCallback = 
     delegate (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
     { return true; }; 
     smtpServer.Send(mail); 
     Debug.Log("success"); 
} 

Dieser Code funktioniert gut E-Mails zu senden. Wenn ich jedoch eine falsche E-Mail-Adresse eingegeben habe, erhalte ich die Meldung "smtpfailed recipient exception".

Danach funktioniert sogar die Eingabe einer korrekten E-Mail-Adresse nicht. Der Fehler smtpfailedrecipient wird weiterhin auftreten, es sei denn, Sie geben ihn beim ersten Mal korrekt ein.

Ich mag würde eine Art von If-Anweisung wie diese hinzufügen, die ich in Pseudo-Code geschrieben haben:

If smtpserver.send(mail)returns smtp error 
{ 
Exit this function 
} 
else 
{ 
success message 
} 

Ich bin nur nicht sicher, wie dies zu implementieren.

Vielen Dank für das Lesen meiner Frage.

Antwort

0

Die SmtpClient verwendet Pooling, um den Aufwand beim Erstellen neuer Verbindungen zum Server zu reduzieren. (Siehe: https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient(v=vs.110).aspx#Remarks)

Meine Vermutung ist, dass die SmtpFailedRecientsException wird die Verbindung in einem schlechten Zustand versetzt wird, so müssen Sie die Verbindung zwingen, durch Anordnen des Client zu schließen:

public void SendMail() // Mail send function 
    { 
     //your code... 

     SmtpClient smtpServer = new SmtpClient("smtp.gmail.com"); 

     try { 
      //.... your code continues..... 
      smtpServer.Send(mail); 
      Debug.Log("success"); 
     } catch (SmtpFailedRecipientsException) { //or, perhaps any Exception 
      smtpServer.Dispose(); 
      throw; //rethrow the exception, assuming you're handling it in the calling code 
     } 
} 
+0

Vielen Dank! Dein Kommentar hat mich zu meiner Lösung geführt. Der try catch hat funktioniert, aber der smtpServer.Dispose(); hat nicht gearbeitet. Wie auch immer, ich habe versucht mail.Dispose(); und es hat funktioniert. –

1

Verwenden Ausnahmebehandlung Ansatz mit Laufzeitausnahme zu tun:

 try 
     { 
      if (smtpserver.send(mail)) 
       return "successful"; 
     } 
     catch (SmtpFailedRecipientException ex) 
     { 
      // log your error 
      return ex.StatusCode; // return status code as you will know actual error code 
     } 
     finally 
     { 
      mail.Dispose(); // Dispose your mailmessage as it will clears any stream associated with your mail message such as attachment 

     } 

Available Status Codes

+0

Danke für Ihre Hilfe, mail.Dispose(); Was ich brauchte, kombinierte ich deine Antwort mit Johns Post, um eine Lösung zu finden! –

+0

@DavidForster: Froh, es hilft dir !!! –

0

Für die Zukunft, hier ist der Code, der funktioniert hat:

Try 
{ 
smtpServer.Send(mail); // Attempts to send the email 
Debug.Log("success"); 
} 
catch (SmtpFailedRecipientsException) // Catches send failure 
{ 
mail.Dispose(); // ends the SMTP connection 
SceneManager.LoadScene("SceneName"); //Reloads the scene to clear textboxes 
} 
+0

Bessere Implementierung in Endblock haben. Am besten, wenn Sie 'using' Anweisungen verwenden würden, anstatt das' MailMessage' Objekt manuell zu entfernen –