使用邮件控制服务器端matlab(by python)

1. 使用邮件通知程序运行完毕

首先,参考[https://blog.csdn.net/eswai/article/details/53454987]
最后,在matlab命令行使用pcode('mailMe')来得到一个.p文件,并实际使用.p文件提供的mailMe函数来防止授权码泄露问题。(我的话我的项目用git同步,所以写了个.gitignore来忽略mailMe.m文件)

2. 使用邮件来设置程序参数并运行

使用python来获取收件箱状态,并调用matlab函数。

首先要确定matlab版本支持的python版本,如R2017a支持2.7\3.5\3.6。
其次到matlab安装路径(不知道路径打开matlab,运行matlabroot得到路径)如:\MATLAB\R2017a\extern\engines\python下,用cmd\bash\etc 运行python setup.py install
现在你就可以在python中运行matlab函数了。more about matlab python API
如下:

import matlab.engine
eng = matlab.engine.start_matlab()
t = eng.gcd(100.0,80.0,nargout=3)
print(t)
(20.0, 1.0, -1.0)

其中gcd可以替换成你的任意函数,注意nargout参数控制输出个数,如果是普通脚本文件就填0

当然,不保证其他版本操作方式相同(我是R2017a\win10):P

接下来,要让python接受并解析邮件,参考廖雪峰的教程使用POP3。

然后主要要解决的问题是

  1. 如何识别出某个邮件是命令邮件
  2. 如何提取命令

以下是我的很粗劣的代码,核心代码为eval('eng.'+cmd)
比如我用这个邮箱给自己发了一封邮件标题为cmd mailMe('title','content',nargout=3)
然后就会运行eng.mailMe('title','content',nargout=3),然后的确收到了邮件,测试通过

# -*- coding: utf-8 -*-
import poplib
import time
import matlab.engine

email = None # 你的email
password = None # 你的pop3授权码
pop3_server = 'pop.126.com' # 换成你的邮件服务商的server

while True:
	server = poplib.POP3_SSL(pop3_server)
	# 认证:
	server.user(email)
	server.pass_(password)
	num,total_size = server.stat()
	# 获取最新一封邮件, 注意索引号从1开始:
	resp, lines, octets = server.retr(num)
	# 解析邮件:
	flag1 = False
	flag2 = False
	for line in lines:
		# 确认是发出的邮箱和自己相同,过滤掉大部分其他邮件
		if line.find('From')==0:
			if line[6:] == email:
				flag1 = True
		#找到标题栏,
		if flag1 and line.find('Subject')==0:
			cmd = line[9:]
			if cmd.find('cmd')==0:
				cmd = cmd[4:]
				flag2 = True
			break
			
	if flag2:
		eng = matlab.engine.start_matlab()
		server.dele(num) # 删除邮件防止乱来
		eval('eng.'+cmd)
		eng.quit()
	
	# 关闭连接:
	server.quit()
	# 沉睡5秒
	time.sleep(5)

有很多改进空间,比如安全性等等,不过暂时就这样了吧。

update:请务必考虑一下读取了一封邮件的命令之后如何处理这封邮件!毕竟现在就是很简单的执行最新邮件的命令

猜你喜欢

转载自blog.csdn.net/csdn_yi_e/article/details/84836340