熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET定時發送郵件總結

2013-11-13 09:56:26  來源: .NET編程 

  香港那邊公司的市場部開會時要求我們這邊實現一個定時發送郵件的功能即在每天下午點左右定時把今天已通過三審的訂單信息發給市場部的經理告訴他哪些訂單已經通過了終審平時只知道如何發送郵件但不知如何定時發送郵件於是百度了一下總結起來有以下那麼三種

  ()做一個winform 來定時發郵件然後通過windows計劃任務設置為指定時間每次自動運行運行完畢後自動關閉

  ()用sqlserver 數據庫實現發郵件用sqlserver實現發郵件的存儲過程然後制定一個作業制定時間運行

  ()在 Globalasax 文件裡編程事件Application_Start利用Time類編程比如服務器秒鐘執行一次判斷

  香港那邊的公司的ERP糸統是BS模式由於對方公司服務器環境條件的限制我和我師傅決定用第三種方法在編程之前先介紹一下Globalasax文件裡的幾個方法

  protected void Application_Start(Object sender EventArgs e)

  {

  //Application_start方法請求 ASPNET 應用程序中第一個資源(如頁)時調用在應用程序的生命周期期間僅調用一次

  }

  protected void Application_End(Object sender EventArgs e)

  {

  //Application_end方法在卸載應用程序之前對每個應用程序生命周期調用一次

  }

  下面是具體的做法

  代碼

  protected void Application_Start(Object sender EventArgs e)

  {

  Timer t = new Timer();//設計時間間隔如果一個小時執行一次就改為 這裡一分鐘調用一次

  tElapsed += new ElapsedEventHandler(t_Elapsed);

  tAutoReset = true;

  tEnabled = true;

  }

  private void t_Elapsed(object sender ElapsedEventArgs e)

  {

  if (GetEmailContentGetMailContent()Length == )

  {

  return;//如果沒有通過三審的訂單要發送則返回不發送郵件

  }

  int sendTime_Hour = ConvertToInt(ConfigurationManagerAppSettings[SendTime]ToString());//假如是下午分發送

  int now_Hour = ConvertToInt(DateTimeNowHourToString());

  int now_Minute = ConvertToInt(DateTimeNowMinuteToString());

  int absolute = ;//差距值單位為分鐘

  if (((now_Hour == sendTime_Hour ) && (now_Minute >= absolute)) || ((now_Hour == sendTime_Hour) && (now_Minute <= absolute)))    //即在如果時間判斷是落在分至分之間那麼就會調用下面的郵件發送方法

  {

  string subject = stringFormat(CO Approve Report({}) DateTimeNowToString(yyyyMMdd HH:mm:ss));

  string host = ConfigurationManagerAppSettings[MailHost];

  string from = ConfigurationManagerAppSettings[MailFrom];

  string to = ConfigurationManagerAppSettings[MailTo];

  string user = ConfigurationManagerAppSettings[MailUser];

  string password = ConfigurationManagerAppSettings[MailPassword];

  string content = GetEmailContentGetMailContent();

  try

  {

  OrderMailSend(host user password to from subject content null);//發送郵件的方法改為你自己的郵件發送方法

  }

  catch (Exception ex)

  {

  throw new Exception(exMessage);

  }

  }

  }

  如果一定要確精到分可以設置相距時間為秒級以及設置定時器的時間間隔為秒級比如一秒調用一次t_Elapsed但必須符合的一件條件是定時器的時間間隔<*absoluteabsolute為差距值見上面黃色背景的定義具體多少以客戶的要求為准不滿足這個條件的話不能實現在規定的時間段內調用郵件發送的方法

  好代碼編寫完畢測試沒問題下班再設置晚上點收到郵件(理論值應是分之間收到)當天發現沒收到郵件問題來了!為什麼在上班的測試沒問題但下班後點沒收到郵件?網上查了一下發覺自己還有個問題沒考慮到Application對象是有生命周期的當網頁沒人訪問或閒置過久應用程序池會調用Application_End方法回收applicatioin裡的對象資源導致定時器無法工作

  解決方法在IIS以上版本設置IIS應用程序池的回收時間默認好像是分鐘可設置長一些但不要太長否則有可能出現網站假死的現象當晚再測試可以正式發送郵件!起碼到現在已經用了兩三個月都能正常定時發送郵件IIS沒有應用程序池可以在C:\WINDOWS\MicrosoftNET\Framework\v\CONFIG\ nfig裡面設置具體設置可以參照/

  還有對於Applicatioin_Start方法有很多人都會產生一個誤解 Application_Start是第一個人訪問網站時加載的只會調用一次以後都不會調用Application_Start是第一個人訪問網站時加載的這個沒錯前提是在它的生命周期內有以下幾個原因也會導致應用程序池重新啟動  即Application_Start可以再次被調用

  )添加修改或刪除應用程序的 Bin 文件夾中的程序集

  )添加修改或刪除 App_GlobalResources 或 App_LocalResources 文件夾中的本地化資源

  )添加修改或刪除應用程序的 Globalasax 文件

  )添加修改或刪除 App_Code 目錄中的源代碼文件

  )添加修改或刪除配置文件配置

  )添加修改或刪除 App_WebReferences 目錄中的 Web 服務引用

  )添加修改或刪除應用程序的 nfig 文件

  附應用程序生命周期概述

  附NET垃圾回收機制

  附SqlServer發送郵件解決方法:

  在正常情況下Application_Start只調用一次這樣就不會實例化無數個定時器而占用服務器的資源 還有個問題是定時器的時間間隔如果精確到秒級的話是否會占用很多的內存吃內存是肯定會的所以要根據具體的情況設置應用程序池的回收時間和加大定時器設定的時間間隔

  上面定時發送郵件的解決方法只是我個人的做法可供參考不見得是最好的方法QQ郵箱與郵箱都可以實現發送郵件的功能大家可否討論下他們是怎樣實現的


From:http://tw.wingwit.com/Article/program/net/201311/12049.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.