public static Pop3ReceptionEntity ReceiveEmails(this Pop3ConfigurationEntity config)
 {
     if (config.FullComparation)
     {
         return(ReceiveEmailsFullComparation(config));
     }
     else
     {
         return(ReceiveEmailsPartialComparation(config));
     }
 }
        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();
            }
        }
 public static IQueryable <Pop3ReceptionEntity> Receptions(this Pop3ConfigurationEntity c) =>
 As.Expression(() => Database.Query <Pop3ReceptionEntity>().Where(r => r.Pop3Configuration.Is(c)));
Exemple #4
0
 public static IQueryable <Pop3ReceptionEntity> Receptions(this Pop3ConfigurationEntity c)
 {
     return(ReceptionsExpression.Evaluate(c));
 }
        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);
        }
        public static Pop3ReceptionEntity ReceiveEmailsFullComparation(this Pop3ConfigurationEntity config)
        {
            if (!EmailLogic.Configuration.ReciveEmails)
            {
                throw new InvalidOperationException("EmailLogic.Configuration.ReciveEmails is set to false");
            }

            using (HeavyProfiler.Log("ReciveEmails"))
                using (Disposable.Combine(SurroundReceiveEmail, func => func(config)))
                {
                    Pop3ReceptionEntity reception = Transaction.ForceNew().Using(tr => tr.Commit(
                                                                                     new Pop3ReceptionEntity {
                        Pop3Configuration = config.ToLite(), StartDate = TimeZoneManager.Now
                    }.Save()));

                    var now = TimeZoneManager.Now;
                    try
                    {
                        using (var client = GetPop3Client(config))
                        {
                            var messageInfos = client.GetMessageInfos();

                            var already = messageInfos.Select(a => a.Uid).GroupsOf(50).SelectMany(l =>
                                                                                                  (from em in Database.Query <EmailMessageEntity>()
                                                                                                   let ri = em.Mixin <EmailReceptionMixin>().ReceptionInfo
                                                                                                            where ri != null && l.Contains(ri.UniqueId)
                                                                                                            select KVP.Create(ri.UniqueId, (DateTime?)ri.SentDate))).ToDictionary();

                            using (Transaction tr = Transaction.ForceNew())
                            {
                                reception.NewEmails = messageInfos.Count - already.Count;
                                reception.Save();
                                tr.Commit();
                            }

                            foreach (var mi in messageInfos)
                            {
                                var sent = already.TryGetS(mi.Uid);

                                if (sent == null)
                                {
                                    sent = SaveEmail(config, reception, client, mi);
                                }

                                DeleteSavedEmail(config, now, client, mi, sent);
                            }

                            using (Transaction tr = Transaction.ForceNew())
                            {
                                reception.EndDate = TimeZoneManager.Now;
                                reception.Save();
                                tr.Commit();
                            }

                            client.Disconnect(); //Delete messages now
                        }
                    }
                    catch (Exception e)
                    {
                        var ex = e.LogException();

                        try
                        {
                            using (Transaction tr = Transaction.ForceNew())
                            {
                                reception.EndDate   = TimeZoneManager.Now;
                                reception.Exception = ex.ToLite();
                                reception.Save();
                                tr.Commit();
                            }
                        }
                        catch { }
                    }

                    ReceptionComunication?.Invoke(reception);

                    return(reception);
                }
        }
        public static Pop3ReceptionEntity ReceiveEmailsPartialComparation(this Pop3ConfigurationEntity config)
        {
            if (!EmailLogic.Configuration.ReciveEmails)
            {
                throw new InvalidOperationException("EmailLogic.Configuration.ReciveEmails is set to false");
            }

            using (HeavyProfiler.Log("ReciveEmails"))
                using (Disposable.Combine(SurroundReceiveEmail, func => func(config)))
                {
                    Pop3ReceptionEntity reception = Transaction.ForceNew().Using(tr => tr.Commit(
                                                                                     new Pop3ReceptionEntity {
                        Pop3Configuration = config.ToLite(), StartDate = TimeZoneManager.Now
                    }.Save()));

                    var now = TimeZoneManager.Now;
                    try
                    {
                        using (var client = GetPop3Client(config))
                        {
                            var messageInfos = client.GetMessageInfos().OrderBy(m => m.Number);


                            var lastsEmails = Database.Query <EmailMessageEntity>()
                                              .Where(e => e.Mixin <EmailReceptionMixin>().ReceptionInfo.Reception.Entity.Pop3Configuration.RefersTo(config))
                                              .Select(d => new { d.CreationDate, d.Mixin <EmailReceptionMixin>().ReceptionInfo.UniqueId })
                                              .OrderByDescending(c => c.CreationDate).Take(10).ToDictionary(e => e.UniqueId);


                            List <MessageUid> messagesToSave;
                            if (lastsEmails.Any())
                            {
                                var messageJoinDict = messageInfos.ToDictionary(e => e.Uid).OuterJoinDictionarySC(lastsEmails, (key, v1, v2) => new { key, v1, v2 });
                                var messageMachings = messageJoinDict.Where(e => e.Value.v1 != null && e.Value.v2 != null).ToList();
                                messagesToSave = !messageMachings.Any()? messageInfos.ToList(): messageInfos.Where(m => m.Number > messageMachings.Select(e => e.Value.v1.Value.Number).Max()).ToList();
                            }
                            else
                            {
                                messagesToSave = messageInfos.ToList();
                            }

                            using (Transaction tr = Transaction.ForceNew())
                            {
                                reception.NewEmails = messagesToSave.Count;
                                reception.Save();
                                tr.Commit();
                            }

                            foreach (var mi in messagesToSave)
                            {
                                var sent = SaveEmail(config, reception, client, mi);

                                DeleteSavedEmail(config, now, client, mi, sent);
                            }

                            using (Transaction tr = Transaction.ForceNew())
                            {
                                reception.EndDate = TimeZoneManager.Now;
                                reception.Save();
                                tr.Commit();
                            }

                            client.Disconnect(); //Delete messages now
                        }
                    }
                    catch (Exception e)
                    {
                        var ex = e.LogException();

                        try
                        {
                            using (Transaction tr = Transaction.ForceNew())
                            {
                                reception.EndDate   = TimeZoneManager.Now;
                                reception.Exception = ex.ToLite();
                                reception.Save();
                                tr.Commit();
                            }
                        }
                        catch { }
                    }

                    ReceptionComunication?.Invoke(reception);

                    return(reception);
                }
        }