private bool SendEHello() { IAsyncResult result = EHelloCommand.BeginSend(_connection, _connection._client.clientDomain, s_sendEHelloCallback, this); if (result.CompletedSynchronously) { _connection._extensions = EHelloCommand.EndSend(result); _connection.ParseExtensions(_connection._extensions); // If we already have a TlsStream, this is the second EHLO cmd // that we sent after TLS handshake compelted. So skip TLS and // continue with Authenticate. if (_connection._networkStream is TlsStream) { Authenticate(); return(true); } if (_connection.EnableSsl) { if (!_connection._serverSupportsStartTls) { // Either TLS is already established or server does not support TLS if (!(_connection._networkStream is TlsStream)) { throw new SmtpException(string.Format(Strings.MailServerDoesNotSupportStartTls)); } } SendStartTls(); } else { Authenticate(); } return(true); } return(false); }
private static void SendEHelloCallback(IAsyncResult result) { if (!result.CompletedSynchronously) { ConnectAndHandshakeAsyncResult thisPtr = (ConnectAndHandshakeAsyncResult)result.AsyncState; try { try { thisPtr._connection._extensions = EHelloCommand.EndSend(result); thisPtr._connection.ParseExtensions(thisPtr._connection._extensions); // If we already have a SSlStream, this is the second EHLO cmd // that we sent after TLS handshake compelted. So skip TLS and // continue with Authenticate. if (thisPtr._connection._networkStream is TlsStream) { thisPtr.Authenticate(); return; } } catch (SmtpException e) { if ((e.StatusCode != SmtpStatusCode.CommandUnrecognized) && (e.StatusCode != SmtpStatusCode.CommandNotImplemented)) { throw; } if (!thisPtr.SendHello()) { return; } } if (thisPtr._connection.EnableSsl) { if (!thisPtr._connection._serverSupportsStartTls) { // Either TLS is already established or server does not support TLS if (!(thisPtr._connection._networkStream is TlsStream)) { throw new SmtpException(Strings.MailServerDoesNotSupportStartTls); } } thisPtr.SendStartTls(); } else { thisPtr.Authenticate(); } } catch (Exception e) { thisPtr.InvokeCallback(e); } } }