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(); } }