Esempio n. 1
0
        public IEnumerator <Email> GetEnumerator()
        {
            int emailSequentialNumber = startIndex == -1 ? connection.NumMessages : startIndex;


            int currentStartIndex = (emailSequentialNumber - count) <= 0
                                ? 1
                                : emailSequentialNumber - count + 1;


            var set = new MessageSet();

            set.HasUids = false;


            set.FromCompactString($"{currentStartIndex}:{connection.NumMessages}");
            if (!set.LastMethodSuccess)
            {
                throw new LatestEmailsException("Error fetching email", connection.LastErrorText);
            }

            EmailBundle newestEmails = connection.FetchBundle(set);

            if (!newestEmails.LastMethodSuccess)
            {
                throw new LatestEmailsException("Error fetching email", connection.LastErrorText);
            }

            for (int i = 0; i < newestEmails.MessageCount; i++)
            {
                yield return(newestEmails.GetEmail(i));
            }
        }
        /// <summary>
        /// Process the new lead emails.
        /// </summary>
        /// <returns>True if it worked.</returns>
        private bool ProcessIncomingLeadEmails()
        {
            Log("Gettting email leads...");

            string  msg     = string.Empty;
            MailMan mailman = ApplicationManager.GetLeadMailman();
            bool    result  = false;

            int nonLeadEmails    = 0;
            int duplicateEmails  = 0;
            int successfulWrites = 0;
            int failedWrites     = 0;
            int bouncedEmails    = 0;

            if (mailman != null)
            {
                Log("Getting all emails...");
                EmailBundle leadEmails = ApplicationManager.GetLeadEmails(mailman, out msg);

                if (leadEmails != null)
                {
                    Log("Found {0} emails.", leadEmails.MessageCount);

                    int   i;
                    Email email = null;
                    for (i = 0; i <= leadEmails.MessageCount - 1; i++)
                    {
                        email = leadEmails.GetEmail(i);

                        Lead lead = ApplicationManager.GetLeadFromFundraisingIdeasEmail(email);

                        bool deleteThisEmail = false;

                        if (lead != null)
                        {
                            Log("Retrieved lead: {0}", lead.ToString());

                            Lead existingLead = DataManager.GetLead(lead.EmailAddress);
                            bool res          = false;

                            if (existingLead == null)
                            {
                                // res = DataManager.WriteLead(lead, DataManager.ObjectWriteMode.Insert);
                                res = DataManager.WriteCustomer(lead, DataManager.ObjectWriteMode.Insert);

                                Log("Write lead to db: {0}", res.ToString());

                                if (res)
                                {
                                    successfulWrites++;
                                }
                                else
                                {
                                    failedWrites++;
                                    throw new ApplicationException("Cannot write lead to db - cannot continue");
                                }
                            }
                            else
                            {
                                Log("Lead exists in db, skipping...");
                                duplicateEmails++;
                            }

                            if (existingLead != null || res)
                            {
                                // Its either a duplicate, or it was inserted ok, either way let's delete it.
                                deleteThisEmail = true;
                            }
                        }
                        else if (email.From.Contains("Mail Delivery Subsystem"))
                        {
                            //
                            // We have a bounced email
                            //
                            string bounceEmail = Functions.GetValueFromText(email.Body, "<(.*@.*)>");

                            string bounceReason = Functions.GetValueFromText(email.Body, "<.*@.*>...(.*)");

                            if (bounceReason == string.Empty)
                            {
                                bounceReason = Functions.GetValueFromText(email.Body, "\\((reason.*55.*)\\)");
                            }

                            if (bounceEmail != string.Empty)
                            {
                                Lead existingLead = DataManager.GetLead(bounceEmail);
                                // email.GetAttachedMessage(0).GetToName(0)

                                if (existingLead == null)
                                {
                                    //
                                    // No email address, let's try by name and status
                                    //
                                    if (email.NumAttachedMessages > 0 && email.GetAttachedMessage(0).NumTo > 0)
                                    {
                                        PersonName name = new PersonName();
                                        if (name.ParseFullName(email.GetAttachedMessage(0).GetToName(0)))
                                        {
                                            existingLead = DataManager.GetLeadByNameAndStatus(name.FirstName, name.LastName, Lead.LeadStatusCode.lscEmailSent);
                                        }
                                    }
                                }

                                if (existingLead != null)
                                {
                                    bool res = DataManager.WriteLeadStatusLog(existingLead, Lead.LeadStatusCode.lscEmailBounced1, bounceReason.Substring(0, Math.Min(150, bounceReason.Length)));
                                    Log("Bounced email from {0} for reason \"{1}\", update status log = {2}", bounceEmail, bounceReason, res);

                                    if (res)
                                    {
                                        deleteThisEmail = true;
                                    }
                                }
                                else
                                {
                                    Log("Bounced email from {0}, but can't find email addr in db.", bounceEmail);
                                }
                            }
                            else
                            {
                                Log("We have a bounced email, but can't get the email address from the body.");
                            }
                            bouncedEmails++;
                        }
                        else if (email.Subject.Contains("Out of Office") || email.Subject.Contains("AutoReply"))
                        {
                            Log("Found autoreply from: {0}, deleting", email.From);
                            deleteThisEmail = true;
                        }
                        else if (email.Subject == "echo")
                        {
                            Log("Found echo request from: {0}", email.FromAddress);

                            Lead testLead = new Lead();

                            testLead.ParseFullName(email.FromName);
                            testLead.LeadInfoText = email.GetPlainTextBody();
                            testLead.EmailAddress = email.FromAddress;
                            ApplicationManager.SetFundraisingIdeasProperties(testLead);

                            if (testLead.TemplateCurrent == null)
                            {
                                testLead.TemplateCurrent = DataManager.GetTemplate("Hockey");   // Hockey template
                            }

                            ProcessNewDatabaseLeads(testLead);

                            deleteThisEmail = true;
                        }
                        else if (email.Subject == "unsubscribe")
                        {
                            Log("Found unsubscribe request from: {0}", email.FromAddress);

                            Lead existingLead = DataManager.GetLead(email.FromAddress);

                            if (existingLead != null)
                            {
                                bool res = DataManager.WriteLeadStatusLog(existingLead, Lead.LeadStatusCode.lscUnsubscribeRequestReceived);
                                Log("Bye bye {0}; update status log = {1}", existingLead.FirstName, res);

                                if (res)
                                {
                                    deleteThisEmail = true;
                                }
                            }
                            else
                            {
                                Log("Odd, can't find email address in db.  Doing nothing.");
                            }
                        }
                        else
                        {
                            Log("Skipping non-lead email from: {0}", email.FromAddress);
                            nonLeadEmails++;
                        }

                        if (deleteThisEmail)
                        {
                            //  Delete this email.
                            bool success = mailman.DeleteEmail(email);
                            if (success != true)
                            {
                                Log("Strangeness, can't delete POP3 email: {0}", mailman.LastErrorText);
                            }
                        }
                    }
                    Log("Ending email session...");
                    mailman.Pop3EndSession();

                    Log("Summary - total emails found: {0}, non-lead: {1}, duplicate: {2}, newly inserted: {3}",
                        leadEmails.MessageCount,
                        nonLeadEmails,
                        duplicateEmails,
                        successfulWrites);

                    result = true;
                }
                else
                {
                    //
                    // Happens if tcp/ip issue.  Thanks Time Warner!
                    //
                    Log("Can't get POP3 emails.  Msg was: {0}", msg);
                }
            }
            else
            {
                Log("Can't get mailman component - is it registered and licensed?");
            }

            return(result);
        }