Click here to Skip to main content
15,884,298 members
Articles / Programming Languages / C#

LumiSoft MailServer

Rate me:
Please Sign up or sign in to vote.
3.79/5 (22 votes)
17 Nov 2006CPOL1 min read 321.3K   4.9K   74  
Full featured SMTP/POP3/IMAP server
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Net;

using LumiSoft.Net;

namespace LumiSoft.MailServer.API.UserAPI
{
    /// <summary>
    /// Provides virtual server logging related methods.
    /// </summary>
    public class Logs
    {
        private VirtualServer m_pVirtualServer = null;

        /// <summary>
        /// Default constructor.
        /// </summary>
        /// <param name="virtualServer">Owner virtual server.</param>
        internal Logs(VirtualServer virtualServer)
        {
            m_pVirtualServer = virtualServer;
        }


        #region method GetSmtpLogSessions

        /// <summary>
        /// Gets SMTP sessions logs.
        /// </summary>
        /// <param name="limit">Specifies maximum number of log entries to return.</param>
        /// <param name="date">Date what logs to get.</param>
        /// <param name="startTime">Start time filter.</param>
        /// <param name="endTime">End time filter.</param>
        /// <param name="containsText">Log record text filter. Pass null or "" if no text filter.</param>
        public LogSession[] GetSmtpLogSessions(int limit,DateTime date,DateTime startTime,DateTime endTime,string containsText)
        {
            return GetLogSessions("SMTP",limit,date,startTime,endTime,containsText);
        }

        #endregion

        #region method GetPop3LogSessions

        /// <summary>
        /// Gets POP3 sessions logs.
        /// </summary>
        /// <param name="limit">Specifies maximum number of log entries to return.</param>
        /// <param name="date">Date what logs to get.</param>
        /// <param name="startTime">Start time filter.</param>
        /// <param name="endTime">End time filter.</param>
        /// <param name="containsText">Log record text filter. Pass null or "" if no text filter.</param>
        public LogSession[] GetPop3LogSessions(int limit,DateTime date,DateTime startTime,DateTime endTime,string containsText)
        {
            return GetLogSessions("POP3",limit,date,startTime,endTime,containsText);
        }

        #endregion

        #region method GetImapLogSessions

        /// <summary>
        /// Gets IMAP sessions logs.
        /// </summary>
        /// <param name="limit">Specifies maximum number of log entries to return.</param>
        /// <param name="date">Date what logs to get.</param>
        /// <param name="startTime">Start time filter.</param>
        /// <param name="endTime">End time filter.</param>
        /// <param name="containsText">Log record text filter. Pass null or "" if no text filter.</param>
        public LogSession[] GetImapLogSessions(int limit,DateTime date,DateTime startTime,DateTime endTime,string containsText)
        {
            return GetLogSessions("IMAP",limit,date,startTime,endTime,containsText);
        }

        #endregion

        #region method GetRelayLogSessions

        /// <summary>
        /// Gets RELAY sessions logs.
        /// </summary>
        /// <param name="limit">Specifies maximum number of log entries to return.</param>
        /// <param name="date">Date what logs to get.</param>
        /// <param name="startTime">Start time filter.</param>
        /// <param name="endTime">End time filter.</param>
        /// <param name="containsText">Log record text filter. Pass null or "" if no text filter.</param>
        public LogSession[] GetRelayLogSessions(int limit,DateTime date,DateTime startTime,DateTime endTime,string containsText)
        {
            return GetLogSessions("RELAY",limit,date,startTime,endTime,containsText);
        }

        #endregion

        #region method GetFetchLogSessions

        /// <summary>
        /// Gets FETCH sessions logs.
        /// </summary>
        /// <param name="limit">Specifies maximum number of log entries to return.</param>
        /// <param name="date">Date what logs to get.</param>
        /// <param name="startTime">Start time filter.</param>
        /// <param name="endTime">End time filter.</param>
        /// <param name="containsText">Log record text filter. Pass null or "" if no text filter.</param>
        public LogSession[] GetFetchLogSessions(int limit,DateTime date,DateTime startTime,DateTime endTime,string containsText)
        {
            return GetLogSessions("FETCH",limit,date,startTime,endTime,containsText);
        }

        #endregion


        #region method GetLogSessions

        /// <summary>
        /// Gets specified service session logs.
        /// </summary>
        /// <param name="service">Service name. SMTP,POP3,IMAP,RELAY,FETCH.</param>
        /// <param name="limit">Specifies maximum number of log entries to return.</param>
        /// <param name="date">Date what logs to get.</param>
        /// <param name="startTime">Start time filter.</param>
        /// <param name="endTime">End time filter.</param>
        /// <param name="containsText">Log record text filter. Pass null or "" if no text filter.</param>
        /// <returns></returns>
        private LogSession[] GetLogSessions(string service,int limit,DateTime date,DateTime startTime,DateTime endTime,string containsText)
        {
            /* GetLogSessions <virtualServerID> <service> <limit> "<startTime>" "<endTime>" "containsText"
                  Responses:
                    +OK <sizeOfData>
                    <data>
                    
                    -ERR <errorText>
            */

            lock(m_pVirtualServer.Server.LockSynchronizer){
                // Call TCP GetLogSessions
                m_pVirtualServer.Server.Socket.WriteLine("GetLogSessions " + 
                    m_pVirtualServer.VirtualServerID + " " +
                    service + " " +
                    limit.ToString() + " " +
                    TextUtils.QuoteString(startTime.ToUniversalTime().ToString("u")) + " " +
                    TextUtils.QuoteString(endTime.ToUniversalTime().ToString("u")) + " " +
                    TextUtils.QuoteString(containsText)
                );
                            
                string response = m_pVirtualServer.Server.Socket.ReadLine();
                if(!response.ToUpper().StartsWith("+OK")){
                    throw new Exception(response);
                }

                int sizeOfData = Convert.ToInt32(response.Split(new char[]{' '},2)[1]);
                MemoryStream ms = new MemoryStream();
                m_pVirtualServer.Server.Socket.ReadSpecifiedLength(sizeOfData,ms);
                
                // Decompress dataset
                DataSet ds = Utils.DecompressDataSet(ms);

                List<LogSession> retVal = new List<LogSession>();
                if(ds.Tables.Contains("LogSessions")){
                    foreach(DataRow dr in ds.Tables["LogSessions"].Rows){
                        retVal.Add(new LogSession(
                            m_pVirtualServer,
                            service,
                            dr["SessionID"].ToString(),
                            Convert.ToDateTime(dr["StartTime"]),
                            ConvertEx.ToIPEndPoint(dr["RemoteEndPoint"].ToString(),new IPEndPoint(IPAddress.None,0)),
                            dr["UserName"].ToString()
                        ));
                    }
                }

                return retVal.ToArray();
            }
        }

        #endregion

    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Estonia Estonia
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions