利用windows服务+timer或者windows任务计划程序+控制台进行进行每日邮件推送

1、邮件发送代码

 using System.Text;
using System.Net;
using System.Net.Mail;
using System.Reflection;
using System.IO; namespace ConsoleApplication1
{
class Class1
{
public void set()
{
SmtpClient smtp = new SmtpClient(); //实例化一个SmtpClient
smtp.DeliveryMethod = SmtpDeliveryMethod.Network; //将smtp的出站方式设为 Network
smtp.EnableSsl = false;//smtp服务器是否启用SSL加密
smtp.Host = "smtp.163.com"; //指定 smtp 服务器地址
smtp.Port = ; //指定 smtp 服务器的端口,默认是25,如果采用默认端口,可省去
//如果你的SMTP服务器不需要身份认证,则使用下面的方式,不过,目前基本没有不需要认证的了
smtp.UseDefaultCredentials = true;
//如果需要认证,则用下面的方式
smtp.Credentials = new NetworkCredential("邮箱帐号@163.com", "邮箱密码");
MailMessage mm = new MailMessage(); //实例化一个邮件类
mm.Priority = MailPriority.High; //邮件的优先级,分为 Low, Normal, High,通常用 Normal即可
mm.From = new MailAddress("邮箱帐号@163.com", "真有意思", Encoding.GetEncoding());
//收件方看到的邮件来源;
//第一个参数是发信人邮件地址
//第二参数是发信人显示的名称
//第三个参数是 第二个参数所使用的编码,如果指定不正确,则对方收到后显示乱码
//936是简体中文的codepage值
//注:上面的邮件来源,一定要和你登录邮箱的帐号一致,否则会认证失败
mm.ReplyTo = new MailAddress("test_box@gmail.com", "我的接收邮箱", Encoding.GetEncoding());
//ReplyTo 表示对方回复邮件时默认的接收地址,即:你用一个邮箱发信,但却用另一个来收信
//上面后两个参数的意义, 同 From 的意义
mm.CC.Add("a@163.com,b@163.com,c@163.com");
//邮件的抄送者,支持群发,多个邮件地址之间用 半角逗号 分开
//当然也可以用全地址,如下:
mm.CC.Add(new MailAddress("a@163.com", "抄送者A", Encoding.GetEncoding()));
mm.CC.Add(new MailAddress("b@163.com", "抄送者B", Encoding.GetEncoding()));
mm.CC.Add(new MailAddress("c@163.com", "抄送者C", Encoding.GetEncoding()));
mm.Bcc.Add("d@163.com,e@163.com");
//邮件的密送者,支持群发,多个邮件地址之间用 半角逗号 分开
//当然也可以用全地址,如下:
mm.CC.Add(new MailAddress("d@163.com", "密送者D", Encoding.GetEncoding()));
mm.CC.Add(new MailAddress("e@163.com", "密送者E", Encoding.GetEncoding()));
mm.Sender = new MailAddress("xxx@xxx.com", "邮件发送者", Encoding.GetEncoding());
//可以任意设置,此信息包含在邮件头中,但并不会验证有效性,也不会显示给收件人
//说实话,我不知道有啥实际作用,大家可不理会,也可不写此项
mm.To.Add("g@163.com,h@163.com");
//邮件的接收者,支持群发,多个地址之间用 半角逗号 分开
//当然也可以用全地址添加
mm.To.Add(new MailAddress("g@163.com", "接收者g", Encoding.GetEncoding()));
mm.To.Add(new MailAddress("h@163.com", "接收者h", Encoding.GetEncoding()));
mm.Subject = "这是邮件标题"; //邮件标题
mm.SubjectEncoding = Encoding.GetEncoding();
// 这里非常重要,如果你的邮件标题包含中文,这里一定要指定,否则对方收到的极有可能是乱码。
// 936是简体中文的pagecode,如果是英文标题,这句可以忽略不用
mm.IsBodyHtml = true; //邮件正文是否是HTML格式
mm.BodyEncoding = Encoding.GetEncoding();
//邮件正文的编码, 设置不正确, 接收者会收到乱码 mm.Body = "邮件测试,呵呵";
#region 可以使用预定义好的html模板进行邮件发送
//string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
//string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
//string bodyPath = assemblyDirPath + "\\email.htm";
//StreamReader read = new StreamReader(bodyPath, Encoding.GetEncoding("GB2312"));
//string mailBody = read.ReadToEnd();
//read.Close();
//string dateStr = DateTime.Now.ToString("yyyy年M月d号");
//mailBody = mailBody.Replace("当前时间", dateStr);
//mailBody = mailBody.Replace("文件路径", "");
//mm.Body = mailBody;
#endregion
//邮件正文
mm.Attachments.Add(new Attachment(@"d:a.doc", System.Net.Mime.MediaTypeNames.Application.Rtf));
//添加附件,第二个参数,表示附件的文件类型,可以不用指定
//可以添加多个附件
mm.Attachments.Add(new Attachment(@"d:b.doc"));
smtp.Send(mm); //发送邮件,如果不返回异常, 则大功告成了。
}
}
}

2、windows服务的编写,是参考别人的代码实现的,自己做了部分的修改,设计到路径的读取问题,具体操作不厚可以见原帖,地址:http://www.cnblogs.com/tuyile006/archive/2006/11/27/573654.html,下面是源代码:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.IO;
using System.Timers;
using Microsoft.Win32; namespace MailTest
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
private Timer time;
private static readonly string CurrentPath = GetWindowsServiceInstallPath("每日统计台账推送服务") + "//";
string today = "";
protected override void OnStart(string[] args)
{
// TODO: 在此处添加代码以启动服务。
Log("start-stop", "推送服务启");
time = new Timer();
time.Enabled = true;
time.Elapsed += this.time_Elapsed;
time.Start();
} void time_Elapsed(object sender, ElapsedEventArgs e)
{
int intHour = e.SignalTime.Hour;
if (intHour == && today != DateTime.Now.ToString("yyyyMMdd"))
{
try
{
string workPath = CurrentPath + "Log//work.log";
MailSend send = new MailSend();
send.send("测试路径");
today = DateTime.Now.ToString("yyyyMMdd");
Log("work", "执行完成,时间");
}
catch (Exception ex)
{
Log("error", "运行出现异常:" + ex.ToString());
}
}
} protected override void OnStop()
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
time.Enabled = false;
Log("start-stop", "推送服务停止"); }
public void Log(string type, string message)
{
//string path = CurrentPath + "Log//" + type + ".log";
string path = @"C:\Users\sd\Documents\visual studio 2010\Projects\MailTest\MailTest\bin\Debug\Log\log.log";
if (!File.Exists(path))
{
FileStream create = File.Create(path);
create.Close();
}
FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(message + "---" + DateTime.Now.ToString());
sw.Flush();
sw.Close();
fs.Close();
}
/// <summary>
/// 获取服务所在安装路径 4 /// </summary>
/// <param name="ServiceName">服务名</param>
/// <returns>服务安装路径</returns>
public static string GetWindowsServiceInstallPath(string ServiceName)
{
string key = @"SYSTEM\CurrentControlSet\Services\" + ServiceName;
string path = Registry.LocalMachine.OpenSubKey(key).GetValue("ImagePath").ToString();
path = path.Replace("\"", string.Empty);//替换掉双引号
FileInfo fi = new FileInfo(path);
return fi.Directory.ToString();
}
}
}
上一篇:springboot搭建一个简单的websocket的实时推送应用


下一篇:TFS2017持续集成构建