private string sendAndExpect(string toSend, int statusCode) { if (toSend != null) { _writer.Write(toSend + "\r\n"); _conversation.Add("> " + toSend); _log.Debug(8, "> " + toSend); } string response = ""; Match m; do { var line = _reader.ReadLine(); _conversation.Add("< " + line); _log.Debug(8, "< " + line); m = Regex.Match(line, @"^(\d+)(-| |$)?(.*)?$"); if (!m.Success) { throw new RTSmtpException("Expected status code '{0}', got unexpected line: {1}".Fmt(statusCode, line), _conversation); } if (int.Parse(m.Groups[1].Value) != statusCode) { throw new RTSmtpException("Expected status code '{0}', got: {1}.".Fmt(statusCode, line), _conversation); } response += m.Groups[3].Value.Trim() + Environment.NewLine; }while (m.Groups[2].Value == "-"); return(response); }
/// <summary> /// Creates a connection to the SMTP server and authenticates the specified user.</summary> /// <param name="host"> /// SMTP host name.</param> /// <param name="port"> /// SMTP host port.</param> /// <param name="username"> /// SMTP username.</param> /// <param name="password"> /// SMTP password.</param> /// <param name="encryption"> /// Encryption mode.</param> /// <param name="log"> /// The SMTP client logs various messages to this log at various verbosity levels.</param> /// <param name="timeout"> /// Network stream read/write timeout, in milliseconds.</param> /// <exception cref="RTSmtpException"> /// SMTP protocol error, or authentication failed.</exception> /// <exception cref="IOException"> /// Network error or timeout.</exception> public RTSmtpClient(string host, int port, string username = null, string password = null, SmtpEncryption encryption = SmtpEncryption.None, LoggerBase log = null, int timeout = 10000) { _log = log ?? new NullLogger(); _log.Debug(2, "Connecting to {0}:{1}...".Fmt(host, port)); _tcp = new TcpClient(host, port); _tcpStream = _tcp.GetStream(); if (encryption == SmtpEncryption.Ssl || encryption == SmtpEncryption.SslIgnoreCert) { if (encryption == SmtpEncryption.Ssl) { _sslStream = new SslStream(_tcpStream); } else { _sslStream = new SslStream(_tcpStream, false, (_, __, ___, ____) => true); } _sslStream.AuthenticateAsClient(host); _log.Debug(3, "SSL: authenticated as client"); } (_sslStream ?? _tcpStream).ReadTimeout = timeout; (_sslStream ?? _tcpStream).WriteTimeout = timeout; _writer = new StreamWriter(_sslStream ?? _tcpStream, new UTF8Encoding(false)) { NewLine = "\r\n", AutoFlush = true }; _reader = new StreamReader(_sslStream ?? _tcpStream, Encoding.UTF8); _conversation = new List <string>(); sendAndExpect(null, 220); sendAndExpect("EHLO localhost", 250); if (username == null || password == null) { _log.Debug(3, "Connected without authentication."); return; } var result = sendAndExpect("AUTH LOGIN", 334).Trim(); var resultDec = Convert.FromBase64String(result).FromUtf8(); if (resultDec != "Username:"******"Expected 'Username:'******'{0}'".Fmt(resultDec), _conversation); } result = sendAndExpect(Convert.ToBase64String(username.ToUtf8()), 334).Trim(); resultDec = Convert.FromBase64String(result).FromUtf8(); if (resultDec != "Password:"******"Expected 'Password:'******'{0}'".Fmt(resultDec), _conversation); } sendAndExpect(Convert.ToBase64String(password.ToUtf8()), 235); _log.Debug(3, "Connected."); }
private HResponse performRequest(HttpWebRequest request) { Log.Debug(1, "Requested ({0}) URL \"{1}\"".Fmt(request.Method, request.RequestUri.OriginalString)); for (int i = 0; i < request.Headers.Count; i++) { Log.Debug(3, " " + request.Headers.AllKeys[i] + ": " + request.Headers[i]); } if (request.CookieContainer != null && request.CookieContainer.Count > 0) { Log.Debug(3, " Cookie: " + request.CookieContainer.GetCookieHeader(request.RequestUri)); } HResponse result; HttpWebResponse resp; try { resp = (HttpWebResponse)request.GetResponse(); if (resp == null) { throw new WebException("Received a null response."); } result = new HResponse(resp); } catch (WebException e) { if (e.Response == null) { throw new WebException("Caught WebException containing no response.", e); } else { result = new HResponse(resp = (HttpWebResponse)e.Response); } } Log.Debug(2, "Response: " + result.StatusCode + " - " + result.DataString.SubstringSafe(0, 50)); for (int i = 0; i < resp.Headers.Count; i++) { Log.Debug(3, " " + resp.Headers.AllKeys[i] + ": " + resp.Headers[i]); } return(result); }
/// <summary> /// Creates a connection to the SMTP server and authenticates the specified user.</summary> /// <param name="host"> /// SMTP host name.</param> /// <param name="port"> /// SMTP host port.</param> /// <param name="username"> /// SMTP username.</param> /// <param name="password"> /// SMTP password.</param> /// <param name="encryption"> /// Encryption mode.</param> /// <param name="log"> /// The SMTP client logs various messages to this log at various verbosity levels.</param> /// <param name="timeout"> /// Network stream read/write timeout, in milliseconds.</param> /// <exception cref="RTSmtpException"> /// SMTP protocol error, or authentication failed.</exception> /// <exception cref="IOException"> /// Network error or timeout.</exception> public RTSmtpClient(string host, int port, string username, string password, SmtpEncryption encryption = SmtpEncryption.None, LoggerBase log = null, int timeout = 10000) { _log = log ?? new NullLogger(); _log.Debug(2, "Connecting to {0}:{1}...".Fmt(host, port)); _tcp = new TcpClient(host, port); _tcpStream = _tcp.GetStream(); if (encryption == SmtpEncryption.Ssl || encryption == SmtpEncryption.SslIgnoreCert) { if (encryption == SmtpEncryption.Ssl) _sslStream = new SslStream(_tcpStream); else _sslStream = new SslStream(_tcpStream, false, (_, __, ___, ____) => true); _sslStream.AuthenticateAsClient(host); _log.Debug(3, "SSL: authenticated as client"); } (_sslStream ?? _tcpStream).ReadTimeout = timeout; (_sslStream ?? _tcpStream).WriteTimeout = timeout; _writer = new StreamWriter(_sslStream ?? _tcpStream, new UTF8Encoding(false)) { NewLine = "\r\n", AutoFlush = true }; _reader = new StreamReader(_sslStream ?? _tcpStream, Encoding.UTF8); _conversation = new List<string>(); sendAndExpect(null, 220); sendAndExpect("EHLO localhost", 250); var result = sendAndExpect("AUTH LOGIN", 334).Trim(); var resultDec = Convert.FromBase64String(result).FromUtf8(); if (resultDec != "Username:"******"Expected 'Username:'******'{0}'".Fmt(resultDec), _conversation); result = sendAndExpect(Convert.ToBase64String(username.ToUtf8()), 334).Trim(); resultDec = Convert.FromBase64String(result).FromUtf8(); if (resultDec != "Password:"******"Expected 'Password:'******'{0}'".Fmt(resultDec), _conversation); sendAndExpect(Convert.ToBase64String(password.ToUtf8()), 235); _log.Debug(3, "Connected."); }