基于邮件系统的远程实时监控系统的实现 Python版

人生苦短,我用Python~ 界内的Python宣传标语,对Python而言,这是种标榜,实际上,Python确实是当下最好用的开发语言之一。

在相继学习了C++/C#/Java之后,接触Python,最一开始突然一片茫然,似乎是进入了新世界,所有C家族的语法,在这里都或多或少地发生了改变,方法没有大括号,喜闻乐见的格式。定义变量不需要声明,时间长了,竟爱上了这个简介明了,高效快捷的语言,当然,也是当下开发语言界内的宠儿,不可否认,Python是当下最流行的开发语言了。

【前言】

本文拟使用Python开发语言实现在任何能链接上互联网的地方,远程启动在其他地方部署的监控系统,并且实时地进行图像连拍,将实时图像以邮件形式反馈到手机邮箱,达到远程实时监控的目的。

【实现功能】

这篇文章将要介绍的主要内容如下:

1、远程发送监控命令

2、监控系统做出相应,进行图像连拍(或者是录制一段视频)

3、监控系统将处理结果以邮件形式发送到移动端

【实现思路】

远程向某邮箱服务器发送一封邮件,监控系统循环检测此邮箱最新接受的邮件,通过获取并分析邮件的信息确定是否需要执行监控功能操作。如果需要,做出响应,拍照并且将拍照结果反馈回邮件发送方。

【所需技术】

1、Python语言的熟练掌握,Python版本2.7

2、利用Python语言,实现SMTP协议以及POP3协议。已达到发送邮件和接收邮件的功能。

3、正则表达式的简单使用

4、OpenCV 图像处理,图像识别,跨平台开发库的使用

5、邮箱服务器SMTP,POP3协议的开通

【实现过程】

1、实现Python发送接收邮件代码,最后封装成Email_Helper_DG类,便于后续调用,当然本文的Python_Helper_DG还没有达到更高层次的封装,毕竟要发送图片的,适当做了一些对本系统的适应。

邮件发送接受的Email_Helper_DG代码如下:

  1 # -*- coding: UTF-8 -*-
  2 import os
  3 import poplib
  4 import smtplib
  5 from email.mime.application import MIMEApplication
  6 from email.mime.audio import MIMEAudio
  7 from email.mime.image import MIMEImage
  8 from email.mime.multipart import MIMEMultipart
  9 from email.mime.text import MIMEText
 10 from email.utils import formataddr
 11
 12
 13 class Mail_Helper_DG:
 14     my_smtp_server = ‘smtp.sina.com‘  # smtp 邮件服务地址
 15     my_pop3_server = ‘pop.sina.com‘  # pop3 邮件服务地址
 16     mail_type = ‘html‘  # 发送的邮件的格式,HTML或者Plain
 17     my_account = ‘******@example.com‘  # 发件人邮箱账号
 18     my_pwd = ‘******‘  # 发件人邮箱密码
 19     toAddressArray = [‘[email protected]‘, ]  # 收件人的邮箱,可发送给多人
 20
 21     def __init__(self):
 22         pass
 23
 24     # 发送邮件
 25     def SendMail(self, toAddressArray, senderName, subject, content):
 26         try:
 27             server = smtplib.SMTP(self.my_smtp_server, 25)  # 发件人邮箱中的SMTP服务器,端口是25
 28
 29             try:
 30                 msg = MIMEText(content, self.mail_type, ‘utf-8‘)
 31                 msg[‘From‘] = formataddr([senderName, self.my_account])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号
 32                 # msg[‘To‘] = formataddr(["FK", my_account])  # 括号里的对应收件人邮箱昵称、收件人邮箱账号
 33                 msg[‘Subject‘] = subject  # 邮件的主题,也可以说是标题
 34
 35                 server.login(self.my_account, self.my_pwd)  # 括号中对应的是发件人邮箱账号、邮箱密码
 36                 server.sendmail(self.my_account, toAddressArray, msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
 37             except Exception:
 38                 print(Exception)
 39                 return False
 40             finally:
 41                 server.quit()  # 关闭连接
 42             return True
 43         except Exception:
 44             print(Exception)
 45             return False
 46
 47     # 发送邮件带附件
 48     def SendMailAttachment(self, toAddressArray, senderName, subject, content, attachment_path):
 49         try:
 50             server = smtplib.SMTP(self.my_smtp_server, 25)  # 发件人邮箱中的SMTP服务器,端口是25
 51
 52             try:
 53                 server.login(self.my_account, self.my_pwd)  # 括号中对应的是发件人邮箱账号、邮箱密码
 54
 55                 msg = MIMEMultipart()  # create MIMEMultipart
 56                 msg[‘From‘] = formataddr([senderName, self.my_account])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号
 57                 # msg[‘To‘] = formataddr(["FK", my_account])  # 括号里的对应收件人邮箱昵称、收件人邮箱账号
 58                 msg[‘Subject‘] = subject  # 邮件的主题,也可以说是标题
 59                 content2 = MIMEText(content,
 60                                     _charset=‘utf-8‘)  # add email content  ,coding is gbk, becasue chinese exist
 61                 msg.attach(content2)
 62                 for attachment_name in os.listdir(attachment_path):
 63                     attachment_file = os.path.join(attachment_path, attachment_name)
 64
 65                     with open(attachment_file, ‘rb‘) as attachment:
 66                         if ‘application‘ == ‘text‘:
 67                             attachment = MIMEText(attachment.read(), _subtype=‘octet-stream‘, _charset=‘GB2312‘)
 68                         elif ‘application‘ == ‘image‘:
 69                             attachment = MIMEImage(attachment.read(), _subtype=‘octet-stream‘)
 70                         elif ‘application‘ == ‘audio‘:
 71                             attachment = MIMEAudio(attachment.read(), _subtype=‘octet-stream‘)
 72                         else:
 73                             attachment = MIMEApplication(attachment.read(), _subtype=‘octet-stream‘)
 74
 75                     attachment.add_header(‘Content-Disposition‘, ‘attachment‘, filename=(‘gbk‘, ‘‘, attachment_name))
 76                     # make sure "attachment_name is chinese" right
 77                     msg.attach(attachment)
 78
 79                 server.sendmail(self.my_account, toAddressArray, msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
 80             except Exception:
 81                 print(Exception)
 82                 return False
 83             finally:
 84                 server.quit()  # 关闭连接
 85             return True
 86         except Exception:
 87             print(Exception)
 88             return
 89
 90     # 接收邮件
 91     def ReceiveMail(self):
 92         # 创建一个pop3对象,这个时候实际上已经连接上服务器了
 93         pp = poplib.POP3(self.my_pop3_server)
 94         # 设置调试模式,可以看到与服务器的交互信息
 95         pp.set_debuglevel(1)
 96         # 向服务器发送用户名
 97         pp.user(self.my_account)
 98         # 向服务器发送密码
 99         pp.pass_(self.my_pwd)
100         # 返回邮箱的状态,返回2元祖(消息的数量,消息的总字节)
101         # msgCount, msgSize = pp.stat()
102
103         ret = pp.list()
104
105         mailBody = pp.retr(len(ret[1]))
106         # 释放pp
107         pp.quit()
108
109         return mailBody

2、主要业务逻辑代码,其中包含对POP3邮箱的实时监测,且对捕获到的命令进行分析判断,最后做出响应:

 1 # -*- coding: UTF-8 -*-
 2 import re
 3 import time
 4 import cv2
 5
 6 from Email import Mail_Helper_DG
 7
 8 toAddressArray = [‘[email protected]‘]  # 收件人的邮箱,可发送给多人
 9
10 content = """
11 当前摄像头捕获的结果:
12 """
13
14
15 # 获取当前时间
16 def getCurrentTime():
17     return str(time.strftime(‘’%Y-%m-%d %X’‘, time.localtime(time.time())))
18
19
20 # 程序启动标识
21 print(‘QiXiao`s SHS Starting ...‘)
22 # 初始化邮件发送类
23 mail = Mail_Helper_DG()
24
25 # 声明一个变量,来作为一个标记判断是否已经检测过当前这封邮件了
26 last_receiveMailDate = ‘‘
27 # 输出显示当前扫描邮箱服务器的次数
28 scan_index = 0
29 # 设置一个循环检测邮箱的方法
30 while True:
31     time.sleep(10)  # 设置检测邮箱服务器的时间间隔
32     print(getCurrentTime() + ‘ : scan item >>> ‘ + str(scan_index))
33     scan_index += 1  # 扫描次数累加
34     try:
35         # 通过Pop3 获取到邮件的第一条
36         mailBody = mail.ReceiveMail()
37
38         # 解析第一条邮件,并得到发件人,主题,日期
39         sender = re.search("X-Sender: (.*?)‘.", str(mailBody[1]).decode((‘utf-8‘)), re.S).group(1)
40         subject = re.search("Subject: (.*?)‘.", str(mailBody[1]).decode((‘utf-8‘)), re.S).group(1)
41         date = re.search("Date: (.*?)‘.", str(mailBody[1]).decode((‘utf-8‘)), re.S).group(1)
42
43         # 判断解析到的参数值
44         if date != last_receiveMailDate:
45             # 对发送方进行邮箱判断,否则任何人都可以发送命令,你懂得
46             if sender == ‘[email protected]‘:
47                 # 对命令进行分析
48                 if subject.__contains__(‘qx_cmd:‘):
49                     cmd = subject.split(‘:‘)[1]
50                     # 按cmd的命令来匹配要执行的操作:
51                     # catch-camera 捕获摄像头的操作
52                     if cmd == ‘catch-camera‘:
53                         # 载入图像,连续捕获数张图片,间隔三秒
54                         video = cv2.VideoCapture(0)
55                         time.sleep(3)
56                         ret, img = video.read()
57                         cv2.imwrite(‘files\\shoot_001.jpg‘, img)
58
59                         time.sleep(3)
60                         ret, img = video.read()
61                         cv2.imwrite(‘files\\shoot_002.jpg‘, img)
62
63                         time.sleep(3)
64                         ret, img = video.read()
65                         cv2.imwrite(‘files\\shoot_003.jpg‘, img)
66
67                         video.release()  # 关闭摄像头
68                         result = mail.SendMailAttachment(toAddressArray, "QiXiao",
69                                                          "QiXiao`s SHS (QiXiao`s Smart Home System v1.0)", content,
70                                                          "files")
71                         if result is True:
72                             print(getCurrentTime() + ‘ : send mail success !‘)
73                         else:
74                             print(getCurrentTime() + ‘ : send fail #‘)
75
76                     # 让当前这条信息的日期赋值给标记变量,以便下次略过当前这条信息
77                     last_receiveMailDate = date
78     except Exception:
79         print(getCurrentTime() + ‘Error:‘ + Exception)

至于代码逻辑的分析,代码内部已有适当的注释进行讲解,这里不再赘述,如有任何疑问,请留言,本人进行一一回复。

【系统测试】

首先我们启动我们的服务器,让代码跑起来。

每隔一段时间,服务器就会自动请求一次POP3服务器,判断是否有新的命令输入。

然后我们在任何地点进行邮件命令的发送:这里以Ios自带的Mail来进行邮件的发送(邮件客户端无所谓,微信里的也可以)

我们首先要填写好要发送的邮箱地址,以及主题(这里是约定好的执行命令)

填写好后,点击发送。

可以看到在0:00发送了一条邮件,这就是我们刚才发送的邮件。然后打开收件箱,准备进行邮件的查收。

我们可以看到,两分钟后,服务端以邮件形式返回监控的结果。打开邮箱进行查看。

我们可以看到,摄像头正对的部位被成功捕获,并且反馈到我们发送邮件的邮箱中。

通过这样的方式,我们可以在全球任意位置,向邮箱发送邮件,只要存在网络的地方,都可以实时对任意位置部署的摄像头进行监控,实时返回监控结果。

我们打开我们的接收命令的邮箱查看一下我们接受到的邮件:

没错,是我们刚才发送的邮件。

我们程序文件目录下保存的截取图片:

至此,我们的远程监控系统已经测试完毕,可见,完美达到了预期的效果!

【系统展望】

系统虽然功能已经实现,然还有很多不尽人意之处,未来将在第二版进行改进的有:

1、系统每隔一定时间间隔自动进行拍照,然后图像分析是否有区别(有物体入侵),如果有立即发送邮件推送报警信息。

2、对图片进行人脸识别,用方框圈出人连范围,以便增加提醒。

3、系统将搭建于Raspberry Pi Linux微机系统上,并且配备摄像头全天候进行跟踪拍摄。

4、未来可能搭建web服务,在网站或者App上进行此功能的使用

时间: 2024-09-29 15:37:39

基于邮件系统的远程实时监控系统的实现 Python版的相关文章

基于Android的远程视频监控系统(含源码)

基本过程是android作为socket客户端将采集到的每一帧图像数据发送出去,PC作为服务器接收并显示每一帧图像实现远程监控.图片如下(后来PC端加了个拍照功能)... (PS.刚学android和java不久很多东西还不懂,高手若是知道哪些地方可以继续优化的话还请多多指点下啊) 系统代码如下:一.android手机客户端(1)AndroidManifest.xml文件.添加camera和socket权限,并设置了程序开始执行的activity. <?xml version="1.0&q

基于android的远程视频监控系统(已开放源码)

基本过程是android作为socket客户端将采集到的每一帧图像数据发送出去,PC作为服务器接收并显示每一帧图像实现远程监控.图片如下(后来PC端加了个拍照功能)... (PS.刚学android和java不久很多东西还不懂,高手若是知道哪些地方可以继续优化的话还请多多指点下啊) 系统代码如下: 一.android手机客户端 (1)AndroidManifest.xml文件.添加camera和socket权限,并设置了程序开始执行的activity. <?xml version="1.0

用java写一个远程视频监控系统,实时监控(类似直播)我想用RPT协议,不知道怎么把RPT协议集成到项目中

我最近在用java写一个远程视频监控系统,实时监控(类似直播)我想用RPT协议,不知道怎么把RPT协议集成到项目中,第一次写项目,写过这类项目的多多提意见,哪方面的意见都行,有代码或者demo的求赏给我,谢谢

远程电脑监控系统主要应用在什么地方?

远程电脑监控系统可以监控和限制被控端的电脑屏幕.上网.聊天.邮件.网站浏览.看小说.玩游戏.电脑文件操作等.那么,一般局域网监控软件应用在什么方面呢? 远程电脑监控系统主要应用在以下几个方面: 一.应用在各类大中小企业-主要是企业管理人使用,利用远程电脑监控系统,安装在管理端和员工电脑端,进而监管员工上网行为,对其上班做与工作无关的事进行限制和管理,提高工作效率: 二.应用在贸易公司-利用远程电脑监控系统,监督业务部门员工电脑操作行为,防止业务员私自飞单. 三.应用在高科技公司-利用远程电脑监控

教你怎么搭建远程视频监控系统

时下,越来越多的情况需要应用到远程监控了,在此将刚做好的一个小项目给大家 首先介绍一下硬件方面, 海康威视DS-7016录像机         1台     西部数据SATA接口500G硬盘      1个     TP-LINK R460+路由器           1个    花生壳动态域名专业服务        1年    电源线和视频线随便几百米就够了 第一步搭建你的监控系统 首先将录像机接电源并连接路由器,通过硬盘录像机的默认管理地址进行登陆管理设置,如http://192.168.0

基于W5500的实时远程温湿度监控系统

概述 工具:物联网云平台Yeelink  DHT11温湿度传感器   W5500EVB 编译环境:Keil4 目的:通过以太网实时监控远程某个位置的温度和湿度 在W5500EVB端连接DHT11温湿度传感器,并实时读取温度和湿度:通过W5500与网络连接,并与物联网云平台Yeelink中添加设备建立连接:之后系统会将读取的温度和湿度上传到物联网云平台Yeelink,这样就可以随时通过网络观察温度和湿度变化. 物联网云平台Yeelink还提供了一个简单的手机,登陆 Yeelink账号,也可以随时随

基于Storm的Nginx log实时监控系统

背景 UAE(UC App Engine)是一个UC内部的PaaS平台,总体架构有点类似CloudFoundry,包括: 快速部署:支持Node.js.Play!.PHP等框架 信息透明:运维过程.系统状态.业务状况 灰度试错:IP灰度.地域灰度 基础服务:key-value存储.MySQL高可用.图片平台等 这里它不是主角,不作详细介绍. 有数百个Web应用运行在UAE上,所有的请求都会经过UAE的路由,每天的Nginx access log大小是TB级,如何实时监控每个业务的访问趋势.广告数

(转)基于单片机的网络视频监控系统的设计

本文提出了一种网络化视频监控系统,将单片机控制技术.USB数据采集技术与基于TCP/IP协议栈的计算机网络结构有机结合起来,使人们能够通过监控现场的摄像机和麦克风等视频音频捕捉设备. 将监控现场的信号通过局域网传输,并送到监视器上以获得实时图像和声音,从而实现远程遥视现场. 随着嵌入式系统的飞速发展,在许多领域,以微控制器为中心的应用系统正逐步取代以计算机为中心的应用.因此,对于网络应用系统的研究,越来越多的研究人员将研究重点转移到嵌入式系统上来.基于此背景,本文提出了一种网络化视频监控系统方案

Ntopng 网络流量实时监控系统搭建

下面实现Ntopng的rpm包安装 关于使用源码包也很简单,主要是Centos要提前配置EPEL-RELEASE方便依赖包安装, 在编译源码包就OK Ntopng介绍: Ntopng是原ntop下一代版本,网络流量实时监控显示.Ntopng类似于RMON远端网络监控代理,具有内置的Web服务能力,使用redis键值服务按时间序列存储统计信息.你可以在任何指定的监控服务器上安装ntopng,只需使用任一web浏览器,就能实时访问服务器上的流量报告了. ntopng用户可以使用一个网页浏览器浏览的N