quartz定時發送郵件demo

第一步:在nuget管理中依賴quartz(還會用到log4net,autofac,entityframework,System.Net.Mail)
第二步:在global.asax中註冊

  public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            log4net.Config.XmlConfigurator.Configure();
            //ioc配置(?)
            var builder = new ContainerBuilder();
            builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();//把當前程序集中的 Controller 都註冊
            //獲取所有相關類庫的程序集
            Assembly[] assemblies = new Assembly[] { Assembly.Load("ZSZ.Service") };
            //當請求這個程序集下的接口裏面的方法時候。就會返回對應的Services類裏面的實現
            builder.RegisterAssemblyTypes(assemblies)
            .Where(type => !type.IsAbstract
                    && typeof(IServiceSupport).IsAssignableFrom(type))
                    .AsImplementedInterfaces().PropertiesAutowired();  //如果一個實現類中定義了其他類型的接口屬性,會自動
            //給屬性進行“注入”
            //Assign:賦值
            //type1.IsAssignableFrom(type2)   type2是否實現了type1接口/type2是否繼承自type1
            //typeof(IServiceSupport).IsAssignableFrom(type)只註冊實現了IServiceSupport的類
            //避免其他無關的類註冊到AutoFac中

            var container = builder.Build();
            //註冊系統級別的DependencyResolver,這樣當MVC框架創建Controller等對象的時候都是管Autofac要對象。
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));//!!!

            startQuartz();//啓動定時任務
        }

        private void startQuartz()
        {
            IScheduler sched = new StdSchedulerFactory().GetScheduler();

            //給老闆的報表開始
            JobDetailImpl jdBossReport
                = new JobDetailImpl("jdBossReport", typeof(BossReportJob));
            IMutableTrigger triggerBossReport
                = CronScheduleBuilder.DailyAtHourAndMinute(14, 26).Build();//每天14:26執行一次
            triggerBossReport.Key = new TriggerKey("triggerBossReport");
            sched.ScheduleJob(jdBossReport, triggerBossReport);
            //給老闆的報表結束
            sched.Start();

        }
    }

第三步:設置定時任務

 //Quartz定時任務
    public class BossReportJob : IJob
    {
        private static ILog log
           = LogManager.GetLogger(typeof(BossReportJob));
        public void Execute(IJobExecutionContext context)
        {
            log.Debug("準備收集今日新增房源數量");
            try
            {
                string bossEmails;//老闆郵箱
                string smtpServer, smtpUserName, smtpPassword, smtpEmail;
                StringBuilder sbMsg = new StringBuilder();
                var container = AutofacDependencyResolver.Current.ApplicationContainer;//在quartz這個單獨的線程中,因爲autofac無法幫我們自動注入屬性值,因爲得通過這樣的方式獲取接口的對象值
                using (container.BeginLifetimeScope())
                {
                    var cityService = container.Resolve<ICityService>();
                    var houseService = container.Resolve<IHouseService>();
                    var settingService = container.Resolve<ISettingService>();
                    bossEmails = settingService.GetValue("老闆郵箱");//讀取配置中的老闆郵箱 
                    smtpServer = settingService.GetValue("SmtpServer");
                    smtpUserName = settingService.GetValue("SmtpUserName");
                    smtpPassword = settingService.GetValue("SmtpPassword");//密碼或者授權碼
                    smtpEmail = settingService.GetValue("SmtpEmail");
                    foreach (var city in cityService.GetAllCity())
                    {
                        long count = houseService.GetTodayNewHouseCount(city.Id);
                        sbMsg.Append(city.Name).Append("新增房源的數量是:")
                            .Append(count).AppendLine();
                    }
                }
                log.Debug("收集新增房源數量完成" + sbMsg);
                //要使用System.Net.Mail下的類,不要用System.Web.Mail下的類
                using (MailMessage mailMessage = new MailMessage())
                {
                    using (SmtpClient smtpClient = new SmtpClient(smtpServer))
                    {
                        //由於可能有多個老闆都想收到這個郵件,因此在配置中可以用分號
                        //分隔開各個老闆的郵箱地址
                        foreach (var bossEmail in bossEmails.Split(';'))
                        {
                            mailMessage.To.Add(bossEmail);
                        }
                        mailMessage.Body = sbMsg.ToString();
                        mailMessage.From = new MailAddress(smtpEmail);
                        mailMessage.Subject = "今日新增房源數量報表";
                        smtpClient.Credentials
                            = new System.Net.NetworkCredential(smtpUserName, smtpPassword);//如果啓用了“客戶端授權碼”,要用授權碼代替密碼
                        smtpClient.Send(mailMessage);
                    }
                }
                log.Debug("給老闆發送新增房源數量報表完成");
            }
            catch (Exception ex)
            {
                log.Error("給老闆發報表出錯", ex);
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章