Click here to Skip to main content
15,893,190 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 323K   4.9K   74  
Full featured SMTP/POP3/IMAP server
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;

using LumiSoft.Net;

namespace LumiSoft.MailServer.API.UserAPI
{
    /// <summary>
    /// The UserEmailAddressCollection object represents user email addresses in User.
    /// </summary>
    public class UserEmailAddressCollection : IEnumerable
    {
        private User         m_pUser   = null;
        private List<string> m_pEmails = null;

        /// <summary>
        /// Default constructor.
        /// </summary>
        /// <param name="user">Owner user.</param>
        internal UserEmailAddressCollection(User user)
        {
            m_pUser   = user;
            m_pEmails = new List<string>();

            Bind();
        }


        #region method Add

        /// <summary>
        /// Adds specified email address to user.
        /// </summary>
        /// <param name="emailAddress">Email address to add.</param>
        public void Add(string emailAddress)
        {
            /* AddUserEmailAddress <virtualServerID> "<userID>" "<emailAddress>"
                  Responses:
                    +OK                     
                    -ERR <errorText>
            */

            string id = Guid.NewGuid().ToString();

            // Call TCP AddMailingListMember
            m_pUser.VirtualServer.Server.Socket.WriteLine("AddUserEmailAddress " + m_pUser.VirtualServer.VirtualServerID + " " + TextUtils.QuoteString(m_pUser.UserID) + " " + TextUtils.QuoteString(emailAddress));
                        
            string response = m_pUser.VirtualServer.Server.Socket.ReadLine();
            if(!response.ToUpper().StartsWith("+OK")){
                throw new Exception(response);
            }

            m_pEmails.Add(emailAddress);
        }

        #endregion

        #region method Remove

        /// <summary>
        /// Removes specified email address from user.
        /// </summary>
        /// <param name="emailAddress">Email address to remove.</param>
        public void Remove(string emailAddress)
        {
            /* DeleteUserEmailAddress <virtualServerID> "<userID>" "<emailAddress>"
                  Responses:
                    +OK                     
                    -ERR <errorText>
            */

            string id = Guid.NewGuid().ToString();

            // Call TCP AddMailingListMember
            m_pUser.VirtualServer.Server.Socket.WriteLine("DeleteUserEmailAddress " + m_pUser.VirtualServer.VirtualServerID + " " + TextUtils.QuoteString(m_pUser.UserID) + " " + TextUtils.QuoteString(emailAddress));
                        
            string response = m_pUser.VirtualServer.Server.Socket.ReadLine();
            if(!response.ToUpper().StartsWith("+OK")){
                throw new Exception(response);
            }

            m_pEmails.Remove(emailAddress);
        }

        #endregion

        #region method ToArray

        /// <summary>
        /// Copies collection to array.
        /// </summary>
        /// <returns></returns>
        public string[] ToArray()
        {
            return m_pEmails.ToArray();
        }

        #endregion


        #region method Bind

        /// <summary>
        /// Gets server email addresses and binds them to this, if not binded already.
        /// </summary>
        private void Bind()
        {
            lock(m_pUser.VirtualServer.Server.LockSynchronizer){
                // Call TCP GetUserEmailAddresses
                m_pUser.VirtualServer.Server.Socket.WriteLine("GetUserEmailAddresses " + m_pUser.VirtualServer.VirtualServerID + " " + m_pUser.UserID);

                /* GetUserEmailAddresses <virtualServerID> <userID>
                      Responses:
                        +OK <sizeOfData>
                        <data>
                        
                        + ERR <errorText>
                */
                string response = m_pUser.VirtualServer.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_pUser.VirtualServer.Server.Socket.ReadSpecifiedLength(sizeOfData,ms);
                
                // Decompress dataset
                DataSet ds = Utils.DecompressDataSet(ms);
                
                if(ds.Tables.Contains("UserAddresses")){
                    foreach(DataRow dr in ds.Tables["UserAddresses"].Rows){
                        m_pEmails.Add(dr["Address"].ToString());
                    }
                }
            }
        }

        #endregion


        #region interface IEnumerator

		/// <summary>
		/// Gets enumerator.
		/// </summary>
		/// <returns></returns>
		public IEnumerator GetEnumerator()
		{
			return m_pEmails.GetEnumerator();
		}

		#endregion


        #region Properties Implementation
        /*
        /// <summary>
        /// Gets virtual server to where this collection belongs to.
        /// </summary>
        public VirtualServer VirtualServer
        {
            get{ return m_pVirtualServer; }
        }*/

        /// <summary>
        /// Gets the User object that is the owner of this collection.
        /// </summary>
        public User User
        {
            get{ return m_pUser; }
        }

        /// <summary>
        /// Gets number of email addresses on that user.
        /// </summary>
        public int Count
        {
            get{ return m_pEmails.Count; }
        }
        
        /// <summary>
        /// Gets a user email address in the collection by index number.
        /// </summary>
        /// <param name="index">An Int32 value that specifies the position of the user email address in the UserEmailAddressCollection collection.</param>
        /// <returns></returns>
        public string this[int index]
        {
            get{ return m_pEmails[index]; }
        }

        /// <summary>
        /// Gets a user email address in the collection by user email address.
        /// </summary>
        /// <param name="emailAddress">A String value that specifies the user email address in the UserEmailAddressCollection collection.</param>
        /// <returns></returns>
        public string this[string emailAddress]
        {
            get{ 
                foreach(string email in m_pEmails){
                    if(email.ToLower() == emailAddress.ToLower()){
                        return email;
                    }
                }

                throw new Exception("Email address '" + emailAddress + "' doesn't exist !"); 
            }
        }

        #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