/// <summary>
        /// Sends an email notification
        /// with the card number to all users.
        /// </summary>
        /// <param name="smtpHostname"></param>
        /// <param name="senderAddress"></param>
        /// <param name="targetIdField"></param>
        public void SendEmailsToAllUsers(string smtpHostname, string senderAddress, int targetIdField)
        {
            try
            {
                if (!string.IsNullOrEmpty(smtpHostname) && !string.IsNullOrEmpty(senderAddress))
                {
                    string   resolvedIdField = PaperCutProxyWrapper.ResolveCardField(targetIdField);
                    string[] usernames       = PaperCutProxyWrapper.GetUserAccounts(_serverProxy);

                    List <string> emails    = null;
                    List <string> idNumbers = null;

                    for (int i = 0; i < usernames.Length; i++)
                    {
                        string[] retrievedProperties = _serverProxy.GetUserProperties(usernames[i],
                                                                                      new string[] { Common.Constants.PaperCut.Properties.Email, resolvedIdField });

                        emails.Add(retrievedProperties[0]);
                        idNumbers.Add(retrievedProperties[1]);
                    }

                    SmtpClient smtpClient = new SmtpClient();
                    smtpClient.Host                  = smtpHostname;
                    smtpClient.Port                  = 25;
                    smtpClient.DeliveryMethod        = SmtpDeliveryMethod.Network;
                    smtpClient.UseDefaultCredentials = false;

                    for (int i = 0; i < usernames.Length; i++)
                    {
                        SendEmail(smtpClient, senderAddress, emails[i], idNumbers[i]);
                    }
                }
            }
            catch
            {
                Console.WriteLine(Common.Constants.Smtp.Email.UnableToSend);
            }
        }
        /// <summary>
        /// Updates the card numbers for all users.
        /// </summary>
        /// <param name="updateOnlyIfBlank"></param>
        /// <param name="targetIdField"></param>
        /// <param name="numberOfChars"></param>
        public void UpdateAllCardNumbers(bool updateOnlyIfBlank, int targetIdField, int numberOfChars)
        {
            try
            {
                if (numberOfChars >= Common.Constants.PaperCut.Constants.MinimumNumberOfCharacters &&
                    numberOfChars <= Common.Constants.PaperCut.Constants.MaximumNumberOfCharacters)
                {
                    string[] existingUsers  = PaperCutProxyWrapper.GetUserAccounts(_serverProxy);
                    string[] newCardNumbers = new string[existingUsers.Length];
                    newCardNumbers = SecurityStringHelper.GenerateIdentifiers(numberOfChars, newCardNumbers.Length).ToArray();

                    if (updateOnlyIfBlank)
                    {
                        int      updatedCount = 0;
                        int      skippedCount = 0;
                        string[] existingCardNumbers;

                        existingCardNumbers = PaperCutProxyWrapper.GetCardNumbers(_serverProxy, existingUsers, targetIdField);

                        Console.WriteLine(Common.Constants.PaperCut.Messages.UpdatingOnlyUsersWithBlankCardNumbers);
                        Console.WriteLine(Common.Constants.ConsoleSpacing.HashesWithNewLine);

                        for (int i = 0; i < existingUsers.Length; i++)
                        {
                            if (string.IsNullOrEmpty(existingCardNumbers[i]))
                            {
                                PaperCutProxyWrapper.SetCardNumber(_serverProxy, existingUsers[i], newCardNumbers[i], targetIdField);

                                updatedCount++;

                                if (updatedCount > 0 && updatedCount % 100 == 0)
                                {
                                    Console.WriteLine(string.Format(Common.Constants.PaperCut.Messages.UpdatedNUsersSoFar, updatedCount));
                                }
                            }
                            else
                            {
                                skippedCount++;

                                if (skippedCount > 0 && skippedCount % 100 == 0)
                                {
                                    Console.WriteLine(string.Format(Common.Constants.PaperCut.Messages.SkippedNUsersSoFar, skippedCount));
                                }
                            }
                        }

                        Console.WriteLine();
                        Console.WriteLine(string.Format(Common.Constants.PaperCut.Messages.UpdatedAndSkippedNUsers, updatedCount, skippedCount));
                        Console.WriteLine(Common.Constants.ConsoleSpacing.Hashes);
                    }
                    else
                    {
                        PaperCutProxyWrapper.SetCardNumbers(_serverProxy, existingUsers, newCardNumbers, targetIdField);

                        Console.WriteLine();
                        Console.WriteLine(string.Format(Common.Constants.PaperCut.Messages.UpdatedNUsers, existingUsers.Length));
                        Console.WriteLine(Common.Constants.ConsoleSpacing.HashesWithNewLine);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
        }