/// <summary> /// retrieve response /// </summary> /// <param name="sResultArray">Imap Server response</param> /// <returns>ImapResponseEnum type</returns> protected IMAPResponseEnum Receive(ref ArrayList sResultArray) { IMAPResponseEnum eImapResponse = IMAPResponseEnum.IMAP_SUCCESS_RESPONSE; try { bool bRead = true; while (bRead) { if (m_useSSL) { m_SSLStream.ReadTimeout = 15000; } else { m_oNetStrm.ReadTimeout = 15000; } string sResult = m_useSSL ? m_rdr.ReadLine() : m_oRdStrm.ReadLine(); if (m_useSSL) { m_SSLStream.ReadTimeout = 3000000; } else { m_oNetStrm.ReadTimeout = 3000000; } sResultArray.Add(sResult); if (sResult.Contains(IMAP_SERVER_RESPONSE_OK)) { bRead = false; Log(LogTypeEnum.IMAP, sResult); eImapResponse = IMAPResponseEnum.IMAP_SUCCESS_RESPONSE; } else if (sResult.Contains(IMAP_SERVER_RESPONSE_NO)) { bRead = false; Log(LogTypeEnum.IMAP, sResult); eImapResponse = IMAPResponseEnum.IMAP_FAILURE_RESPONSE; } else if (sResult.Contains(IMAP_SERVER_RESPONSE_BAD)) { bRead = false; Log(LogTypeEnum.IMAP, sResult); eImapResponse = IMAPResponseEnum.IMAP_FAILURE_RESPONSE; } else { Log(LogTypeEnum.IMAP, sResult); } } } catch (Exception e) { //LogOut(); throw new IMAPException(IMAPException.IMAPErrorEnum.IMAP_ERR_SERIOUS, e.Message); } Log(LogTypeEnum.IMAP, ""); return(eImapResponse); }
/// <summary> /// Connect to specified host and port /// </summary> /// <param name="sHost">Imap host</param> /// <param name="nPort">Imap port</param> /// <param name="useSSL">Use a secure connection</param> /// <returns>ImapResponseEnum type</returns> protected IMAPResponseEnum Connect(string sHost, ushort nPort, bool useSSL) { IMAP_COMMAND_VAL = 0; IMAPResponseEnum eImapResponse = IMAPResponseEnum.IMAP_SUCCESS_RESPONSE; IMAPException e_connect = new IMAPException(IMAPException.IMAPErrorEnum.IMAP_ERR_CONNECT, sHost); try { m_oImapServ = new TcpClient(sHost, nPort); m_oNetStrm = m_oImapServ.GetStream(); m_oRdStrm = new StreamReader(m_oImapServ.GetStream()); if (useSSL) { m_SSLStream = new SslStream(m_oImapServ.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); //m_SSLStream.ReadTimeout = 30000; try { m_SSLStream.AuthenticateAsClient(sHost); } catch (AuthenticationException e) { Console.WriteLine("Exception: {0}", e.Message); if (e.InnerException != null) { Console.WriteLine("Inner exception: {0}", e.InnerException.Message); } Console.WriteLine("Authentication failed - closing the connection."); m_oImapServ.Close(); return(IMAPResponseEnum.IMAP_FAILURE_RESPONSE); } m_rdr = new StreamReader(m_SSLStream); } string sResult = useSSL ? m_rdr.ReadLine() : m_oRdStrm.ReadLine(); if (sResult.StartsWith(IMAP_OK_SERVER_RESPONSE) == true) { Log(LogTypeEnum.IMAP, sResult); eImapResponse = IMAPResponseEnum.IMAP_SUCCESS_RESPONSE; Capability(); } else { Log(LogTypeEnum.IMAP, sResult); eImapResponse = IMAPResponseEnum.IMAP_FAILURE_RESPONSE; } } catch { throw e_connect; } m_sHost = sHost; m_nPort = nPort; return(eImapResponse); }
/// <summary> /// Send command to server and retrieve response /// </summary> /// <param name="command">Command to send Imap Server</param> /// <param name="sResultArray">Imap Server response</param> /// <returns>ImapResponseEnum type</returns> public IMAPResponseEnum SendAndReceive(string command, ref ArrayList sResultArray) { IMAP_COMMAND_VAL++; string sCommand = IMAP_COMMAND_IDENTIFIER + command; IMAPResponseEnum eImapResponse = IMAPResponseEnum.IMAP_SUCCESS_RESPONSE; Log(LogTypeEnum.IMAP, sCommand.TrimEnd(IMAP_COMMAND_EOL.ToCharArray())); byte[] data = System.Text.Encoding.ASCII.GetBytes(sCommand.ToCharArray()); try { if (m_useSSL) { m_SSLStream.Write(data, 0, data.Length); } else { m_oNetStrm.Write(data, 0, data.Length); } bool bRead = true; while (bRead) { string sResult = m_useSSL ? m_rdr.ReadLine() : m_oRdStrm.ReadLine(); sResultArray.Add(sResult); if (sResult.StartsWith(IMAP_SERVER_RESPONSE_OK)) { bRead = false; Log(LogTypeEnum.IMAP, sResult); eImapResponse = IMAPResponseEnum.IMAP_SUCCESS_RESPONSE; } else if (sResult.StartsWith(IMAP_SERVER_RESPONSE_NO)) { bRead = false; Log(LogTypeEnum.IMAP, sResult); eImapResponse = IMAPResponseEnum.IMAP_FAILURE_RESPONSE; } else if (sResult.StartsWith(IMAP_SERVER_RESPONSE_BAD)) { bRead = false; Log(LogTypeEnum.IMAP, sResult); eImapResponse = IMAPResponseEnum.IMAP_FAILURE_RESPONSE; } else { Log(LogTypeEnum.IMAP, sResult); } } } catch (Exception e) { //LogOut(); throw new IMAPException(IMAPException.IMAPErrorEnum.IMAP_ERR_SERIOUS, e.Message); } Log(LogTypeEnum.IMAP, ""); return(eImapResponse); }
/// <summary> /// IMAP Capability command /// </summary> public void Capability() { IMAPResponseEnum eImapResponse = IMAPResponseEnum.IMAP_SUCCESS_RESPONSE; ArrayList sResultArray = new ArrayList(); string capabilityCommand = IMAP_CAPABILITY_COMMAND; capabilityCommand += IMAP_COMMAND_EOL; try { eImapResponse = SendAndReceive(capabilityCommand, ref sResultArray); if (eImapResponse != IMAPResponseEnum.IMAP_SUCCESS_RESPONSE) { throw new IMAPException(IMAPException.IMAPErrorEnum.IMAP_ERR_CAPABILITY); } } catch (Exception e) { throw e; } }