/// <summary> /// Connects to specified NNTP server. /// </summary> /// <param name="server">NNTP server.</param> /// <param name="port">NNTP server port. Defualt NNTP port is 119.</param> public void Connect(string server,int port) { if(m_Connected){ throw new Exception("NNTP client is already connected, Disconnect first before calling Connect !"); } m_pSocket = new SocketEx(); m_pSocket.Connect(server,port); /* if(m_LogCmds && SessionLog != null){ m_pLogger = new SocketLogger(s,SessionLog); m_pLogger.SessionID = Guid.NewGuid().ToString(); m_pSocket.Logger = m_pLogger; }*/ // Set connected flag m_Connected = true; // Read server response string responseLine = m_pSocket.ReadLine(1000); if(!responseLine.StartsWith("200")){ throw new Exception(responseLine); } }
/// <summary> /// Connects to specified host. /// </summary> /// <param name="host">Host name.</param> /// <param name="port">Port.</param> public void Connect(string host,int port) { m_pSocket = new SocketEx(); m_pSocket.Connect(host,port); string reply = m_pSocket.ReadLine(); while(!reply.StartsWith("220 ")){ reply = m_pSocket.ReadLine(); } m_Connected = true; }
/// <summary> /// Connects to sepcified host. /// </summary> /// <param name="localEndpoint">Sets local endpoint. Pass null, to use default.</param> /// <param name="host">Host name or IP address.</param> /// <param name="port">Port where to connect.</param> /// <param name="ssl">Specifies if to connected via SSL. Default SMTP port is 25 and SSL port is 465.</param> public void Connect(IPEndPoint localEndpoint, string host, int port, bool ssl) { m_pSocket = new SocketEx(); if (localEndpoint != null) { m_pSocket.Bind(localEndpoint); } // Create logger if (SessionLog != null) { m_pLogger = new SocketLogger(m_pSocket.RawSocket, SessionLog); m_pLogger.SessionID = Guid.NewGuid().ToString(); m_pSocket.Logger = m_pLogger; } if (host.IndexOf("@") == -1) { m_pSocket.Connect(host, port, ssl); } else { //---- Parse e-domain -------------------------------// string domain = host; // eg. Ivx <*****@*****.**> if (domain.IndexOf("<") > -1 && domain.IndexOf(">") > -1) { domain = domain.Substring(domain.IndexOf("<") + 1, domain.IndexOf(">") - domain.IndexOf("<") - 1); } if (domain.IndexOf("@") > -1) { domain = domain.Substring(domain.LastIndexOf("@") + 1); } if (domain.Trim().Length == 0) { if (m_pLogger != null) { m_pLogger.AddTextEntry("Destination address '" + host + "' is invalid, aborting !"); } throw new Exception("Destination address '" + host + "' is invalid, aborting !"); } //--- Get MX record -------------------------------------------// Dns_Client dns = new Dns_Client(); Dns_Client.DnsServers = m_pDnsServers; DnsServerResponse dnsResponse = dns.Query(domain, QTYPE.MX); bool connected = false; switch (dnsResponse.ResponseCode) { case RCODE.NO_ERROR: DNS_rr_MX[] mxRecords = dnsResponse.GetMXRecords(); // Try all available hosts by MX preference order, if can't connect specified host. foreach (DNS_rr_MX mx in mxRecords) { try { if (m_pLogger != null) { m_pLogger.AddTextEntry("Connecting with mx record to: " + mx.Host); } m_pSocket.Connect(mx.Host, port, ssl); connected = true; break; } catch (Exception x) { // Just skip and let for to try next host. if (m_pLogger != null) { m_pLogger.AddTextEntry("Failed connect to: " + mx.Host + " error:" + x.Message); } } } // None of MX didn't connect if (mxRecords.Length > 0 && !connected) { throw new Exception("Destination email server is down"); } /* Rfc 2821 5 If no MX records are found, but an A RR is found, the A RR is treated as if it was associated with an implicit MX RR, with a preference of 0, pointing to that host. */ if (!connected) { // Try to connect with A record IPAddress[] ipEntry = null; try { if (m_pLogger != null) { m_pLogger.AddTextEntry("No mx record, trying to get A record for: " + domain); } ipEntry = Dns_Client.Resolve(domain); } catch { if (m_pLogger != null) { m_pLogger.AddTextEntry("Invalid domain,no MX or A record: " + domain); } throw new Exception("Invalid domain,no MX or A record: " + domain); } try { if (m_pLogger != null) { m_pLogger.AddTextEntry("Connecting with A record to:" + domain); } m_pSocket.Connect(domain, port, ssl); } catch { if (m_pLogger != null) { m_pLogger.AddTextEntry("Failed connect to:" + domain); } throw new Exception("Destination email server is down"); } } break; case RCODE.NAME_ERROR: if (m_pLogger != null) { m_pLogger.AddTextEntry("Invalid domain,no MX or A record: " + domain); } throw new Exception("Invalid domain,no MX or A record: " + domain); case RCODE.SERVER_FAILURE: if (m_pLogger != null) { m_pLogger.AddTextEntry("Dns server unvailable."); } throw new Exception("Dns server unvailable."); } } /* * Notes: Greeting may be single or multiline response. * * Examples: * 220<SP>SMTP server ready<CRLF> * * 220-SMTP server ready<CRLF> * 220-Addtitional text<CRLF> * 220<SP>final row<CRLF> * */ // Read server response string responseLine = m_pSocket.ReadLine(1000); while (!responseLine.StartsWith("220 ")) { // If lisne won't start with 220, then its error response if (!responseLine.StartsWith("220")) { throw new Exception(responseLine); } responseLine = m_pSocket.ReadLine(1000); } m_Connected = true; }
/// <summary> /// Connects to IMAP server. /// </summary> /// <param name="host">Host name.</param> /// <param name="port">Port number. Default IMAP port is 143 and SSL port is 993.</param> /// <param name="ssl">Specifies if to connected via SSL.</param> public void Connect(string host,int port,bool ssl) { if(!m_Connected){ m_pSocket = new SocketEx(); m_pSocket.Connect(host,port,ssl); string reply = m_pSocket.ReadLine(); reply = reply.Substring(reply.IndexOf(" ")).Trim(); // Remove Cmd tag if(!reply.ToUpper().StartsWith("OK")){ m_pSocket.Disconnect(); m_pSocket = null; throw new Exception("Server returned:" + reply); } m_Connected = true; // Clear path separator, so next access will get it. m_PathSeparator = '\0'; } }