/// <summary>
        /// Retrieves attachments for an EmailQueueItem
        /// </summary>
        /// <param name="item">The item to get attachments for</param>
        /// <returns></returns>
        public Attachment[] GetAttachments(EmailQueueItem item)
        {
            if (item == null) throw new ArgumentNullException("item");

            TroutLog.Log.Info(string.Format("Retrieving attachments for email {0}", item.ID));

            List<Attachment> attachments = new List<Attachment>();

            if (!Directory.Exists(GetAttachmentDirectory(item))) return attachments.ToArray();

            var attachmentDirectories = Directory.EnumerateDirectories(GetAttachmentDirectory(item));

            foreach (var attachmentDirectory in attachmentDirectories)
            {
                var files = Directory.EnumerateFiles(attachmentDirectory);

                if(files.Any())
                {
                    attachments.Add(new Attachment(files.First()));
                }
            }

            TroutLog.Log.Info(string.Format("Retrieved {0} attachments for email {1}",attachments.Count, item.ID));

            return attachments.ToArray();
        }
        /// <summary>
        /// Saves attachments on the provided MailMessage based on values in the EmailQueueItem
        /// </summary>
        /// <param name="item">EmailQueueItem that attachments are to be saved on</param>
        /// <param name="mailMessage">MailMessage which contains attachments</param>
        public void SaveAttachments(EmailQueueItem item, MailMessage mailMessage)
        {
            if(item == null) throw new ArgumentNullException("item");
            if (mailMessage == null) throw new ArgumentNullException("mailMessage");

            TroutLog.Log.Info(string.Format("Saving {0} attachments for email {1}", mailMessage.Attachments.Count, item.ID));

            for (int i = 0; i < mailMessage.Attachments.Count; i++)
            {
                var attachment = mailMessage.Attachments[i];

                Directory.CreateDirectory(GetAttachmentDirectory(item, i));

                using(FileStream file = new FileStream(GetAttachmentFileName(item, i, attachment), FileMode.OpenOrCreate, FileAccess.ReadWrite))
                {
                    byte[] buffer = new byte[attachment.ContentStream.Length];

                    attachment.ContentStream.Read(buffer, 0, buffer.Length);

                    file.Write(buffer, 0, buffer.Length);
                }
            }

            TroutLog.Log.Info(string.Format("Saved {0} attachments for email {1}", mailMessage.Attachments.Count, item.ID));
        }
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="emailQueueItem"></param>
 /// <param name="isSuccess"></param>
 /// <param name="message"></param>
 /// <param name="sentMailMessage"></param>
 /// <param name="tries"></param>
 public DequeueResultItem(EmailQueueItem emailQueueItem, bool isSuccess, string message, MailMessage sentMailMessage, int tries)
 {
     EmailQueueItem = emailQueueItem;
     Tries = tries;
     SentMailMessage = sentMailMessage;
     Message = message;
     IsSuccess = isSuccess;
 }
        protected override bool ParseArguments(string[] args)
        {
            OptionSet optionSet = new OptionSet().Add("id=", (int v) => EmailID = v);

            try
            {
                optionSet.Parse(args);
            }
            catch (OptionException)
            {
                Console.WriteLine("Error");
                return false;
            }
            
            Email = Repository.First(e => e.ID == EmailID);

            return Email != null;
        }
        /// <summary>
        /// Enqueues a set of MailMessages to be sent
        /// </summary>
        /// <param name="messages"></param>
        public void EnqueueMessages(IEnumerable<MailMessage> messages)
        {
            if (messages == null) throw new ArgumentNullException("messages");

            TroutLog.Log.Info(string.Format("Beginning queuing of {0} messages", messages.Count()));

            List<Tuple<EmailQueueItem, MailMessage>> createdMessages = new List<Tuple<EmailQueueItem, MailMessage>>();

            foreach (var message in messages.Where(m => m != null))
            {
                var emailQueueItem = new EmailQueueItem()
                                         {
                                             To = message.To.ToString(),
                                             Cc = message.CC.ToString(),
                                             Bcc = message.Bcc.ToString(),
                                             Subject = message.Subject,
                                             Body = message.Body,
                                             CreateDate = DateTime.Now,
                                             IsSent = false,
                                             NumberTries = 0,
                                             LastTryDate = null,
                                             SendDate = null,
                                             IsBodyHtml = true,
                                             AttachmentCount = (byte)message.Attachments.Count
                                         };
                
                createdMessages.Add(new Tuple<EmailQueueItem, MailMessage>(emailQueueItem, message));
                
                Repository.Add(emailQueueItem);
            }

            Repository.SaveChanges();

            foreach (var createdMessage in createdMessages)
            {
                if (createdMessage.Item1.AttachmentCount > 0)
                {
                    AttachmentFileSystem.SaveAttachments(createdMessage.Item1, createdMessage.Item2);
                }

                TroutLog.Log.Info(string.Format("{0} was queued", createdMessage.Item1.ID));
            }

        }
 private string GetAttachmentFileName(EmailQueueItem item, int attachmentIndex, Attachment attachment)
 {
     return string.Format("{0}\\{1}",
                          GetAttachmentDirectory(item, attachmentIndex),
                          attachment.Name);
 }
 private string GetAttachmentDirectory(EmailQueueItem item, int attachmentIndex)
 {
     return string.Format("{0}\\{1}a\\",
                          GetAttachmentDirectory(item),
                          attachmentIndex);
 }
 private string GetAttachmentDirectory(EmailQueueItem item)
 {
     return string.Format("{0}\\{1}t\\{2}t\\{3}\\",
                          Config.AttachmentPath,
                          (item.ID/100000).ToString("000\0\0"), //123,456,789 -> 123400
                          (item.ID/1000)%100, //123,456,789 -> 56
                          item.ID);
 }
        private void PurgeAttachments(EmailQueueItem item)
        {
            if (!Directory.Exists(GetAttachmentDirectory(item))) return;

            TroutLog.Log.Info(string.Format("Purging attachments for email {0} attachments", item.ID));

            Directory.Delete(GetAttachmentDirectory(item), true);
        }
        private MailMessage GetMailMessage(EmailQueueItem message, OverrideList overrides)
        {
            var mailMessage = new MailMessage();
            mailMessage.From = Config.FromAddress;
            if (!string.IsNullOrWhiteSpace(message.To)) mailMessage.To.Add(message.To);
            if (!string.IsNullOrWhiteSpace(message.Cc)) mailMessage.CC.Add(message.Cc);
            if (!string.IsNullOrWhiteSpace(message.Bcc)) mailMessage.Bcc.Add(message.Bcc);
            mailMessage.Subject = message.Subject;
            mailMessage.Body = message.Body;
            mailMessage.IsBodyHtml = message.IsBodyHtml;

            mailMessage = StaticOverridesesProvider.StaticOverrides.ApplyOverrides(mailMessage);
            mailMessage = overrides.ApplyOverrides(mailMessage);
            return mailMessage;
        }
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="emailQueueItem"></param>
 /// <param name="message"></param>
 public DequeueListItem(EmailQueueItem emailQueueItem, MailMessage message)
 {
     EmailQueueItem = emailQueueItem;
     Message = message;
 }
 public Attachment[] GetAttachments(EmailQueueItem item)
 {
     return Attachments.ContainsKey(item) ? Attachments[item] : new Attachment[0];
 }
 public void SaveAttachments(EmailQueueItem item, MailMessage mailMessage)
 {
     Attachments[item] = mailMessage.Attachments.ToArray();
 }