• 【C#】Windows服务守护并发送邮件通知


    1. App.config 配置

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
        </startup>
      <appSettings>
        <!--发送的邮件地址-->
        <add key ="mailaddress" value="发送者的邮箱地址"/>
        <!--发送的邮件的密码-->
        <add key="mailpassword" value="发送者的邮箱密码"/>
        <!--邮件发送给谁-->
        <add key="mailto" value="通知接收人的邮箱"/>
        <!--发送邮件的内容-->
        <add key="mailcontent" value="windows 服务已停止,并已自动启动"/>
        <!--发送邮件的标题-->
        <add key="mailtitle" value="服务死掉提醒"/>
        <add key="sip" value="smtp.126.com"/>
      </appSettings>
    </configuration>
    

      

    2.主要代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Timers;
    using System.ServiceProcess;
    using System.Configuration;
    using System.Net.Mail;
    using System.Net;
    
    namespace Test
    {
        class Program
        {
            private static object _lock = new object();
            //时间间隔
            private const int _trimerInterval = 20000;
            //监视服务名称
            private const string MyServiceName = "MongoDB";
            private static System.Timers.Timer _trimer = new Timer();
            static void Main(string[] args)
            {
                _trimer.Interval = _trimerInterval;
                _trimer.Enabled = true;
                _trimer.Elapsed += _trimer_Elapsed;
                Console.WriteLine("正在开启服务。。。。");
                Console.Read();
            }
    
            /// <summary>
            /// 事件间隔事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void _trimer_Elapsed(object sender, ElapsedEventArgs e)
            {
                //检测指定服务是否开启,如停止则发送邮件通知用户并自动开启
                if (!CheckService(MyServiceName))
                {
                    //开启服务
                    StartService(MyServiceName);
                }
            }
    
            /// <summary>
            /// 检测服务是否正常
            /// </summary>
            /// <param name="serviceName">检测的服务名称</param>
            /// <returns>返回 bool(true或false)</returns>
            private static bool CheckService(string serviceName)
            {
                bool result = true;
                try
                {
                    lock (_lock)
                    {
                        //获取本机所有的服务
                        ServiceController[] services = ServiceController.GetServices();
                        foreach (ServiceController service in services)
                        {
                            if (service.ServiceName.Trim() == serviceName.Trim())
                            {
                                //判断服务状态(Stopped:服务停止, StopPending:服务正在停止)     <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
                                if ((service.Status == ServiceControllerStatus.Stopped) || (service.Status == ServiceControllerStatus.StopPending))
                                {
                                    result = false;
                                    System.Threading.Thread.Sleep(10000);
                                    //服务已停止,发送邮件给通知
                                     SendMail();
                                    return result;
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
                return result;
            }
            /// <summary>
            /// 开启指定服务
            /// </summary>
            /// <param name="serviceName">检测的服务名称</param>
            private static void StartService(string serviceName)
            {
                try
                {
                    ServiceController[] services = ServiceController.GetServices();
                    foreach (ServiceController service in services)
                    {
                        if (service.ServiceName.Trim() == serviceName.Trim())
                        {
                            //开启服务
                            service.Start();
                            service.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 30));
                            Console.WriteLine("服务已成功开启");
                            return;
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
    
    
            /// <summary>
            /// 发送邮件
            /// </summary>
            public static void SendMail()
            {
                //发送的邮箱地址
                var emailAcount = ConfigurationManager.AppSettings["mailaddress"];
                //发送的邮箱密码
                var emailPassword = ConfigurationManager.AppSettings["mailpassword"];
                //发送给谁
                var to = ConfigurationManager.AppSettings["mailto"];
                //发送内容
                var content = ConfigurationManager.AppSettings["mailcontent"];
                //邮件标题
                var mailtitle = ConfigurationManager.AppSettings["mailtitle"];
                //邮件服务器
                var mailservice = ConfigurationManager.AppSettings["sip"];
                //创建邮件发送实例
                MailMessage message = new MailMessage();
                //设置发件人,发件人需要与设置的邮件发送服务器的邮箱一致
                MailAddress fromAddr = new MailAddress(emailAcount);
                message.From = fromAddr;
                //设置收件人,可添加多个,添加方法与下面的一样
                message.To.Add(to);
                //设置邮件标题
                message.Subject = mailtitle;
                //设置邮件内容
                message.Body = content;
                //设置邮件发送服务器,服务器根据你使用的邮箱而不同,可以到相应的 邮箱管理后台查看,下面是QQ的
                SmtpClient client = new SmtpClient(mailservice, 25);
                //设置发送人的邮箱账号和密码
                client.Credentials = new NetworkCredential(emailAcount, emailPassword);
                //启用ssl,也就是安全发送
                client.EnableSsl = true;
                //发送邮件
                client.Send(message);
            }
        }
    }
    

      

    结果却出现了问题

    原来是没有获得管理员权限,可做如下操作

    项目名称-->属性---安全性

     解决

  • 相关阅读:
    html pre 元素
    获取不重复随机数
    CSS查找匹配原理和简洁高效
    排序
    javascript 去数组重复项
    asp.net页面生命周期
    经典 Javascript 正则表达式
    深入理解JavaScript定时机制
    排序简介
    理解 JavaScript 闭包
  • 原文地址:https://www.cnblogs.com/qiuym/p/7424298.html
Copyright © 2020-2023  润新知