利用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();
}
}
}
利用windows服务+timer或者windows任务计划程序+控制台进行进行每日邮件推送的更多相关文章
- 玩转Windows服务系列——给Windows服务添加COM接口
当我们运行一个Windows服务的时候,一般情况下,我们会选择以非窗口或者非控制台的方式运行,这样,它就只是一个后台程序,没有界面供我们进行交互. 那么当我们想与Windows服务进行实时交互的时候, ...
- 玩转Windows服务系列——创建Windows服务
创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Servi ...
- 玩转Windows服务系列——创建Windows服务
原文:玩转Windows服务系列——创建Windows服务 创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Wi ...
- [转帖]以Windows服务方式运行ASP.NET Core程序
以Windows服务方式运行ASP.NET Core程序 原作者blog: https://www.cnblogs.com/guogangj/p/9198031.htmlaspnet的blog 需要持 ...
- C# windows服务:创建Windows服务(Windows Services)的一般步骤
C#创建Windows服务(Windows Services) Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Wind ...
- RedMine项目管理系统邮件推送设置(Windows环境)
RedMine项目管理系统有邮箱推送功能,当Bug,安全漏洞等内容被修改.解决.评论的时候,系统会通过邮件 及时的通知你的团队和客户.邮件通知的环节.形式.时间.接受人均可定制,功能十分实用. 下面是 ...
- 利用Kafka的Assign模式实现超大群组(10万+)消息推送
引言 IM即时通信场景下,最重要的一个能力就是推送:在线的直接通过长连接网关服务转发,离线的通过APNS或者极光等系统进行推送. 本文主要是针对在线用户推送场景来进行总结和探讨:如何利用Kafka ...
- 解决.NET Core中MailKit无法使用阿里云邮件推送服务的问题
在博问中(.net core怎么实现邮件发送)知道了MailKit无法使用阿里云邮件推送服务发送邮件的问题,自已实测也遇到同样的问题,而用自己搭建的邮件服务器没这个问题. 于是,向阿里云提交了工单.. ...
- Laravel 下结合阿里云邮件推送服务
最近在学习laravel做项目开发,遇到注册用户推送邮件的问题,之前用java做的时候是自己代码写的,也就是用ECS推送邮件,但是现在转php的laravel了就打算用php的邮件发送功能来推送邮件, ...
随机推荐
- BitLocker 加密工具挂起和恢复命令行(windows7)
如果你的硬盘使用BitLocker加密了,但是有时候需要高效率的硬盘做某些事情,可以暂时挂起加密,命令行如下方便做个bat. 挂起: manage-bde -protectors -disable C ...
- curl php 小记
/* 开发用到. */ https 需加入: curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
- chroot directory
给 /A/B/C的C目录做chroot,要对C能读写,所以C目录不能做ROOT目录,对B做chroot. 设置C目录所有者为sftp 账户a,组也改为sftp组(这里a和sftp组都是之前建立好的sf ...
- php查看网页源代码的方法
这篇文章主要介绍了php查看网页源代码的方法,涉及php读取网页文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了php查看网页源代码的方法.分享给大家供大家参考.具体实现 ...
- SpreadJS电子表格
SpreadJS是wijmo旗下的一款HTML5电子表格控件. 官方网址:http://wijmo.com/products/spreadjs/ 在这里简单整理了SpreadJS几个比较简单的特点,如 ...
- Canvas画图在360浏览器中跑偏的问题
问题描述,canvas画图的js代码中编写的是画正方形的代码,结果在360浏览器上变成了长方形,不知道怎么回事,请问各位大神是否遇到过此类问题? <!DOCTYPE html> <h ...
- Linux设备驱动模型之I2C总线
一.I2C子系统总体架构 1.三大组成部分 (1)I2C核心(i2c-core):I2C核心提供了I2C总线驱动(适配器)和设备驱动的注册.注销方法,提供了与具体硬件无关的I2C读写函数. (2)I2 ...
- Hibernate SQL查询 addScalar()或addEntity()
本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询. 对原 ...
- 解决:NoSuchAlgorithmException: Algorithm HmacSHA1 not available
windows下运行macInstance = Mac.getInstance("HmacSHA1");完全正常,Linux下则出现异常: java.security.NoSuch ...
- 极光推送NotificationServiceTest.appex文件变红不存在丢失解决办法
这个图片是文件丢失的 创建.appex文件 创建.appex文件 把极光demo里面的这两个文件复制粘贴到新的文件件(新创建的文件是 UIViewController类型的所以就把 (Notifica ...