/// <summary>sends STATUS command</summary>
        /// <remarks>valid in authenticated state</remarks>
        private ImapCommandResult StatusInternal(string mailboxName, ImapStatusDataItem statusDataItem, out ImapStatusAttributeList statusAttributes, out ImapMailbox statusMailbox)
        {
            RejectNonAuthenticatedState();

              RejectInvalidMailboxNameArgument(mailboxName);

              if (statusDataItem == null)
            throw new ArgumentNullException("statusDataItem");

              /*
               * 6.3.10. STATUS Command
               *
               *            Note: The STATUS command is intended to access the
               *            status of mailboxes other than the currently selected
               *            mailbox.  Because the STATUS command can cause the
               *            mailbox to be opened internally, and because this
               *            information is available by other means on the selected
               *            mailbox, the STATUS command SHOULD NOT be used on the
               *            currently selected mailbox.
               */
              var existStatusMailbox = mailboxManager.GetExist(mailboxName);

              if (existStatusMailbox != null) {
            if (existStatusMailbox == selectedMailbox)
              throw new ImapProtocolViolationException("the STATUS command SHOULD NOT be used on the currently selected mailbox");

            if (existStatusMailbox.IsUnselectable)
              throw new ImapProtocolViolationException("the STATUS command SHOULD NOT be used on the mailbox that has \\Noselect or \\NonExistent attribute");
              }

              statusAttributes = null;
              statusMailbox = null;

              using (var t = new StatusTransaction(connection)) {
            // mailbox name
            t.RequestArguments["mailbox name"] = new ImapMailboxNameString(mailboxName);

            // status data item names
            t.RequestArguments["status data item names"] = statusDataItem;

            if (ProcessTransaction(t).Succeeded) {
              statusMailbox = mailboxManager.GetExistOrCreate(mailboxName);

              statusAttributes = t.Result.Value;
              statusMailbox.UpdateStatus(statusAttributes);
            }
            else {
              ProcessMailboxRefferalResponse(t.Result.TaggedStatusResponse);
            }

            return t.Result;
              }
        }
        /// <summary>sends STATUS command</summary>
        /// <remarks>valid in authenticated state</remarks>
        public ImapCommandResult Status(string mailboxName, ImapStatusDataItem statusDataItem, out ImapStatusAttributeList statusAttributes)
        {
            ImapMailbox discard;

              return StatusInternal(mailboxName, statusDataItem, out statusAttributes, out discard);
        }