如何定时发邮件(需求比较特殊,解决马上给分)
我想每晚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()
{
}
}
}
--------------------编程问答-------------------- 问题是它怎么整合到我的项目当中呢 --------------------编程问答-------------------- 用c#写一个控制台程序检查数据库并发送邮件,然后新建一个windows计划任务,运行这个控制台程序,就OK了 --------------------编程问答-------------------- 看看这个:http://blog.joycode.com/dotey/archive/2004/12/20/41438.aspx --------------------编程问答-------------------- 用Scheduled Tasks --------------------编程问答-------------------- 在Global.asax里,使用线程Timer,
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;
}
}
===========
我感觉这个方法不好,如果记录多的话,那性能就会降很多。 --------------------编程问答-------------------- 你的项目是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