Пример #1
0
        private void ReadMessages_Load(object sender, EventArgs e)
        {
            UserEmailLabel.Text = LoginForm.UserNameValue + " Mail List:";
            using (Pop3 pop3 = new Pop3())
            {
                pop3.Connect("pop.gmail.com", 995, true);
                pop3.UseBestLogin("recent:" + LoginForm.LoginValue, LoginForm.PasswordValue);
                List <string> UidList = pop3.GetAll();

                foreach (string uid in UidList)
                {
                    IMail email = new MailBuilder().CreateFromEml(pop3.GetMessageByUID(uid));
                    MailListBox.Items.Add(email.From);
                    MailListBox.Items.Add(email.GetBodyAsText());
                    MailListBox.Items.Add(" ");
                }
                pop3.Close();
            }
        }
Пример #2
0
        public async Task <IActionResult> GetBankTransactions(string accountNumber = null)
        {
            List <string> vs = new List <string>();

            BankAccount bankAccount = await FindBankAccount(accountNumber);

            GoogleAuth googleAuth = await GetGoogleAuth(bankAccount?.AlertEmail, bankAccount?.AccountNumber);

            List <BankTransaction> bankTransactions = new List <BankTransaction>();

            //long? largestUID = googleAuth.LargestUID;

            try
            {
                using (Imap imap = new Imap())
                {
                    GoogleApi api  = new GoogleApi(googleAuth?.AccessToken);
                    string    user = api.GetEmail();

                    imap.ConnectSSL("imap.gmail.com");  // or ConnectSSL for SSL
                    imap.LoginOAUTH2(user, googleAuth?.AccessToken);

                    FolderStatus status = imap.SelectInbox();


                    imap.SelectInbox();

                    //while (true)
                    //{
                    //Uncomment the line below for instant push  email notification
                    //FolderStatus currentStatus = imap.Idle();
                    List <long> uids;
                    if (googleAuth.LargestUID == 0 || googleAuth.UIDValidity != status.UIDValidity)
                    {
                        //get emails in the last one month
                        uids = imap.Search().Where(
                            Expression.And(
                                Expression.From("*****@*****.**"),
                                Expression.SentSince(DateTime.Now.AddMonths(-1)))
                            );
                    }
                    else
                    {
                        uids = imap.Search().Where(
                            Expression.And(
                                Expression.From("*****@*****.**"),
                                Expression.UID(Range.From(googleAuth.LargestUID))
                                ));
                        uids.Remove(googleAuth.LargestUID);
                    }
                    //List<MessageInfo> infos = imap.GetMessageInfoByUID(uids);

                    //int counter = 0;
                    foreach (long uid in uids)
                    {
                        //counter++;
                        MessageInfo info = imap.GetMessageInfoByUID(uid);
                        //var
                        if (info.Envelope.Subject.Contains("Transaction Alert [Credit", StringComparison.OrdinalIgnoreCase))
                        {
                            continue;
                        }
                        var   eml   = imap.GetMessageByUID(uid);
                        IMail email = new MailBuilder().CreateFromEml(eml);

                        //List<long> uids = imap.Search(Expression.From("gtbank.com"));
                        //for (int i = 1; i < 20; i++)
                        //{

                        //IMail email = new MailBuilder()
                        //    .CreateFromEml(imap.GetMessageByUID(uids[uids.Count - i]));
                        if (email.Subject.Contains("Transaction Alert [Debit", StringComparison.OrdinalIgnoreCase) ||
                            (email.GetBodyAsText().Contains("eLectronic Notification Service", StringComparison.OrdinalIgnoreCase) &&
                             email.GetBodyAsText().Contains("Debit transaction", StringComparison.OrdinalIgnoreCase))
                            //&& email.GetBodyAsText().Contains($"{bankRegistered.AccountNo}")
                            )
                        {
                            Dictionary <string, string> transactionDetails = new Dictionary <string, string>();
                            string emailAsText      = email.GetBodyAsText();
                            string emailAsTextTwo   = email.GetTextFromHtml();
                            string emailAsTextThree = email.Text;
                            if (emailAsText.Length < 10)
                            {
                                continue;
                            }

                            transactionDetails = ExtractText(emailAsText);
                            if (transactionDetails["Account Number"] != accountNumber)
                            {
                                continue;
                            }
                            BankTransaction transaction = new BankTransaction
                            {
                                //transaction.AccountNo = transactionDetails["AccountNo"];
                                Subject = email.Subject
                            };
                            if (email.Subject.Contains("Debit", StringComparison.OrdinalIgnoreCase) ||
                                email.GetBodyAsText().Contains("Debit", StringComparison.OrdinalIgnoreCase))
                            {
                                transaction.TransactionType = "Debit";
                            }
                            if (email.Subject.Contains("Credit", StringComparison.OrdinalIgnoreCase) ||
                                email.GetBodyAsText().Contains("Credit", StringComparison.OrdinalIgnoreCase))
                            {
                                transaction.TransactionType = "Credit";
                            }
                            transaction.Description       = transactionDetails["Description"];
                            transaction.TransactionAmount = Convert.ToDecimal(transactionDetails["Amount"]);
                            transaction.Remarks           = transactionDetails["Remarks"];
                            transaction.AccountNumber     = transactionDetails["Account Number"];
                            //You can try to format the datetime to a britain english culture, IFormatProvider
                            transaction.TransactionDate = Convert.ToDateTime(transactionDetails["Date"] + " " + transactionDetails["Time"]);
                            bool IsExists = await VerifyTransaction(transaction.AccountNumber, transaction.TransactionDate,
                                                                    transaction.TransactionType, transaction.TransactionAmount);

                            if (IsExists)
                            {
                                continue;
                            }

                            //appuser Id is set in the Save transaction Method
                            await SaveTransaction(transaction);

                            bankTransactions.Add(transaction);
                        }
                    }
                    UpdateLargestUID(uids[(uids.Count) - 1], googleAuth, status.UIDValidity);
                    //}
                    imap.Close();
                }
            }
            catch (ImapResponseException ex)
            {
                Debug.WriteLine(ex.Message);
                _logger.LogError(ex.StackTrace);
                googleAuth.AccessToken = await RefreshAccessToken(googleAuth.RefreshToken);

                UpdateGoogleOAuth(googleAuth);
                await GetBankTransactions(accountNumber);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                //log exception
                _logger.LogError(ex.StackTrace);
            }
            return(RedirectToAction("Index", "BankTransaction", new { accountId = bankAccount.BankAccountId }));
        }
Пример #3
0
        void update_emails(int v)
        {
            string      sFrom, sSubject, sBody, sAddr;
            long        c = 0;
            IMail       mail;
            bool        m_error = false;
            MessageInfo mi;

            lvemails.Sorting = SortOrder.None;
            lvcs.Order       = SortOrder.None;
            lvcs.SortColumn  = 0;

            sbText.Text = "Checking new emails...";

            foreach (long i in mail_ids)
            {
                if (!updating_emails)
                {
                    break;
                }

                c++;
                if (id_exists(i))
                {
                    continue;
                }

                mi = imapclient.GetMessageInfoByUID(i);
                if (((long)mi.Envelope.Size) > 2000000)
                {
                    sbText.Text = "Skipped: (" + mi.Envelope.From[0].Address + ", " + ((long)mi.Envelope.Size / 1048576.0f).ToString("0.00") + " mb), " + c.ToString() + " of " + mail_ids.Count.ToString();
                    continue;
                }
                sbText.Text = "Opening message: (" + mi.Envelope.From[0].Address + ", " + mi.Envelope.Size.ToString() + " bytes), " + c.ToString() + " of " + mail_ids.Count.ToString();

                try
                {
                    mail = new MailBuilder().CreateFromEml(imapclient.GetMessageByUID(i));
                }
                catch (Limilabs.Client.IMAP.ImapResponseException ire)
                {
                    updating_emails = false;
                    sbText.Text     = "Failed to open message: " + ire.Message;
                    return;
                }

                sFrom    = mail.From[0].Name;
                sAddr    = mail.From[0].Address;
                sSubject = mail.Subject.Replace("\"", "^");
                sBody    = mail.GetBodyAsText().Replace("\"", "^");
                ListViewItem li = lvemails.Items.Add(i.ToString("00000"));
                li.Tag = i;
                li.SubItems.Add(sAddr);
                li.SubItems.Add(sSubject);
                if (sBody.Length > 15)
                {
                    li.SubItems.Add(sBody.Substring(0, 14) + "...");
                }
                else
                {
                    li.SubItems.Add(sBody);
                }
                li.SubItems.Add("NEW");

                sbText.Text = "Adding " + sAddr + "...";
                runcommand("insert into emails(uid,sfrom,emailaddress,subject,body,processed) values(" + i.ToString() + "," + Program.enq(sFrom) + "," + Program.enq(sAddr) + "," + Program.enq(sSubject) + "," + Program.enq(sBody) + ",false)");

                m_error = false;
                foreach (MimeData md in mail.Attachments)
                {
                    if (!Path.GetExtension(md.SafeFileName).ToUpper().Equals(".TXT"))
                    {
                        string sp = check_file(Path.Combine(Program.rootfolder, @"REPLIES", md.SafeFileName));
                        runcommand("insert into files values(" + i.ToString() + "," + Program.enq(Path.GetFileName(sp)) + ")");
                        try
                        {
                            sbText.Text = "Saving " + sFrom + " file: " + sp + "...";
                            md.Save(sp);
                        }
                        catch (Limilabs.Client.ServerException e)
                        {
                            sbText.Text = "Can't save file: " + e.Message;
                            m_error     = true;
                        }
                    }
                }

                if (!m_error)
                {
                    foreach (MimeData md2 in mail.Visuals)
                    {
                        if (!Path.GetExtension(md2.SafeFileName).ToUpper().Equals(".TXT"))
                        {
                            string sp2 = check_file(Path.Combine(Program.rootfolder, @"REPLIES", md2.SafeFileName));
                            runcommand("insert into files values(" + i.ToString() + ",\"" + Path.GetFileName(sp2) + "\")");
                            try
                            {
                                sbText.Text = "Saving " + sFrom + " file: " + sp2 + "...";
                                md2.Save(sp2);
                            }
                            catch (Limilabs.Client.ServerException e)
                            {
                                sbText.Text = "Can't save: " + e.Message;
                                m_error     = true;
                            }
                        }
                    }
                }
                if (m_error)
                {
                    Program.emaildbCmd.CommandText = "delete * from emails where uid = " + i.ToString();
                    Program.emaildbCmd.ExecuteNonQuery();
                    Program.emaildbCmd.CommandText = "delete * from files where uid = " + i.ToString();
                    Program.emaildbCmd.ExecuteNonQuery();
                    li.SubItems[1].Text = "Can't open";
                }
            }
            updating_emails = false;
            if (lvemails.Items.Count > 0)
            {
                lvemails.Items[lvemails.Items.Count - 1].Selected = true;
                lvemails.Items[lvemails.Items.Count - 1].EnsureVisible();
            }
            mailcount.Text = "Mails: " + lvemails.Items.Count.ToString();
            if (!m_error)
            {
                sbText.Text = "Done.";
            }
        }