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

时间:2022-08-28 09:53:32

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();
}
}
}

利用windows服务+timer或者windows任务计划程序+控制台进行进行每日邮件推送的更多相关文章

  1. 玩转Windows服务系列&mdash&semi;&mdash&semi;给Windows服务添加COM接口

    当我们运行一个Windows服务的时候,一般情况下,我们会选择以非窗口或者非控制台的方式运行,这样,它就只是一个后台程序,没有界面供我们进行交互. 那么当我们想与Windows服务进行实时交互的时候, ...

  2. 玩转Windows服务系列——创建Windows服务

    创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Servi ...

  3. 玩转Windows服务系列&mdash&semi;&mdash&semi;创建Windows服务

    原文:玩转Windows服务系列——创建Windows服务 创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Wi ...

  4. &lbrack;转帖&rsqb;以Windows服务方式运行ASP&period;NET Core程序

    以Windows服务方式运行ASP.NET Core程序 原作者blog: https://www.cnblogs.com/guogangj/p/9198031.htmlaspnet的blog 需要持 ...

  5. C&num; windows服务:创建Windows服务&lpar;Windows Services&rpar;的一般步骤

    C#创建Windows服务(Windows Services) Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Wind ...

  6. RedMine项目管理系统邮件推送设置(Windows环境)

    RedMine项目管理系统有邮箱推送功能,当Bug,安全漏洞等内容被修改.解决.评论的时候,系统会通过邮件 及时的通知你的团队和客户.邮件通知的环节.形式.时间.接受人均可定制,功能十分实用. 下面是 ...

  7. 解决&period;NET Core中MailKit无法使用阿里云邮件推送服务的问题

    在博问中(.net core怎么实现邮件发送)知道了MailKit无法使用阿里云邮件推送服务发送邮件的问题,自已实测也遇到同样的问题,而用自己搭建的邮件服务器没这个问题. 于是,向阿里云提交了工单.. ...

  8. Laravel 下结合阿里云邮件推送服务

    最近在学习laravel做项目开发,遇到注册用户推送邮件的问题,之前用java做的时候是自己代码写的,也就是用ECS推送邮件,但是现在转php的laravel了就打算用php的邮件发送功能来推送邮件, ...

  9. wordpress使用阿里云邮件推送服务实现发送邮件

    之前用腾迅云时,配置了wordpress是可以使用邮件服务的,然而到了阿里云,却无法使用了,有人说是因为阿里云关了25端口,但腾迅好像也关了. 百度看看有没有其他方法,最终让我找到个方法,可惜不是很完 ...

随机推荐

  1. textField和textView限制输入条件

    以下两法方法都是实现textfield和textView的代理方法  需要先遵循代理 一:textField限制只能输入数字和小数点 且小数点后只能保留两位 小数点前最多5位 - (BOOL)text ...

  2. rsync&plus;inotify实现远程数据备份

    一.rsync的基本介绍 1.  什么是rsync Rsync是一款开源的.快速的.多功能的.可以实现增量的本地货远程数据镜像同步备份的优秀工具,Rsync使用与unix,linux,windows等 ...

  3. Raspberry Pi 配置笔记二

    配置源 http://blog.chinaunix.net/uid-21658993-id-4702322.html deb http://ipv4.mirrors.ustc.edu.cn/raspb ...

  4. SpringMvc出现No mapping found for HTTP request with URI的终极解决办法

    No mapping found for HTTP request with URI 出现这个问题的原因是在web.xml中配置错了,如: <servlet> <servlet-na ...

  5. EF——使用Data Annotations和Fluent API配置数据库的映射配置 02&period;01(转)

    要更改EF中的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面;还有一个就 ...

  6. 【转】 java中HashMap详解

    原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...

  7. 使用git pull时,项目没有更新?

    进入项目目录后,执行 git pull 命令,没有将项目更新,并提示下图: 提示:there is no tracking information for the current branch. 意思 ...

  8. HTML&plus;CSS Day05 基本CSS选择器、复合CSS选择器与CSS继承性

    1.基本CSS选择器 (1)标记选择器 <style>                       h1{ color:red; font-size:25px;}           &l ...

  9. 微信小程序-开发入门

    微信小程序已经火了一段时间了,之前一直也在关注,就这半年的发展来看,相对原生APP大部分公司还是不愿意将主营业务放到微信平台上,以免受制于腾讯,不过就小程序的应用场景(用完即走和二维码分发等)还是很值 ...

  10. entityframework导航属性筛选

    ); //会在sql代码中生成Street = "上海"代码 var address1 = db.Entry(user).Collection(b => b.Address) ...