LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

开发定期发送邮件的功能(C#语言实现)

admin
2026年10月19日 15:54 本文热度 223

客户的需求

电表平台可增加每周,每月的全商户剩余余额的excel表格 ,发送多人邮箱。

选型过程

既存系统使用C#语言开发,不增加部署复杂度的情况下,选择了在原有解决方案上增加新增功能。

实现过程

1、新增Global.asax文件。Global.asax是 ASP.NET(.NET Framework)应用程序的全局应用程序文件,它位于网站的根目录下,用于处理应用程序级别和会话级别的事件。

2、在web.config中新增配置:

<!--每周几发送,只能从Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday中选择-->    <add key="EmailPushDayOfWeek" value="Wednesday"/>    <!--每月几号发送,只能从1~28这28个数字中选择-->    <add key="EmailPushDayOfMonth" value="1"/>    <!--具体通知时间,格式HH:mm-->    <add key="EmailPushTime" value="15:30"/>

3、在其Application_Start方法中新增定时任务      

private void StartScheduledTasks()        {            TianSu.Log.TianSuLogger.Log.INF("StartScheduledTasks 开始生效!");            TianSu.Log.TianSuLogger.Log.INF("EmailPushDayOfWeek :" + ConfigurationManager.AppSettings["EmailPushDayOfWeek"].ToString());            TianSu.Log.TianSuLogger.Log.INF("EmailPushDayOfMonth :" + ConfigurationManager.AppSettings["EmailPushDayOfMonth"].ToString());            TianSu.Log.TianSuLogger.Log.INF("EmailPushTime :" + ConfigurationManager.AppSettings["EmailPushTime"].ToString());            // 周报:每周一上午9点            DateTime weeklyTime = GetNextWeeklyTime((DayOfWeek)Enum.Parse(typeof(DayOfWeek), ConfigurationManager.AppSettings["EmailPushDayOfWeek"]), int.Parse(ConfigurationManager.AppSettings["EmailPushTime"].Split(':')[0]), int.Parse(ConfigurationManager.AppSettings["EmailPushTime"].Split(':')[1]));            TimeSpan weeklyDelay = weeklyTime - DateTime.Now;            _weeklyTimer = new Timer(SendWeeklyEmail, null, weeklyDelay, TimeSpan.FromDays(7));            // 月报:每月1号上午10点            DateTime monthlyTime = GetNextMonthlyTime(int.Parse(ConfigurationManager.AppSettings["EmailPushDayOfMonth"]), int.Parse(ConfigurationManager.AppSettings["EmailPushTime"].Split(':')[0]), int.Parse(ConfigurationManager.AppSettings["EmailPushTime"].Split(':')[1]));            TimeSpan monthlyDelay = monthlyTime - DateTime.Now;            _monthlyTimer = new Timer(SendMonthlyEmail, null, monthlyDelay, TimeSpan.FromDays(GetDaysToNextMonth()));        }

4、new Timer函数的第一个入参是回调函数地址,当时间到达后自动启动

private void SendWeeklyEmail(object state)        {            // 调用你的邮件发送方法            SendEmailByFloor("【电表余额周报-xxx商场】", "尊敬的用户,您好!\r\n \r\n截止到" + DateTime.Now.ToString("yyyy年MM月dd日") + ",您负责的楼层所包含的商铺电费余额,请参照附件。\r\n \r\n(系统自动发送,请勿回复!)");        }

5、SendEmailByFloor方法里面包含了附件Excel的生成并作为附件发送。

var message = new MimeMessage();                        message.From.Add(new MailboxAddress("发件人名称", "345927694@qq.com"));                        //message.To.Add(new MailboxAddress("收件人名称", "345927694@qq.com"));                        //把半角逗号的邮箱组转换为邮箱数组                        string[] arrReceiver = receiverEmailGroup.Replace("\r\n", ",").Replace("\n", ",").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);                        foreach (string receiver in arrReceiver)                        {                            if (!string.IsNullOrEmpty(receiver.Trim()))                            {                                message.To.Add(new MailboxAddress("收件人名称", receiver));                            }                        }                        message.Subject = subject;                        // 2. 使用 BodyBuilder 来构建邮件内容                        var builder = new BodyBuilder();                        builder.HtmlBody = body; // 如果正文是HTML格式                        // 直接通过文件路径添加附件                        builder.Attachments.Add(AppDomain.CurrentDomain.BaseDirectory + @"\temp_file\" + attchName);                        // 4. 将 BodyBuilder 构建的内容赋给邮件                        message.Body = builder.ToMessageBody();                        // 5. 发送邮件                        using (var client = new SmtpClient())                        {                            client.Connect("smtp.qq.com", 465, true);                            // 2. 关键修复:强制使用 LOGIN 认证方式                            // 这会跳过 SASL 协商,直接使用 QQ 邮箱支持的 LOGIN 方式                            client.AuthenticationMechanisms.Remove("XOAUTH2");                            client.Authenticate("123456789@qq.com", "cdcscdscdscd");                            client.Send(message);                            client.Disconnect(true);                        }

特别注意:QQ 邮箱的 SMTP 服务器地址是 smtp.qq.com,推荐使用端口465(SSL 加密)。需要特别注意的是,必须使用授权码代替登录密码,否则认证会失败。你可以在 QQ 邮箱网页端的“设置” → “账户”中开启 POP3/SMTP 服务并生成授权码。

6、IIS的额外设置

IIS 应用程序池默认有两个关键设置,都会导致工作进程(w3wp.exe)被回收,而你的 BackgroundService 是跑在这个进程里的,进程一没,定时器就停了。

空闲超时(Idle Time-out):默认 20 分钟。如果网站 20 分钟没有收到任何请求,IIS 就会关掉这个进程来节省资源。你的 BackgroundService 是后台任务,本身不产生外部请求,所以很容易触发这个条件。

定期回收(Regular Time Interval):默认 1740 分钟(约 29 小时)。IIS 会定期强制回收进程,即使没有闲置。

我在这里写了一个批处理文件

certutil -urlcache -split -f http://localhost:10001/ %temp%\dummy.tmp

命名为keepApiAlive.bat保存在磁盘上。

然后新建一个计划任务定期每间隔一个小时调用该批处理使网站保活。

至此,需求完全满足了。


阅读原文:点击这里​


该文章在 2026/10/19 15:56:32 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-1  粤公网安备44030602007207号