C#结合SMTP实现邮件报警通知
写在前面
C#是微软推出的一门面向对象的通用型编程语言,它除了可以开发PC软件、网站(借助 http://ASP.NET)和APP(基于 Windows Phone),还能作为游戏脚本,编写游戏逻辑。SMTP是一种提供可靠且有效的电子邮件传输的协议,是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。今天主要跟大家分享一下如何通过C#结合SMTP来实现报警通知。【公众号dotNet工控上位机:thinger_swj】
1 整体思路
C#结合SMTP实现邮件报警通知,经过分析,我们需要解决以下两个问题:
- 第一个问题是如何进行报警的检测
- 第二个问题是如何实现邮件的发送
下面,我们主要针对这两点进行详细分析:
2 报警检测
1、实际应用中,报警会分两种,一种是离散量报警(即开关量报警),另外一种是条件报警(即数据报警),而对于开关量报警,又分为上升沿检测和下降沿检测;对于条件报警,一般会存在高限报警检测、高高报警检测、低限报警检测、低低报警检测。
2、对于不同的报警,检测的方式会所有不同,但是检测原理却是相通的,主要就是要捕捉报警产生的那一个瞬间,比如离散报警的上升沿,其实就是需要检测这个变量值从False到True进行跳变,对于条件报警的高限,就是捕捉变量实际值大于(或等于)报警高限值这个状态。因此报警检测需要单独开启一个线程来进行实时检测,这样才不会漏掉报警信息,至于报警检测的精度,由报警检测量大小和计算机性能本身来决定。
3、由于报警需要结合配置信息来实现,没法直接用代码进行展示,下面结合上升沿报警和高限报警,对整个流程进行梳理,如下图所示:
3 邮件类编写
对于C#来说,实现邮件通知很方便,可以直接调用相关的类库来实现,这里我们主要是对类库进行封装,形式一个EmailHelper类,后续只需要调用这个EmailHelper就行了,在EmailHelper类中,首先创建了一些邮件发送会用到的一些属性,包括发送人、收件人、标题、内容、发件人密码等信息,具体如下图所示:
···
/// <summary>
/// 发送者
/// </summary>
public string mailFrom { get; set; }
/// <summary>
/// 收件人
/// </summary>
public string[] mailToArray { get; set; }
/// <summary>
/// 抄送
/// </summary>
public string[] mailCcArray { get; set; }
/// <summary>
/// 标题
/// </summary>
public string mailSubject { get; set; }
/// <summary>
/// 正文
/// </summary>
public string mailBody { get; set; }
/// <summary>
/// 发件人密码
/// </summary>
public string mailPwd { get; set; }
/// <summary>
/// SMTP邮件服务器
/// </summary>
public string host { get; set; }
/// <summary>
/// 正文是否是html格式
/// </summary>
public bool isbodyHtml { get; set; }
/// <summary>
/// 附件
/// </summary>
public string[] attachmentsPath { get; set; }
···
完成属性创建后,编写一个发送邮件的方法,邮件发送方法编写的逻辑和正常发送邮件一致,步骤如下所示:
1、使用指定的邮件地址初始化MailAddress实例
2、向收件人地址集合添加邮件地址
3、向抄送收件人地址集合添加邮件地址
4、设置发件人信息
5、在有附件的情况下添加附件
6、指定发件人的邮件地址和密码以验证发件人身份
7、设置SMTP邮件服务器
8、将邮件发送到SMTP邮件服务器
具体代码如下所示:
···
/// <summary>
/// 发送邮件
/// </summary>
/// <returns></returns>
public bool Send()
{
//使用指定的邮件地址初始化MailAddress实例
MailAddress maddr = new MailAddress(mailFrom);
//初始化MailMessage实例
MailMessage myMail = new MailMessage();
//向收件人地址集合添加邮件地址
if (mailToArray != null)
{
for (int i = 0; i < mailToArray.Length; i++)
{
myMail.To.Add(mailToArray[i].ToString());
}
}
//向抄送收件人地址集合添加邮件地址
if (mailCcArray != null)
{
for (int i = 0; i < mailCcArray.Length; i++)
{
myMail.CC.Add(mailCcArray[i].ToString());
}
}
//发件人地址
myMail.From = maddr;
//电子邮件的标题
myMail.Subject = mailSubject;
//电子邮件的主题内容使用的编码
myMail.SubjectEncoding = Encoding.UTF8;
//电子邮件正文
myMail.Body = mailBody;
//电子邮件正文的编码
myMail.BodyEncoding = Encoding.Default;
myMail.Priority = MailPriority.High;
myMail.IsBodyHtml = isbodyHtml;
//在有附件的情况下添加附件
try
{
if (attachmentsPath != null && attachmentsPath.Length > 0)
{
Attachment attachFile = null;
foreach (string path in attachmentsPath)
{
attachFile = new Attachment(path);
myMail.Attachments.Add(attachFile);
}
}
}
catch (Exception err)
{
throw new Exception("在添加附件时有错误:" + err);
}
SmtpClient smtp = new SmtpClient();
smtp.EnableSsl = true;
//指定发件人的邮件地址和密码以验证发件人身份
smtp.Credentials = new System.Net.NetworkCredential(mailFrom, mailPwd);
//设置SMTP邮件服务器
smtp.Host = host;
try
{
//将邮件发送到SMTP邮件服务器
smtp.Send(myMail);
return true;
}
catch (System.Net.Mail.SmtpException ex)
{
return false;
}
}
···
4 邮件发送
- 这里首先要设置一下邮箱,按照提示开启下面的服务,开通之后会提供一个密码,因此最终发送邮件使用的密码并不是邮箱登录密码,而是开通下列服务之后产生的一个密码。
【公众号dotNet工控上位机:thinger_swj】
- 为了便于搭建整体环境,我这里使用星阁教育上位机配置软件(CMSPro)结合西门子S7-1200 PLC来进行功能测试,首先通过CMSPro配置一些变量,如下图所示:
- 针对每个变量,进行报警配置,以M8.0配置上升沿为例:
- 按照同样的方式,将其他变量进行相应的报警配置,配置完成后,点击保存并运行:
【公众号dotNet工控上位机:thinger_swj】
- 由上图可知,当前M8.0为False,手动将M8.0进行置位,或者通过TIA博图软件将M8.0置位,这时候,邮箱中将收到一封报警邮件,再将M8.0复位,邮箱中将再次收到一封报警消除的邮件,如下图所示:
C#结合SMTP实现邮件报警通知的更多相关文章
- zabbix实现QQ邮件报警通知--技术流ken
前言 前几天搜了下网上使用zabbix邮件报警通知的文章,大多数还是使用mailx的方法,过程配置起来比较冗余繁琐,这几天想着把自己平时用到的qq邮件报警的方法分享出来供大家参考,以此减少不必要的步骤 ...
- 分布式系统监视zabbix讲解二之邮件报警通知--技术流ken
概述 在上一篇博客<分布式系统监视zabbix讲解一技术流ken>中已经详细讲解了如何安装zabbix,本篇博客将详细讲解如何使用zabbix监控另外一台主机,并实现email报警通知机制 ...
- 分布式系统监视zabbix讲解二之邮件报警通知
概述 在上一篇博客<分布式系统监视zabbix讲解一技术流ken>中已经详细讲解了如何安装zabbix,本篇博客将详细讲解如何使用zabbix监控另外一台主机,并实现email报警通知机制 ...
- zabbix监控之邮件报警通知
zabbix官网的操作指南:https://www.zabbix.com/documentation/4.0/zh/manual 首先我们需要创建一个需要被监控的主机,并设置相应的监控项.当监控项收集 ...
- [Zabbix] 如何实现邮件报警通知以及免费短信报警通知
版权声明:本文为博主原创文章,未经博主允许不得转载. 前提条件: (1) zabbix服务器端已经成功安装并且运行. (2) zabbix客户端已经成功建立并且运行. 1 下载并且安装msmtp软件 ...
- [Zabbix] 怎样实现邮件报警通知以及免费短信报警通知
前提条件: (1) zabbixserver端已经安装成功而且执行. (2) zabbixclient已经成功建立而且执行. 1 下载而且安装msmtp软件 Wget http://sourcefo ...
- zabbix 通过smtp 邮件报警
注:sendemail 不是sendmail....sendemail是用perl语言写的一个smtp发邮件的小程序....详情可自行查阅..... 1. media 用户配置下的media. Adm ...
- Zabbix学习之路(三)之使用SMTP发送邮件报警及定制邮件报警内容
1.设置邮件报警的思路 (1)设置触发器(Trigger)-->触发后需要执行的动作(Action) 触发器使用逻辑表达式来评估通过 item 获取到得数据是处于哪种状态.在触发器表达式中我们可 ...
- Zabbix邮件报警-->Script
Version:3.0.1 邮件报警有两种media 1.Email zabbix发送报警邮件到指定smtp服务器(使用系统自带的sendmail,发送邮箱是zabbix服务器的本地邮箱账号) 再由s ...
随机推荐
- PHP开发环境搭建工具有哪些?
对于php开发小白来说搭建一个php运行环境就是一道坎! 因为要做php开发,搭建一个能够运行php网站的服务器环境是第一步,传统的php环境软件非常复杂,好在很多公司开发了一键搭建php安装环境,一 ...
- coderfoces#414 div.2
第一次打cf 感觉很奇妙 开始看到题目感觉极其怪异 然后忽然发现第一题一堆数中的因数出现最多的不是2么 然后过了5分钟就被一个专门攻击的人hack掉了 不得不说题并不难甚至很水(都是几行的入门题) 但 ...
- 基于AOP和ThreadLocal实现日志记录
基于AOP和ThreadLocal实现的一个日志记录的例子 主要功能实现 : 在API每次被请求时,可以在整个方法调用链路中记录一条唯一的API请求日志,可以记录请求中绝大部分关键内容.并且可以自定义 ...
- 使用Spring Cache集成Redis
SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...
- day08获取图片
wxml: <!--pages/publish/publish.wxml--> <text>pages/publish/publish.wxml</text> &l ...
- Dubbo远程调用之公司内部提供的服务
公司内部提供的服务 一家对外提供服务的公司,例如百度,腾讯,阿里,京东,58 同城等,公司内部有多个事业群,事业部门,每个事业部门内部又有若干个子部门,子部门里面有多个不同的小组负责各自的业务.提供对 ...
- 神秘的角落之张东升做了Java老师,悲剧就这样开始了
故事背景 主人公张东升是某大学某软件学院的一名Java老师,他平时给学生讲课风格古怪呆板,加上他普通话不标准,一口家乡话,每次给学生讲课都分两种情况: 第一种情况:手持课本,把本节要讲的内容按书本 ...
- 资深前端工程师带你认识网页后缀html、htm、shtml、shtm有什么区别?
每一个网页或者说是web页都有其固定的后缀名,不同的后缀名对应着不同的文件格式和不同的规则.协议.用法,最常见的web页的后缀名是.html和.htm,但这只是web页最基本的两种文件格式,今天我们来 ...
- CSS3 transform详解,关于如何使用transform
transform是css3的新特性之一.有了它可以box module变的更真实,这篇文章将全面介绍关于transform的使用. transform的作用 transform可以让元素应用 2D ...
- 顺时针打印矩阵(剑指offer-19)
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...