当前位置:编程学习 > C#/ASP.NET >>

如何定时发邮件(需求比较特殊,解决马上给分)

我想每晚12点系统定时去查数据库,查出客户有效日期还剩3 天的,并发封邮件给通知他续费.我在网上查了下是用window服务但怎么加到我这个项目来呢?而且怎么创建window服务我也不太清楚麻烦贴出详细的代码给我,解决了马上给分在线等
(住怎么发邮件我已经知道了,主要是定时的问题) --------------------编程问答-------------------- 在Global.asax里,使用线程Timer,可以实现定时执行;

或者干催把这个定时发邮件的功能制作成一个小的windows工具 --------------------编程问答-------------------- 在windows服务里使用System.Timers.Timer的Elapsed事件即可 --------------------编程问答-------------------- 大哥麻烦你们都详细点,这块知识点我不熟悉,麻烦贴代码出来  --------------------编程问答-------------------- 一个定时windows service模版

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.IO;

namespace Nandasoft.App
{
    public partial class PMAutoGetUpdate : ServiceBase
    {
        public PMAutoGetUpdate()
        {
            InitializeComponent();

            this.timer1.Interval = 5000;
        }

        static bool pIsProcess = true;

        protected override void OnStart(string[] args)
        {
        
        }

        protected override void OnStop()
        {
            // TODO: Add code here to perform any tear-down necessary to stop your service.
        }

        private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (!pIsProcess) return;

            try
            {
                //加锁控制
                pIsProcess = false;
                DoGetUpdate();
                pIsProcess = true;
            }
            catch (Exception ex)
            {
                
            }
        }

        /// <summary>
        /// 执行操作函数
        /// </summary>
        private void DoGetUpdate()
        { 
           
        }
    }
}
--------------------编程问答--------------------

namespace Nandasoft.App
{
    partial class PMAutoGetUpdate
    {
        /// <summary> 
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary> 
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.timer1 = new System.Timers.Timer();
            ((System.ComponentModel.ISupportInitialize)(this.timer1)).BeginInit();
            // 
            // timer1
            // 
            this.timer1.Enabled = true;
            this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Elapsed);
            // 
            // Service1
            // 
            this.ServiceName = "PMAutoGetUpdate";
            ((System.ComponentModel.ISupportInitialize)(this.timer1)).EndInit();

        }

        #endregion

        private System.Timers.Timer timer1;

    }
}

--------------------编程问答-------------------- 问题是它怎么整合到我的项目当中呢  --------------------编程问答-------------------- 用c#写一个控制台程序检查数据库并发送邮件,然后新建一个windows计划任务,运行这个控制台程序,就OK了 --------------------编程问答-------------------- 看看这个:http://blog.joycode.com/dotey/archive/2004/12/20/41438.aspx --------------------编程问答-------------------- 用Scheduled Tasks --------------------编程问答-------------------- 在Global.asax里,使用线程Timer,


===========
我感觉这个方法不好,如果记录多的话,那性能就会降很多。 --------------------编程问答-------------------- 你的项目是B/S还是C/S呢?如果是B/S,可以考虑用Scheduled   Tasks每天12:00执行一次,调用一个vbs,vbs发送一个命令给aspx页面。
剩下的就不用多说了....... --------------------编程问答-------------------- seedling_lq 是windows服务器的 就是说他一直在进程了那运行的 不停的
在需要的页面调用这个windows服务器 就ok了 --------------------编程问答-------------------- 是BS Scheduled  Tasks是什么样麻烦写个简单的例子我看下就明白了 --------------------编程问答-------------------- 刚刚查了Scheduled  Tasks是计划任务,那我如何把我这个我检查数据aspx页面加入到计划任务里去呢?  --------------------编程问答-------------------- 用Scheduled Tasks调用这个vbs

vbs脚本如下: 

Set   objHTTP   =   CreateObject(   "WinHttp.WinHttpRequest.5.1"   ) 

  objHTTP.Open   "GET",   "http://你的页面地址",   False 
  objHTTP.Send 

Set   objHTTP   =   Nothing --------------------编程问答-------------------- 我已经想好方案了我建了一个项目是winform的,因为这样Scheduled   Tasks可以调用它的exe执行文件,问题时不知道为什么我发邮件却不成功了,我在asp.net中是能发送成功的,它报的错是未指定smtp主机
这是我的代码  有知道马上告诉我,我马上结分
MailAddress M_From = new MailAddress("information@ebuyjp.com","information@ebuyjp.com");
            MailAddress M_To = new MailAddress("Beckham6230@hotmail.com", "Beckham6230@hotmail.com");

            MailMessage Mail = new MailMessage(M_From, M_To);
            Mail.Subject = "kaka";
            Mail.Body = "ssssssss";
            Mail.BodyEncoding = System.Text.Encoding.UTF8;
            Mail.SubjectEncoding = System.Text.Encoding.UTF8;
            Mail.IsBodyHtml = true;

            SmtpClient smtp = new SmtpClient();
            //smtp.UseDefaultCredentials = true;
            
            smtp.Credentials = new System.Net.NetworkCredential("information@ebuyjp.com", "ppppp");
   smtp.Send(Mail);
--------------------编程问答-------------------- mark --------------------编程问答-------------------- 7楼的好象可行 --------------------编程问答-------------------- 请参考Community Server的做法。 --------------------编程问答-------------------- up --------------------编程问答-------------------- 如果是sqlserver,可以定制一个job发邮件的,也很简单。 --------------------编程问答--------------------  关注,学习中.. --------------------编程问答-------------------- 学习 帮顶  --------------------编程问答-------------------- 学习。。。。 --------------------编程问答-------------------- 给你一个最理想的处理方式:使用CACHE实现定时器功能.代码如下:

using System;
using System.Web;
using System.Web.Caching;

namespace Test
{
    /// <summary>
    /// 缓存定时器
    /// </summary>
    public class CacheJob
    {
        /// <summary>
        /// 缓存名称
        /// </summary>
        public string CacheName = "chaheJob";

        /// <summary>
        /// 页面Cache对象
        /// </summary>
        private System.Web.Caching.Cache _TheCache = null;
        /// <summary>
        /// 页面Cache对象
        /// </summary>
        protected System.Web.Caching.Cache TheCache
        {
            get
            {
                //值必须使用HttpRuntime
                this._TheCache = HttpRuntime.Cache;
                return (this._TheCache);
            }
        }

        /// <summary>
        /// 缓存时间,单位为分钟,默认为10分钟
        /// </summary>
        private int _CacheTime = 10;
        /// <summary>
        /// 缓存时间,单位为分钟,默认为10分钟
        /// </summary>
        protected int CacheTime
        {
            get { return (this._CacheTime); }
            set { this._CacheTime = value; }
        }


        /// <summary>
        /// 缓存定时器,随便给一个值(因为在这里,这个值不重要)
        /// </summary>
        private static DateTime _Timers = DateTime.MinValue;
        /// <summary>
        /// 缓存定时器
        /// </summary>
        public static DateTime Timers
        {
            get
            {
                CacheJob cache = new CacheJob();

                if (cache.TheCache.Get(cache.CacheName) == null)
                {
                    cache.WriteCache();
                }

                _Timers = (DateTime)cache.TheCache[cache.CacheName];

                return (_Timers);
            }
        }


        /// <summary>
        /// 写入缓存
        /// </summary>
        private void WriteCache()
        {
            DateTime value = DateTime.Now;
            DateTime timeTime = DateTime.Now.AddSeconds(this.CacheTime);

            //使用绝对过期方式
            TheCache.Insert(CacheName, value, null, timeTime, System.Web.Caching.Cache.NoSlidingExpiration, OnCacheItemUpdateCall);
        }

        /// <summary>
        /// 用于在从缓存中移除缓存项之前通知应用程序。
        /// </summary>
        /// <param name="key">要从缓存中移除的项的标识符,实际为缓存名称</param>
        /// <param name="reason">要从缓存中移除项的原因。</param>
        /// <param name="expensiveObject">此方法返回时,包含含有更新的缓存项对象。</param>
        /// <param name="dependency">此方法返回时,包含定义项对象和文件、缓存键、文件或缓存键的数组或另一个 System.Web.Caching.CacheDependency 对象之间的依赖项的对象。</param>
        /// <param name="absoluteExpiration">此方法返回时,包含对象的到期时间。</param>
        /// <param name="slidingExpiration">此方法返回时,包含对象的上次访问时间和对象的到期时间之间的时间间隔。</param>
        public void OnCacheItemUpdateCall(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
        {
            try
            {
                //执行所需要执行的事务(发送邮件)
                //在执行过程中必须排除错误,否则错误之后,定时器就停止了
            }
            catch
            {
                //可进行错误处理,但要保证此错误处理本身无错
            }


            expensiveObject = DateTime.Now;
            dependency = null;
            //重新定义下一次过期时间
            absoluteExpiration = System.DateTime.Now.AddSeconds(this.CacheTime);
            slidingExpiration = System.Web.Caching.Cache.NoSlidingExpiration;
        }

        /// <summary>
        /// 呼叫定时器
        /// </summary>
        public static void CallTime()
        {
            //用于初始呼叫
            DateTime time = Timers;
        }
    }
}


如上所示,你可以在Global.asax中的Application_Start或Session_Start事件中,调用一次(或多次)CallTime()方法以启动缓存,然后它就可以勤勤恳恳的不断定时为你服务.

另外说明一下,本来使用Timer控件也是可以实现的,但不知道是微软在这一方面实现的是不是有问题,这东西老会死,而且还是没有规律的死,所以,后来我不用了. --------------------编程问答-------------------- 奇怪了,在"我回复的帖子"里面,怎么看不到这一条? --------------------编程问答-------------------- 有看到 --------------------编程问答-------------------- http://blog.csdn.net/jiezigege/archive/2010/08/26/5841950.aspx
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,