C#定时发送邮件功能

news2024/12/23 11:32:06

C#定时发送邮件功能

背景

自动运维监控客户端在自动关闭时,需要给实施同学发送提醒邮件。支持163邮箱、qq邮箱、火狐邮箱等各种通用邮箱。

定时器+发送邮件

代码

邮件功能模块

using ITSLog.LogManage;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Mail;

namespace SystemMonitor.Util
{
    public static class MailModel
    {
        private static KSLog log = LogService.GetKSlog(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <param name="mailEntity"></param>
        public static void SendMonitorEmail(MailEntity mailEntity)
        {
            //MailMessage mail = new MailMessage(mailEntity.SendMailAdress, mailEntity.ReciveAdress);
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress(mailEntity.SendMailAdress);
            foreach (var toItem in mailEntity.ReciveAdress)
            {
                mail.To.Add(new MailAddress(toItem));
            }
            SmtpClient client = new SmtpClient();

            // 设置SMTP服务器和其他参数  
            //client.Port = 465; // SMTP端口(通常用于TLS)  
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            //使用自己的验证邮件设置为false
            client.UseDefaultCredentials = false;
            client.EnableSsl = true;
            // 你的SMTP服务器地址  
            string[] addressor = mailEntity.SendMailAdress.Split(new Char[] { '@', '.' });
            switch (addressor[1])
            {
                case "163":
                    client.Host = "smtp.163.com";
                    break;
                case "126":
                    client.Host = "smtp.126.com";
                    break;
                case "qq":
                    client.Host = "smtp.qq.com";
                    break;
                case "gmail":
                    client.Host = "smtp.gmail.com";
                    break;
                case "hotmail":
                    client.Host = "smtp.live.com";//outlook邮箱//client.Port = 587;
                    break;
                case "foxmail":
                    client.Host = "smtp.foxmail.com";
                    break;
                case "sina":
                    client.Host = "smtp.sina.com.cn";
                    break;
                default:
                    client.Host = "smtp.exmail.qq.com";//qq企业邮箱
                    break;
            }
            //client.Host = mailEntity.StmpHost;

            // 设置你的邮箱凭据(如果需要)  
            NetworkCredential credentials = new NetworkCredential(mailEntity.UseCode, mailEntity.PassWord);
            client.Credentials = credentials;

            // 设置邮件内容  
            mail.Subject = mailEntity.MailSubject;
            mail.Body = mailEntity.MailBody;
            mail.SubjectEncoding = System.Text.Encoding.UTF8;
            mail.BodyEncoding = System.Text.Encoding.UTF8;
            mail.Priority = System.Net.Mail.MailPriority.Normal;
            mail.IsBodyHtml = true;
            mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
            if (mailEntity.accessoryPath != null)
            {
                foreach (string path in mailEntity.accessoryPath)
                {
                    //将附件添加到邮件
                    mail.Attachments.Add(new Attachment(path));
                    //获取或设置此电子邮件的发送通知。
                    mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;
                }
            }

            // 发送邮件  
            try
            {
                client.Send(mail);
                log.Debug(DateTime.Now.ToString() + "邮件发送成功");
            }
            catch (Exception ex)
            {
                log.Debug("初始化停止启动日期失败 :" + ex.ToString());
            }
            finally
            {
                client.Dispose();
            }
        }
    }

    /// <summary>
    /// 邮件实体类
    /// </summary>
    public class MailEntity
    {
        /// <summary>
        /// 发送地址
        /// </summary>
        public string SendMailAdress;
        /// <summary>
        /// 接收地址
        /// </summary>
        public List<string> ReciveAdress;
        /// <summary>
        /// 用户
        /// </summary>
        public string UseCode;
        /// <summary>
        /// 密码
        /// </summary>
        public string PassWord;
        /// <summary>
        /// 标题
        /// </summary>
        public string MailSubject;
        /// <summary>
        /// 邮件主体
        /// </summary>
        public string MailBody;
        /// <summary>
        /// 抄送地址
        /// </summary>
        public List<string> accessoryPath { get; set; }
    }
}

调用模块

        #region 邮件发送相关
        /// <summary>
        /// 邮件触发器
        /// </summary>
        private System.Windows.Forms.Timer dailyMailTimer;
        /// <summary>
        /// 
        /// </summary>
        private DateTime nextRunTime = DateTime.MinValue; // 初始化为一个无效时间  
        private void InitializeTimer()

        {
            dailyMailTimer = new System.Windows.Forms.Timer();
            dailyMailTimer.Interval = 1000; // 1秒,用于检查时间  
            dailyMailTimer.Tick += DailyTimer_Tick;
            dailyMailTimer.Start(); // 启动Timer  
        }
        private void SetNextRunTime()
        {
            // 设置下一次运行时间为今天的15:50,如果已经过了这个时间,则设置为明天的15:50  
            DateTime now = DateTime.Now;
            closeTime = Convert.ToDateTime(ConvertDate(InitDate)).Add(TimeSpan.Parse(Config.AutoCloseTime));
            DateTime sendMailTime = closeTime.AddMinutes(10);
            if (sendMailTime < now)
            {
                sendMailTime = sendMailTime.AddDays(1); // 设置为明天的同一时间  
            }
            nextRunTime = sendMailTime;
        }

        private void DailyTimer_Tick(object sender, EventArgs e)
        {
            if (DateTime.Now >= nextRunTime)
            {
                dailyMailTimer.Stop(); // 停止Timer,防止在SendEmail期间再次触发  
                SendEmail(); // 执行任务  
                SetNextRunTime(); // 重置下一次运行时间  
                dailyMailTimer.Start(); // 重新启动Timer  
            }
        }
        /// <summary>
        /// 校验条件满足送发邮件
        /// </summary>
        public void SendEmail()
        {
            if (Config.SendMailAddress == "" || Config.SendMailAddress == null) return;
            if (Config.ReciveMailAddress == "" || Config.ReciveMailAddress == null) return;
            if (Config.Mailsecret == "" || Config.Mailsecret == null) return;


            if (true)//校验条件
            {
                MailEntity mailEntity = new MailEntity
                {
                    SendMailAdress = Config.SendMailAddress,
                    UseCode = Config.SendMailAddress,
                    ReciveAdress = new System.Collections.Generic.List<string>() { Config.ReciveMailAddress },
                    PassWord = Config.Mailsecret,
                    MailSubject = "邮件名称",
                    MailBody = "邮件主体"
                };
                MailModel.SendMonitorEmail(mailEntity);
            }


        }
        #endregion

邮箱设置


生活不易,猫猫叹气。Q-Q

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FLINK-运行架构

为什么要学习Flink运行架构&#xff1f; 虽然现在大厂的开发工具都非常高效、只需要进行参数配置、Flink-sql写业务逻辑&#xff0c;但是在资源配置逻辑优化上不可避免需要了解底层的组件配置。面试时可能也会被问到FLINK是如何进行资源分配、作业运行的等。 以下是在学习时记录…

【一刷《剑指Offer》】面试题 34:丑数

力扣对应题目链接&#xff1a;264. 丑数 II - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;丑数_牛客题霸_牛客网 (nowcoder.com) 一、《剑指Offer》对应内容 二、分析题目 根据题意&#xff0c;每个丑数都可以由其他较小的丑数通过乘以 2 或 3 或 5 …

C++字体库开发之fontconfig使用五

代码 #include <cassert> #include <algorithm> #include "fontconfig/fontconfig.h" #include <stdexcept> #include <iostream>#define HAS_FALLBACK_CONFIGURATIONenum FontStyle : uint16_t {Regular 0,Italic 0x01,Bold 0x02, };en…

如何在 Mac 上恢复丢失或删除的文件

也许您放错了 Mac 上的某个文件&#xff0c;或者永久删除了现在需要的文件。根据您丢失或删除文件的时间&#xff0c;有多种方法可以恢复 MacOS 上的项目。 我们从最快、最简单的方法开始&#xff0c;然后逐渐采用更耗时或更昂贵的方法来恢复 Mac 上的文件、文件夹和其他项目。…

MySQL添加索引时会锁表吗?

目录 简介Online DDL概念Online DDL用法总结 简介 在MySQL5.5以及之前的版本&#xff0c;通常更改数据表结构操作&#xff08;DDL&#xff09;会阻塞对表数据的增删改操作&#xff08;DML&#xff09;。 MySQL5.6提供Online DDL之后可支持DDL与DML操作同时执行&#xff0c;降低…

CentOS 7 yum官方源失效

问题 2024年7月&#xff0c;官方对centos 7停止了维护&#xff0c;yum的源网址mirror.centos.org也已经无法访问。 在此情况下&#xff0c;无法正常使用yum进行安装和更新工具。 在尝试了更换阿里源之后&#xff0c;仍然有部分工具库无法访问。 通用解决方案 1. 打开/etc/y…

react页面指定dom转pdf导出

1. 使用jsPDFhtml2canvas将页面转成图片然后导出2. 自定义创建iframe调用iframe.print()进行页面打印转pdf导出3. 使用react-to-print插件打印pdf4. 利用media print样式打印页面局部元素 1. 使用jsPDFhtml2canvas将页面转成图片然后导出 缺点&#xff1a;页面过长可能会导出失…

SwarmBrain: 通过大模型玩实时战略游戏《星际争霸II》

人工智能咨询培训老师叶梓 转载标明出处 实时战略&#xff08;RTS&#xff09;游戏如《星际争霸II》一直被视为测试和提升AI能力的绝佳平台。尽管基于强化学习&#xff08;RL&#xff09;的AI代理在《星际争霸II》中取得了显著进展&#xff0c;但它们在处理复杂环境时仍面临挑战…

SpringBoot、SpringCloud、SpringCloud Alibaba版本对应关系

1. 概述 随着SpringBoot和SpringCloud的发展&#xff0c;有些服务进入停更运维状态&#xff0c;一些新的框架出现&#xff0c;在开发微服务的时候不同组件的版本对应关系也是不可忽视的问题&#xff0c;如果版本不对应&#xff0c;可能会出现很多莫名的错误&#xff0c;给开发…

5G mmWave PAAM 开发平台

Avnet-Fujikura-AMD 5G 毫米波相控阵天线模块开发平台 Avnet 和 Fujikura 为毫米波频段创建了一个领先的 5G FR2 相控阵天线开发平台。该平台使开发人员能够使用 AMD Xilinx 的 Zynq UltraScale™ RFSoC Gen3 和 Fujikura 的 FutureAcess™ 相控阵天线模块 (PAAM) 快速创建和制…

AI周报(7.14-7.20)

AI应用-本届欧洲杯的AI技术应用 卢卡库在两场比赛中共有三次庆祝进球的情况&#xff0c;但遗憾的是这三次庆祝均未能转化为有效的进球。这种“吐饼王”的表现也让他成为了本届欧洲杯的一个另类焦点人物。虽然稍显悲情&#xff0c;但有了AI的深度应用&#xff0c;即使这样极端的…

震惊,搜索二叉树告诉我们不要生二胎?本篇(带图)让你轻松拿下

引子&#xff1a; 二叉树作为一种常见的一种数据结构,我们也经常使用&#xff0c;有以下几种类型&#xff1a;满二叉树&#xff08;Full Binary Tree&#xff09;&#xff1a;所有节点都恰好有两个子节点或没有子节点。完全二叉树&#xff08;Complete Binary Tree&#xff09…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十六章 Linux驱动初探

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

Python list comprehension (列表推导式 - 列表解析式 - 列表生成式)

Python list comprehension {列表推导式 - 列表解析式 - 列表生成式} 1. Python list comprehension (列表推导式 - 列表解析式 - 列表生成式)2. Example3. ExampleReferences Python 中的列表解析式并不是用来解决全新的问题&#xff0c;只是为解决已有问题提供新的语法。 列…

易我数据恢复怎么样?这款四款也很好用

虽然我已经很小心了&#xff0c;但是生活中总有一些意外情况导致数据丢失&#xff0c;这时&#xff0c;数据恢复软件便成为了我们的救命稻草。不知道大家用过易我数据恢复没。我用过&#xff0c;但是目前更喜欢下面的四款数据恢复工具&#xff0c;更符合我的使用习惯&#xff0…

【ai】学习笔记:电影推荐1:协同过滤 TF-DF 余弦相似性

2020年之前都是用协同过滤2020年以后用深度学习、人工智能视频收费的,不完整,里面是电影推荐 这里有个视频讲解2016年大神分析了电影推荐 :MovieRecommendation github地址 看起来是基于用户的相似性和物品的相似性,向用户推荐物品: 大神的介绍: 大神的介绍: 基于Pytho…

Windows tasklist命令详解,Windows查看进程

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 tasklist 可以…

Chapter14 非真实感渲染 NPR——Shader入门精要

Chapter14 非真实感渲染 NPR 一、卡通风格渲染1.渲染轮廓线2.添加高光3.ToonShadingMat 二、素描风格渲染 一、卡通风格渲染 特点&#xff1a;物体被黑色线条描边&#xff0c;分明的明暗变化等方法&#xff1a;其中之一就是 基于色调的着色技术 1.渲染轮廓线 方法 基于观察角…

零基础入门鸿蒙开发 HarmonyOS NEXT星河版开发学习

今天开始带大家零基础入门鸿蒙开发&#xff0c;也就是你没有任何编程基础的情况下就可以跟着石头哥零基础学习鸿蒙开发。 目录 一&#xff0c;为什么要学习鸿蒙 1-1&#xff0c;鸿蒙介绍 1-2&#xff0c;为什么要学习鸿蒙 1-3&#xff0c;鸿蒙各个版本介绍 1-4&#xff0…

MYSQL2

1.建库以及建表&#xff1a; mysql> create database mydb8_woker; mysql> use mydb8_woker; mysql> create table t_worker( -> department_id int(11) not null comment 部门号, -> worker_id int(11) primary key not null comment 职工号, -&…