private static DateTime?SaveEmail(Pop3ConfigurationEntity config, Pop3ReceptionEntity reception, IPop3Client client, MessageUid mi)
        {
            DateTime?sent = null;

            {
                using (OperationLogic.AllowSave <EmailMessageEntity>())
                    using (Transaction tr = Transaction.ForceNew())
                    {
                        string rawContent = null;
                        try
                        {
                            var email = client.GetMessage(mi, reception.ToLite());

                            email.Subject = email.Subject == null ? "No Subject" : email.Subject.Replace('\n', ' ').Replace('\r', ' ');

                            if (email.Recipients.IsEmpty())
                            {
                                email.Recipients.Add(new EmailRecipientEntity
                                {
                                    EmailAddress = config.Username,
                                    Kind         = EmailRecipientKind.To,
                                });
                            }

                            Lite <EmailMessageEntity> duplicate = Database.Query <EmailMessageEntity>()
                                                                  .Where(a => a.BodyHash == email.BodyHash)
                                                                  .Select(a => a.ToLite())
                                                                  .FirstOrDefault();

                            if (duplicate != null && AreDuplicates(email, duplicate.Retrieve()))
                            {
                                var dup = duplicate.Entity;

                                email.AssignEntities(dup);

                                AssociateDuplicateEmail?.Invoke(email, dup);
                            }
                            else
                            {
                                AssociateNewEmail?.Invoke(email);
                            }

                            email.Save();

                            sent = email.Mixin <EmailReceptionMixin>().ReceptionInfo.SentDate;

                            tr.Commit();
                        }
                        catch (Exception e)
                        {
                            e.Data["rawContent"] = rawContent;

                            var ex = e.LogException();

                            using (Transaction tr2 = Transaction.ForceNew())
                            {
                                new Pop3ReceptionExceptionEntity
                                {
                                    Exception = ex.ToLite(),
                                    Reception = reception.ToLite()
                                }.Save();

                                tr2.Commit();
                            }
                        }
                    }
            }

            return(sent);
        }
        private static void DeleteSavedEmail(Pop3ConfigurationEntity config, DateTime now, IPop3Client client, MessageUid mi, DateTime?sent)
        {
            if (config.DeleteMessagesAfter != null && sent != null &&
                sent.Value.Date.AddDays(config.DeleteMessagesAfter.Value) < TimeZoneManager.Now.Date)
            {
                client.DeleteMessage(mi);

                (from em in Database.Query <EmailMessageEntity>()
                 let ri = em.Mixin <EmailReceptionMixin>().ReceptionInfo
                          where ri != null && ri.UniqueId == mi.Uid
                          select em)
                .UnsafeUpdate()
                .Set(em => em.Mixin <EmailReceptionMixin>().ReceptionInfo.DeletionDate, em => now)
                .Execute();
            }
        }