Click here to Skip to main content
15,898,134 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 323.5K   4.9K   74  
Full featured SMTP/POP3/IMAP server
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Data;

using LumiSoft.MailServer.API.UserAPI;
using LumiSoft.MailServer.UI.Resources;

namespace LumiSoft.MailServer.UI
{
    /// <summary>
    /// Add/Edit mailing list window.
    /// </summary>
    public class wfrm_MailingList : Form
    {
        // Common UI
        private TabControl m_pTab       = null;
        private GroupBox   m_pGroupBox1 = null;
        private Button     m_pCancel    = null;
        private Button     m_pOk        = null;
        // General tab UI
        private Label     mt_MailingListName = null;
        private TextBox   m_pMailingListName = null;
        private Label     mt_At              = null;
        private ComboBox  m_pDomains         = null; 
        private Label     mt_Description     = null;
        private TextBox   m_pDescription     = null;
        private CheckBox  m_pEnabled         = null;
        // Members tab UI
        private Label    mt_Member         = null;
        private TextBox  m_pMember         = null;
        private Button   m_pGetUserOrGroup = null;
        private ListView m_pMembers        = null;
        private Button   m_pMembers_Add    = null;
        private Button   m_pMembers_Remove = null;
        // Access tab UI
        private ImageList m_pAccessImages  = null;
        private ListView  m_pAccess        = null;
        private Button    m_pAccess_Add    = null;
        private Button    m_pAccess_Remove = null;
        
        private VirtualServer m_pVirtualServer = null;
        private MailingList   m_pMailingList   = null;
        
        /// <summary>
        /// Add new constructor.
        /// </summary>
        /// <param name="serverAPI">Reference to server API.</param>
        public wfrm_MailingList(VirtualServer virtualServer)
        {
            m_pVirtualServer = virtualServer;

            InitUI();

            LoadDomains();
        }

        /// <summary>
        /// Edit constructor.
        /// </summary>
        /// <param name="serverAPI">Reference to server API.</param>
        /// <param name="mailingList">Mailing list to update.</param>
        public wfrm_MailingList(VirtualServer virtualServer,MailingList mailingList)
        {
            m_pVirtualServer = virtualServer;
            m_pMailingList   = mailingList;

            InitUI();

            LoadDomains();

            m_pMailingListName.Text = mailingList.Name.Split(new char[]{'@'})[0];
            m_pDomains.SelectedText = mailingList.Name.Split(new char[]{'@'})[1];
            m_pDescription.Text = mailingList.Description;
            m_pEnabled.Checked = mailingList.Enabled;

            LoadMembers("");
            LoadAccess("");
        }

        #region method InitUI

        /// <summary>
        /// Creates and initializes window UI.
        /// </summary>
        private void InitUI()
        {
            this.ClientSize = new Size(392,323);
            this.MinimumSize = new Size(400,350);
            this.StartPosition = FormStartPosition.CenterScreen;
            this.Text = "Add/Edit Mailing List";

            //--- Common UI ----------------------------------//
            m_pTab = new TabControl();
            m_pTab.Size = new Size(393,280);
            m_pTab.Location = new Point(0,5);
            m_pTab.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
            m_pTab.TabPages.Add(new TabPage("General"));
            m_pTab.TabPages.Add(new TabPage("Members"));
            m_pTab.TabPages.Add(new TabPage("Access"));

            m_pGroupBox1 = new GroupBox();
            m_pGroupBox1.Size = new Size(385,4);
            m_pGroupBox1.Location = new Point(5,290);
            m_pGroupBox1.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;

            m_pCancel = new Button();
            m_pCancel.Size = new Size(70,20);
            m_pCancel.Location = new Point(245,300);
            m_pCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
            m_pCancel.Text = "Cancel";
            m_pCancel.Click += new EventHandler(m_pCancel_Click);

            m_pOk = new Button();
            m_pOk.Size = new Size(70,20);
            m_pOk.Location = new Point(320,300);
            m_pOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
            m_pOk.Text = "Ok";
            m_pOk.Click += new EventHandler(m_pOk_Click);

            this.Controls.Add(m_pTab);
            this.Controls.Add(m_pGroupBox1);
            this.Controls.Add(m_pCancel);
            this.Controls.Add(m_pOk);
            //-----------------------------------------------//

            //--- General tab UI ----------------------------//
            mt_MailingListName = new Label();
            mt_MailingListName.Size = new Size(200,13);
            mt_MailingListName.Location = new Point(5,10);
            mt_MailingListName.Text = "Name:";

            m_pMailingListName = new TextBox();
            m_pMailingListName.Size = new Size(190,20);
            m_pMailingListName.Location = new Point(5,25);

            mt_At = new Label();
            mt_At.Size = new Size(13,13);
            mt_At.Location = new Point(195,28);
            mt_At.Text = "@";

            m_pDomains = new ComboBox();
            m_pDomains.Size = new Size(170,20);
            m_pDomains.Location = new Point(210,25);
            m_pDomains.DropDownStyle = ComboBoxStyle.DropDownList;

            mt_Description = new Label();
            mt_Description.Size = new Size(200,13);
            mt_Description.Location = new Point(5,55);
            mt_Description.Text = "Description:";

            m_pDescription = new TextBox();
            m_pDescription.Size = new Size(375,20);
            m_pDescription.Location = new Point(5,70);
                        
            m_pEnabled = new CheckBox();
            m_pEnabled.Size = new Size(265,13);
            m_pEnabled.Location = new Point(5,105);
            m_pEnabled.Checked = true;
            m_pEnabled.Text = "Enabled";

            m_pTab.TabPages[0].Controls.Add(mt_MailingListName);
            m_pTab.TabPages[0].Controls.Add(m_pMailingListName);
            m_pTab.TabPages[0].Controls.Add(mt_At);
            m_pTab.TabPages[0].Controls.Add(m_pDomains);
            m_pTab.TabPages[0].Controls.Add(mt_Description);
            m_pTab.TabPages[0].Controls.Add(m_pDescription);
            m_pTab.TabPages[0].Controls.Add(m_pEnabled);
            //-----------------------------------------------//  
        
            //--- Members tab UI ----------------------------//
            mt_Member = new Label();          
            mt_Member.Size = new Size(50,13);
            mt_Member.Location = new Point(5,22);
            mt_Member.TextAlign = ContentAlignment.MiddleRight;
            mt_Member.Text = "Member:";

            m_pMember = new TextBox();            
            m_pMember.Size = new Size(215,20);
            m_pMember.Location = new Point(65,20);

            m_pGetUserOrGroup = new Button();                 
            m_pGetUserOrGroup.Size = new Size(20,20);
            m_pGetUserOrGroup.Location = new Point(285,20);
            m_pGetUserOrGroup.Image = ResManager.GetIcon("group.ico").ToBitmap();
            m_pGetUserOrGroup.Click += new EventHandler(m_pGetUserOrGroup_Click);
            
            m_pMembers = new ListView();
            m_pMembers.Size = new Size(300,200);
            m_pMembers.Location = new Point(5,45);
            m_pMembers.View = View.List;
            m_pMembers.FullRowSelect = true;
            m_pMembers.HideSelection = false;
            m_pMembers.SelectedIndexChanged += new EventHandler(m_pMembers_SelectedIndexChanged);
               
            m_pMembers_Add = new Button();
            m_pMembers_Add.Size = new Size(70,20);
            m_pMembers_Add.Location = new Point(310,20);
            m_pMembers_Add.Text = "Add";
            m_pMembers_Add.Click += new EventHandler(m_pMembers_Add_Click);

            m_pMembers_Remove = new Button();
            m_pMembers_Remove.Size = new Size(70,20);
            m_pMembers_Remove.Location = new Point(310,45);
            m_pMembers_Remove.Text = "Remove";
            m_pMembers_Remove.Click += new EventHandler(m_pMembers_Remove_Click);

            m_pTab.TabPages[1].Controls.Add(mt_Member);
            m_pTab.TabPages[1].Controls.Add(m_pMember);
            m_pTab.TabPages[1].Controls.Add(m_pGetUserOrGroup);
            m_pTab.TabPages[1].Controls.Add(m_pMembers);
            m_pTab.TabPages[1].Controls.Add(m_pMembers_Add);
            m_pTab.TabPages[1].Controls.Add(m_pMembers_Remove);
            //-----------------------------------------------//

            //--- Access tab UI -----------------------------//
            m_pAccessImages = new ImageList();
            m_pAccessImages.Images.Add(ResManager.GetIcon("user.ico"));
            m_pAccessImages.Images.Add(ResManager.GetIcon("group.ico"));

            m_pAccess = new ListView();
            m_pAccess.Size = new Size(300,220);
            m_pAccess.Location = new Point(5,20);
            m_pAccess.View = View.List;
            m_pAccess.FullRowSelect = true;
            m_pAccess.HideSelection = false;
            m_pAccess.SmallImageList = m_pAccessImages;
            m_pAccess.SelectedIndexChanged += new EventHandler(m_pAccess_SelectedIndexChanged);

            m_pAccess_Add = new Button();
            m_pAccess_Add.Size = new Size(70,20);
            m_pAccess_Add.Location = new Point(310,20);
            m_pAccess_Add.Text = "Add";
            m_pAccess_Add.Click += new EventHandler(m_pAccess_Add_Click);

            m_pAccess_Remove = new Button();
            m_pAccess_Remove.Size = new Size(70,20);
            m_pAccess_Remove.Location = new Point(310,45);
            m_pAccess_Remove.Text = "Remove";
            m_pAccess_Remove.Click += new EventHandler(m_pAccess_Remove_Click);

            m_pTab.TabPages[2].Controls.Add(m_pAccess);
            m_pTab.TabPages[2].Controls.Add(m_pAccess_Add);
            m_pTab.TabPages[2].Controls.Add(m_pAccess_Remove);
            //-----------------------------------------------//
        }
                                                                                                                                                
        #endregion


        #region Events Handling

        #region method m_pGetUserOrGroup_Click

        private void m_pGetUserOrGroup_Click(object sender, EventArgs e)
        {
            wfrm_se_UserOrGroup frm = new wfrm_se_UserOrGroup(m_pVirtualServer,true,false);
            if(frm.ShowDialog(this) == DialogResult.OK){
                m_pMember.Text = frm.SelectedUserOrGroup;
            }
        }

        #endregion

        #region method m_pMembers_SelectedIndexChanged

        private void m_pMembers_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(m_pMembers.SelectedItems.Count > 0){
                m_pMembers_Remove.Enabled = true;
            }
            else{
                m_pMembers_Remove.Enabled = false;
            }
        }

        #endregion

        #region method m_pMembers_Add_Click

        private void m_pMembers_Add_Click(object sender, EventArgs e)
        {
            // This is new not yet added mailing list, add it.
            if(m_pMailingList == null){
                if(!AddOrUpdate()){
                    return;
                }
            }

            //--- Validate values ----------------------------------------------//
            if(m_pMember.Text == ""){
                MessageBox.Show(this,"Please fill member name !","Error:",MessageBoxButtons.OK,MessageBoxIcon.Error);
                return;
            }
            //------------------------------------------------------------------//

            m_pMailingList.Members.Add(m_pMember.Text);

            LoadMembers(m_pMember.Text);
                        
            m_pMember.Text = "";
        }

        #endregion

        #region method m_pMembers_Remove_Click

        private void m_pMembers_Remove_Click(object sender, EventArgs e)
        {
            if(m_pMembers.SelectedItems.Count > 0){
                m_pMailingList.Members.Remove(m_pMembers.SelectedItems[0].Text);
                LoadMembers("");
            }
        }

        #endregion


        #region method m_pAccess_SelectedIndexChanged

        private void m_pAccess_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(m_pAccess.SelectedItems.Count > 0){
                m_pAccess_Remove.Enabled = true;
            }
            else{
                m_pAccess_Remove.Enabled = false;
            }
        }

        #endregion

        #region method m_pAccess_Add_Click

        private void m_pAccess_Add_Click(object sender, EventArgs e)
        {
            //--- Exclude existing members + group itself ---//
            List<string> excludeList = new List<string>();
            foreach(ListViewItem it in m_pAccess.Items){
                excludeList.Add(it.Text.ToLower());
            }
            //-----------------------------------------------//

            wfrm_se_UserOrGroup frm = new wfrm_se_UserOrGroup(m_pVirtualServer,true,true,true,excludeList);
            if(frm.ShowDialog(this) == DialogResult.OK){
                m_pMailingList.ACL.Add(frm.SelectedUserOrGroup);
                LoadAccess(frm.SelectedUserOrGroup);
            }
        }

        #endregion

        #region method m_pAccess_Remove_Click

        private void m_pAccess_Remove_Click(object sender, EventArgs e)
        {
            if(m_pAccess.SelectedItems.Count > 0){
                m_pMailingList.ACL.Remove(m_pAccess.SelectedItems[0].Text);
                LoadAccess("");
            }
        }

        #endregion


        #region method m_pCancel_Click

        private void m_pCancel_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
            this.Close();
        }

        #endregion

        #region method m_pOk_Click

        private void m_pOk_Click(object sender, EventArgs e)
        {
            AddOrUpdate();

            this.DialogResult = DialogResult.OK;
            this.Close();
        }

        #endregion

        #endregion


        #region method AddOrUpdate

        /// <summary>
        /// Adds or updates mailing list as needed. Returns true if operation was successful.
        /// </summary>
        private bool AddOrUpdate()
        {
            //--- Validate values ----------------------------------------------//
            if(m_pMailingListName.Text == ""){
                MessageBox.Show(this,"Please fill mailing list name !","Error:",MessageBoxButtons.OK,MessageBoxIcon.Error);
                return false;
            }
            if(m_pDomains.SelectedIndex == -1){
                MessageBox.Show(this,"Please choose domain !","Error:",MessageBoxButtons.OK,MessageBoxIcon.Error);
                return false;
            }
            //------------------------------------------------------------------//
            
            // Add new mailing list
            if(m_pMailingList == null){
                m_pMailingList = m_pVirtualServer.MailingLists.Add(
                    m_pMailingListName.Text + "@" + m_pDomains.SelectedItem.ToString(),
                    m_pDescription.Text,
                    m_pEnabled.Checked                  
                );
            }
            // Update mailing list
            else{
                m_pMailingList.Enabled = m_pEnabled.Checked;
                m_pMailingList.Name = m_pMailingListName.Text + "@" + m_pDomains.SelectedItem.ToString();
                m_pMailingList.Description = m_pDescription.Text;
                m_pMailingList.Commit();
            }

            return true;
        }

        #endregion

        #region method LoadDomains

        /// <summary>
        /// Fills domains combo.
        /// </summary>
        private void LoadDomains()
        {
            foreach(Domain domain in m_pVirtualServer.Domains){
                m_pDomains.Items.Add(domain.DomainName);
            }

			if(m_pDomains.Items.Count > 0){
				m_pDomains.SelectedIndex = 0;
			}
        }

        #endregion

        #region method LoadMembers

        /// <summary>
        /// Load mailing list members to UI.
        /// </summary>
        /// <param name="selectedMember">Selects specified member, if it exists.</param>
        private void LoadMembers(string selectedMember)
        {   
            m_pMembers.Items.Clear();
    
            foreach(string member in m_pMailingList.Members){
                ListViewItem it = new ListViewItem(member);
				m_pMembers.Items.Add(it);

                if(selectedMember == member){
                    it.Selected = true;
                }
            }

            m_pMembers_SelectedIndexChanged(this,null);
        }

        #endregion

        #region method LoadAccess

        /// <summary>
        /// Loads mailing list accessing user and groups to UI.
        /// </summary>
        /// <param name="selectedUserOrGroup">Selects specified user or group, if it exists.</param>
        private void LoadAccess(string selectedUserOrGroup)
        {
            m_pAccess.Items.Clear();
    
            foreach(string userOrGroup in m_pMailingList.ACL){
                ListViewItem it = new ListViewItem(userOrGroup);
                if(m_pVirtualServer.Domains.Contains(userOrGroup)){
                    it.ImageIndex = 1;
                }
                else{
                    it.ImageIndex = 0;
                }
				m_pAccess.Items.Add(it);
                    
                if(selectedUserOrGroup == userOrGroup){
                    it.Selected = true;
                }
            }

            m_pAccess_SelectedIndexChanged(this,new EventArgs());
        }

        #endregion


        #region Properties Implementation

        /// <summary>
        /// Gets active mailing list ID.
        /// </summary>
        public string MailingListID
        {
            get{ 
                if(m_pMailingList != null){
                    return m_pMailingList.ID;
                }
                else{
                    return "";
                }
            }
        }

        #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