首页 > 编程 > .NET > 正文

asp.net基于windows服务实现定时发送邮件的方法

2024-07-10 12:47:35
字体:
来源:转载
供稿:网友

本文实例讲述了asp.net基于windows服务实现定时发送邮件的方法。,具体如下:

//定义组件private System.Timers.Timer time;public int nowhour;public int minutes;public string sendTime;public Thread th;public string isOpen;//是否启用定时发送public string strToEUser;public static int index = -1;public static ArrayList mulitaddress;//服务开始protected override void OnStart(string[] args){  time = new System.Timers.Timer();  time.Enabled = true;  time.AutoReset = true;  //定时执行方法   time.Elapsed+=new System.Timers.ElapsedEventHandler(time_Elapsed);    UserEmail toUser =new UserEmail();    mulitaddress = GetMailAdressName();   // LogHelper.SaveNote("当前索引的值" + index.ToString());    Thread.Sleep(2000);   time.Start();}public class LogHelper{  public static void SaveNote(string note)  {    FileStream stream = new FileStream(GetLogDirectory("Common") + DateTime.Now.ToString("yyyy-MM-dd") + ".txt", FileMode.Append, FileAccess.Write, FileShare.Delete | FileShare.ReadWrite);    StreamWriter writer = new StreamWriter(stream, Encoding.UTF8);    writer.WriteLine("================================================================");    writer.WriteLine(string.Format("Note:/t{0}", note));    writer.WriteLine(string.Format("DateTime:/t{0}/r/n/r/n",DateTime.Now.ToString()));    stream.Flush();    writer.Close();    stream.Close();    stream.Dispose();    writer.Dispose();  }  public static void SaveNote(string note, string txtname)  {    FileStream stream = new FileStream(GetLogDirectory(txtname) + DateTime.Now.ToString("yyyy-MM-dd") + ".txt", FileMode.Append, FileAccess.Write, FileShare.Delete | FileShare.ReadWrite);    StreamWriter writer = new StreamWriter(stream, Encoding.GetEncoding("gb2312"));    writer.WriteLine("================================================================");    writer.WriteLine(string.Format("Note:/t{0}", note));    writer.WriteLine(string.Format("DateTime:/t{0}/r/n/r/n", DateTime.Now.ToString("yyyyMMddHHmmss")));    stream.Flush();    writer.Close();    stream.Close();    stream.Dispose();    writer.Dispose();  }  public static void SaveException(Exception e)  {    SaveException(e, string.Empty);  }  public static void SaveException(Exception e, string memo)  {    FileStream stream = new FileStream(GetLogDirectory("Common") + DateTime.Now.ToString("yyyy-MM-dd") + ".txt", FileMode.Append, FileAccess.Write, FileShare.Delete | FileShare.ReadWrite);    StreamWriter writer = new StreamWriter(stream);    writer.WriteLine("================================================================");    writer.WriteLine(string.Format("Memo:/t{0}", memo));    writer.WriteLine(string.Format("DateTime:/t{0}", DateTime.Now.ToShortTimeString()));    writer.WriteLine(string.Format("Message:/t{0}", e.Message));    writer.WriteLine(string.Format("StackTrace:/r/n----------/r/n{0}/r/n----------/r/n/r/n/r/n", e.StackTrace));    stream.Flush();    writer.Close();    stream.Close();    stream.Dispose();    writer.Dispose();  }  public static string GetLogDirectory(string category)  {    string baseDirectory = string.Empty;    if ((HttpContext.Current != null) && (HttpContext.Current.Server != null))    {      baseDirectory = HttpContext.Current.Server.MapPath("~");    }    else    {      baseDirectory = AppDomain.CurrentDomain.BaseDirectory;    }    if ((baseDirectory[baseDirectory.Length - 1] != '/') && (baseDirectory[baseDirectory.Length - 1] != '//'))    {      baseDirectory = baseDirectory + @"/";    }    baseDirectory = string.Format(@"{0}Log/{1}/", baseDirectory, category);    if (!Directory.Exists(baseDirectory))    {      Directory.CreateDirectory(baseDirectory);    }    return baseDirectory;  }}void time_Elapsed(object sender, System.Timers.ElapsedEventArgs e){  try  {    if (mulitaddress != null)    {      LogHelper.SaveNote("进入time_Elapsed");      //获取定时发送时间      sendTime = Convert.ToString(GetConfigValue("sendTime"));      LogHelper.SaveNote("sendTime" + sendTime);      //是否开启定时发送功能      isOpen = GetConfigValue("isOpen");      int sleeptime = Convert.ToInt32(GetConfigValue("SleepTime"));      int stoptime = Convert.ToInt32(GetConfigValue("stoptime"));      //LogHelper.SaveNote("数组长度" + mulitaddress.Count);      // LogHelper.SaveNote("是否开启定时发送功能" + isOpen + "定时时间" + sendTime + "定时小时数:" + Convert.ToInt32(sendTime.Split(new char[] { ':' })[0]) + "定时分钟数:" + Convert.ToInt32(sendTime.Split(new char[] { ':' })[1]));      if (isOpen == "true")      {        //现在时间 小时        nowhour = Convert.ToInt32(DateTime.Now.Hour.ToString());//10        //现在分钟        minutes = Convert.ToInt32(DateTime.Now.Minute.ToString());//5        //获取发送小时        int sendhour = Convert.ToInt32(sendTime.Split(new char[] { ':' })[0]);        //获取发送的分钟        int sendMinute = Convert.ToInt32(sendTime.Split(new char[] { ':' })[1]);        LogHelper.SaveNote("进入定时发送邮件服务! 定时小时为:" + sendhour.ToString() + "定时分钟为:" + sendMinute.ToString() + "现在小时为:" + nowhour.ToString() + "现在定时的分钟为:" + minutes.ToString());        LogHelper.SaveNote("当前索引的值" + index.ToString());        if (nowhour == stoptime)        {          LogHelper.SaveNote("停止时间点到了 邮件停止发送 !!!");          index = -1;        }        else        {          //如果和当前的时间 小时相等 则定时发送邮件          if ((Convert.ToDateTime(DateTime.Now.ToShortTimeString()) >= Convert.ToDateTime(sendTime)) && index < mulitaddress.Count)          {            index++;            if (index < mulitaddress.Count)            {              SendEmail(((UserEmail)mulitaddress[index]));            }            else            {              LogHelper.SaveNote("发送完毕 当前的索引值为" + index.ToString());            }          }        }      }      else      {        //LogHelper.SaveNote("当前索引的值" + index.ToString());        index++;        if (index < mulitaddress.Count)        {          SendEmail(((UserEmail)mulitaddress[index]));        }        else        {          LogHelper.SaveNote("发送完毕 时间停止");          time.Enabled = false;          time.Stop();        }      }      Thread.Sleep(sleeptime);    }    else      LogHelper.SaveNote("mulitaddress=null");  }  catch (Exception ex)   {    LogHelper.SaveNote(ex.ToString());  }}public ArrayList GetMailAdressName(){  ArrayList list = new ArrayList();  string strSQL = "select b.mailAddress, a.mailtemplate,a.title from tg_product as a inner join tg_mailOrder as b on a.ccode=b.ccode where a.createtime=(select max(createtime) from tg_product)";  SqlDataReader dr = SqlHelper.ExecuteReader(CommandType.Text, strSQL, null);  if (dr.HasRows)  {    while (dr.Read())    {      UserEmail email = new UserEmail();      email.Mailaddres = dr["mailAddress"].ToString();      email.Title = dr["title"].ToString();      email.Contents = dr["mailtemplate"].ToString();      list.Add(email);    }  }  return list;}/// <summary>/// 定义用户邮件 标题 内容 Email地址/// </summary>public class UserEmail {  private string title;  private string contents;  public string Contents  {    get { return contents; }    set { contents = value; }  }  private string mailaddres;  public string Mailaddres  {    get { return mailaddres; }    set { mailaddres = value; }  }  public string Title {   get{return title;}    set { title = value; }  }}#region 发送邮件/// <summary>/// 发送邮件/// </summary>public void SendEmail(UserEmail user){  try  {    LogHelper.SaveNote("进入SendEmail!!!");    //邮件服务器    string smtpserver = GetConfigValue("smtpserver");    //发件人的邮箱名称    string emailuserName = GetConfigValue("emailuserName");    //发件人的邮箱密码    string emailuserpwd = GetConfigValue("emailuserpwd");    //邮箱地址    string emailfrom = GetConfigValue("emailfrom");    int port = Convert.ToInt32(GetConfigValue("serverPort"));    bool f = true;    //是否经过SSL加密    string isSSL = GetConfigValue("SSL");    if (isSSL == "true")    {      f = true;    }    else    {      f = false;    }    LogHelper.SaveNote("发件人的邮箱名称" + emailuserName + "邮件地址(emailFrom)" + emailfrom + "收件人" + user.Mailaddres);    SendEmailToUser(smtpserver, port, f, user.Mailaddres, null, emailuserName, emailuserpwd, emailfrom, user.Title,user.Contents);    LogHelper.SaveNote("Send Mail Success");  }  //获取异常信息  catch (Exception error)  {    //写入异常信息    using (StreamWriter sw = new StreamWriter("F://MailErrorlog.txt", true, System.Text.Encoding.UTF8))    {      sw.WriteLine(DateTime.Now.ToString() + ":");      sw.WriteLine("Exception 异常信息如下.................");      sw.WriteLine(error.ToString());      sw.WriteLine("---------------------------------------------");      sw.Close();    }  }}#endregion#region 利用.Net自带类(SmtpClient) 发送邮件/// <summary>/// 利用.Net自带类(SmtpClient) 发送邮件/// </summary>/// <param name="stmpserver">邮件服务器</param>/// <param name="username">用户名(邮箱名称)</param>/// <param name="pwd">密码</param>/// <param name="f">是否经过SSL加密</param>/// <param name="port">邮件服务器端口(没有加密 一般都是25)</param>/// <param name="strfrom">发件人</param>/// <param name="strto">收件人</param>/// <param name="subject">主题</param>/// <param name="body">内容</param>/// <param name="Mulitaddress">发送多人 收件人的邮箱地址以逗号隔开</param>/// <param name="attachmentName">发送的附件名称 没有附件则为null or ""</param>public void SendEmailToUser(string stmpserver,int port,bool f, string Mulitaddress, string attachmentName, string username, string pwd, string strfrom, string subject, string body){  string ErrorLog = GetConfigValue("ErrorLog");  SmtpClient smtp = new SmtpClient();  //发送邮件的方式  smtp.DeliveryMethod = SmtpDeliveryMethod.Network;  //指定邮件服务器  smtp.Host = stmpserver;  //Gmail QQ stmp ssl加密使用的端口   smtp.Port = port;  smtp.EnableSsl = f; ;//true 经过ssl加密   //验证发件人的身份 用户名(邮件地址和密码)  smtp.Credentials = new System.Net.NetworkCredential(username, pwd);  //初始化信息(来自 接收人)  MailMessage _mailmessage = new MailMessage();  //_mailmessage.To = strto;  //发送多个人 接收人邮件地址以,隔开  _mailmessage.From = new MailAddress(strfrom);  _mailmessage.To.Add(Mulitaddress);  //如果发送失败,SMTP 服务器将发送 失败邮件通知  _mailmessage.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;  //优先级  _mailmessage.Priority = MailPriority.High;  //发送主题  _mailmessage.Subject = subject;  //有附件则添加附件  if (!string.IsNullOrEmpty(attachmentName))  {    System.Net.Mail.Attachment attch = new System.Net.Mail.Attachment(attachmentName);    _mailmessage.Attachments.Add(attch);  }  //邮件主题编码  _mailmessage.SubjectEncoding = System.Text.Encoding.UTF8;  //指定发送的格式 (Html)  _mailmessage.IsBodyHtml = true;  //指定发送邮件的编码  _mailmessage.BodyEncoding = System.Text.Encoding.UTF8;  //指定邮件内容  _mailmessage.Body = body;  //发送邮件  try  {    smtp.Send(_mailmessage);  }  catch (Exception ex)  {    using (StreamWriter writer = new StreamWriter(ErrorLog+"://MailErrorlog.txt", true, System.Text.Encoding.UTF8))    {      writer.WriteLine("---------------------------------------------");      writer.WriteLine("SendEmail方法发送邮件错误日志................");      writer.WriteLine(ex.ToString());      writer.Flush();      writer.Close();    }  }}#endregion#region 获取邮件配置节点的值/// <summary>/// 加载相应配置文件 并按节点名称获取对应的值/// </summary>/// <param name="target">当前节点的名称</param>/// <returns>返回当前节点名称所对应的值</returns>public string GetConfigValue(string target){  string configpath=System.Windows.Forms.Application.StartupPath.ToString() + "/Email.config";  return GetConfigValue(configpath, target);}/// <summary>/// 根据节点名称获取配置文件对应的值(邮件配置信息)/// </summary>/// <param name="configpath">配置文件路径</param>/// <param name="target">要获取配置节点的名称</param>/// <returns>返回当前节点名称所对应的值</returns>public string GetConfigValue(string configpath, string target){  XmlDocument doc = new XmlDocument();  //加载文件路径s  doc.Load(configpath);  //获取当前节点的根节点  XmlElement root = doc.DocumentElement;  //获取当前节点下所有匹配子节点元素  XmlNodeList xmlnode = root.GetElementsByTagName(target);  //返回值  return xmlnode[0].InnerXml;}#endregion//服务结束protected override void OnStop(){  time.Enabled = false;}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表