Пример #1
0
        private void EmailList_SelectedIndexChanged(object sender, EventArgs e)
        {
            long emailUID = Convert.ToInt64(EmailList.SelectedItem);

            var eml = imap.GetMessageByUID(emailUID);
            IMail email = new MailBuilder().CreateFromEml(eml);

            Subject.Text = email.Subject.ToString();
            Sender.Text = email.Sender.ToString();
            Body.Text = email.GetTextFromHtml().ToString();
        }
Пример #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 }));
        }