// Asynchronously do the 'service' works
        private void DoWork()
        {
            DateTime            today = DateTime.Now;
            VsmartsellDBContext db    = new VsmartsellDBContext();

            SendMailForInvoice(today, db);
            SendMailForNearEnd(today, db);
            SendMailAfterEnd(today, db);
            db.Dispose();
        }
        private void SendMailForInvoice(DateTime today, VsmartsellDBContext db)
        {
            var gds = from p in db.DSLichSuGD
                      join m in db.DSKhachHang on p.MaKH equals m.MaKH
                      where p.Paid == false && (DbFunctions.TruncateTime(p.NgayGD) < DbFunctions.TruncateTime(today))
                      select new { dsgd = p, tenkh = m.TenKH };

            gds = gds.Where(a => (DbFunctions.DiffDays(a.dsgd.NgayGD, today) % 7) == 0);
            var nguoithus = from p in db.DSNguoiDung
                            join m in gds on p.userid equals m.dsgd.NguoiThu
                            orderby p.userid
                            select new { info = p };
            var listnguoithu = nguoithus.Distinct().ToList();
            var size         = gds.Count();
            //string msg = "";
            string Mail_from    = "*****@*****.**";
            string password     = "******";
            string Mail_subject = "Nhắc nhở về hóa đơn chưa thanh toán (" + today.ToLongDateString() + ")";

            if (size != 0)
            {
                foreach (var nguoithu in listnguoithu)
                {
                    string msg = "";
                    foreach (var gd in gds)
                    {
                        if (nguoithu.info.userid == gd.dsgd.NguoiThu)
                        {
                            msg += "Mã hóa đơn: " + gd.dsgd.MaGD + "  ---  Khách hàng: " + gd.tenkh.ToUpper() + "  ---  Ngày tạo hóa đơn: " + gd.dsgd.NgayGD.ToString("dd/MM/yyyy") +
                                   "  ---  http://localhost:3469/vsmartsell/details/" + gd.dsgd.MaKH + " \n";
                        }
                    }
                    string Mail_to   = nguoithu.info.email;
                    string Mail_body = msg + "\nDanh sách trên là các hóa đơn đã được " + nguoithu.info.firstname.ToUpper() + " " + nguoithu.info.lastname.ToUpper() +
                                       " tạo nhưng chưa được thanh toán.\nThư này để nhắc nhở việc thu tiền các khách hàng có tên trong danh sách trên.\nThân.";
                    MailMessage MM = new MailMessage(Mail_from, Mail_to, Mail_subject, Mail_body);
                    foreach (var mail in db.DSNoticeMail)
                    {
                        if (mail.MailType == "invoice")
                        {
                            MM.To.Add(mail.Email);
                        }
                    }
                    SmtpClient SC = new SmtpClient();
                    SC.Host        = "Smtp.gmail.com";
                    SC.Port        = 587;
                    SC.Credentials = new System.Net.NetworkCredential(Mail_from, password);
                    SC.EnableSsl   = true;
                    SC.Send(MM);
                }
            }
        }
        private void SendMailAfterEnd(DateTime today, VsmartsellDBContext db)
        {
            var khs = from p in db.DSKhachHang
                      where p.Archive == false && (DbFunctions.TruncateTime(p.NgayHetHan) < DbFunctions.TruncateTime(today))
                      select p;

            khs = khs.Where(a => (DbFunctions.DiffDays(a.NgayHetHan, DbFunctions.AddDays(today, -1)) % 7) == 0);
            var    size = khs.Count();
            string msg  = "";

            if (size != 0)
            {
                foreach (var kh in khs)
                {
                    msg += "Khách hàng: " + kh.TenKH.ToUpper() + "  ---  Ngày hết hạn: " + kh.NgayHetHan.ToString("dd/MM/yyyy") +
                           "  ---  http://localhost:3469/vsmartsell/details/" + kh.MaKH + " \n";
                }
                var mails = from m in db.DSNoticeMail
                            where m.MailType == "afterend"
                            select m;
                var size2 = mails.Count();
                if (size2 > 0)
                {
                    string      Mail_from = "*****@*****.**";
                    string      password  = "******";
                    MailMessage MM        = new MailMessage();
                    MM.From = new MailAddress(Mail_from);
                    foreach (var mail in mails)
                    {
                        MM.To.Add(mail.Email);
                    }
                    string Mail_subject = "Nhắc nhở về những khách hàng đã hết hạn (" + today.ToLongDateString() + ")";
                    string Mail_body    = msg + "\nDanh sách trên là những khách hàng đã hết hạn sử dụng.\nThư này để nhắc nhở việc hỏi thăm những khách hàng trên có nhu cầu muốn tiếp tục sử dụng nữa không.\nThân.";
                    MM.Subject = Mail_subject;
                    MM.Body    = Mail_body;
                    SmtpClient SC = new SmtpClient();
                    SC.Host        = "Smtp.gmail.com";
                    SC.Port        = 587;
                    SC.Credentials = new System.Net.NetworkCredential(Mail_from, password);
                    SC.EnableSsl   = true;
                    SC.Send(MM);
                }
            }
        }