用你的邮箱为你看家护院

原文链接:http://www.juzicode.com/archives/1938

桔子菌前面给大家介绍了怎么用Python收发邮件( smtplib发送邮件pop3接收邮件 ),今天准备借助邮箱做中转,用家里的电脑拍摄照片发往邮箱,再用手机邮箱查看照片。虽然用邮箱中转的是静态图片,但至少也能看到点画面,就好像电路板上那颗表明正在工作的LED灯,可以让人稍微安心些。

1、采集图片

首先要解决采集图像的事情,我们可以使用opencv。目前opencv官方还没有在pypi发布安装包,但是有一些非官方的包,我们这里选用的是opencv-python:

pip install opencv-python

导入cv2模块,使用cv2.VideoCapture(0)创建控制摄像头的实例cap,用cap.read()方法从摄像头抓取图像,cv2.imwrite()实现写入文件到本地磁盘,如果不使用相机了,需要用cap.release()释放资源。

cap = cv2.VideoCapture(0) #打开摄像头0
ret, frame = cap.read()     #读取图像
cv2.imwrite('capture.jpg', frame) #写入文件
cap.release()

2、发送带图片的邮件

smtplib发送邮件 一文中桔子菌只讲到了怎么发送纯文本邮件,所以还需要解决怎么在邮件正文和附件中发送图片的问题。发送纯文本邮件用的方法是MIMEText(),如果要构造稍微复杂的邮件需要用到 MIMEMultipart() ,构造邮件头和前者一样:

#创建MIME实例
message = MIMEMultipart()
#设置邮件头
message['Subject'] = Header('公众号[桔子code]:邮箱看家护院', 'utf-8').encode()
name, addr = parseaddr('Jerry <%s>' % from_addr)
message['From'] = formataddr((Header(name, 'utf-8').encode(), addr))
name, addr = parseaddr('Tom <%s>' % to_addr)
message['To'] = formataddr((Header(name, 'utf-8').encode(), addr))

创建的message实例就像一个大容器,还可以用attach()方法继续添加其他内容,比如文本格式的 MIMEText() 、附件格式的MIMEApplication()、图片格式的MIMEImage()等等。

接下来先添加附件,用open()函数’rb’方式读出图像得到 image_data ,用该二进制数据传入到 MIMEApplication(image_data) 构造一个 imgpart 实例,用 imgpart.add_header()方法构造消息头,再用前面创建的 MIMEMultipart() 实例message.attach( imgpart )添加到message中,这样附件部分就添加进来了。

#读取图片
image_data = None
with open('capture.jpg','rb')  as pf:
    image_data = pf.read()
#生成图片附件:
imgpart = MIMEApplication(image_data)
imgpart.add_header('Content-Disposition','attachment',filename='capture.jpg')
message.attach(imgpart)

接下来同样的模式添加图片,创建实例的时候需要传入读出的图像数据img = MIMEImage(image_data),在 img.addr_header()方法中需要说明其’Content-ID’=’capture-1’,这个编号后面需要用来构建html格式的邮件正文。

img  = MIMEImage(image_data)
img.add_header('Content-ID','capture-1') #对应<img> src属性
message.attach(img)

继续添加html格式的MIMEText(),需要注意<img> src属性值要用上一步设置的Content-ID值,这样对方邮件客户端在解析html文本的时候回自动去索引这个图片并显示出来。

#生成邮件正文
mail_cont="""<table >
            <tr><td> 关注微信公众号: [桔子code],及时接收更好玩的Python</td></tr>
            <tr><td><img src="cid:capture-1"></td> </tr>
        </table>"""   # <img> src属性通过Content-ID引用                
text = MIMEText(mail_cont,"html","utf-8")    
message.attach(text)

接下来就是登陆邮件服务器,发送邮件:

#创建smtp服务实例
smtp = smtplib.SMTP(smtp_server, 25)
#登录
smtp.login(from_addr, password)
#发送邮件
smtp.sendmail(from_addr, [to_addr], message.as_string())
smtp.quit()

手机客户端收到的邮件是这样的效果:

3、检测画面变化

前面每隔几分钟发送一次图片显得不太必要,可以改成画面发生变化时才发送图片,这里我们通过一个简单的算法来判断画面是否变化,用cv2.substrate()计算前后2个时间点的图像差异,再通过cv2.mean()计算差异图像的平均值,如果这个平均值大于某个门限值,就认为画面发生了变化,再将变化前后的2张图像通过邮件发送出来。

    difference = cv2.subtract(frame, frame_old)
    cv2.imshow('diff',difference)
    cv2.waitKey(1)
    ave = np.mean(difference)
    print('2幅图像差异值:',ave)
    if ave < diff_threash:
        continue
    print('画面发生变化,发送前后2幅图像')

在 [桔子code] 后台回复”好玩的python”或者”pyfunny”获得源码下载地址。

推荐阅读:
Python进阶教程m9–网络通信–socket通信
Python进阶教程m9b–网络通信–smtplib发送邮件 

用你的邮箱为你看家护院》有1条评论

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注