最近在远程工作站上运行一个耗时比较久的Matlab程序,总是要时不时的进去看程序有没有运行完,感觉让时间严重的碎片化,于是就想着能不能程序结束后自动发邮件通知,然后在网上一搜果然找到了相关的教程,在此整理分享一下。
Maltab版本:R2016b
操作系统:Windows10 Build1703
2017.09.10补充:
把发邮件的程序放在最后,当程序运行出错时,那就没法发邮件了。这时可以使用Malatb的 try catch 命令来进行相应的处理。
另外,发现由于QQ邮箱莫名其妙的审查制度,会导致邮件退信,坑。。
参考内容:Matlab 程序结束后发送短信或者邮件
首先,需要准备一个开启了smtp服务的邮箱,163邮箱可以参照此方法开启:163邮箱如何开启POP3/SMTP/IMAP服务?. 现在163邮箱在开启smtp服务的时候,会自动生成一个邮箱客户端授权码,这个可以在后面的设置中当做邮箱密码来使用。
然后,编写一个函数文件(注意保存为m文件的时候,一定要命名为 mailLDJ.m)
function mailLDJ(subject,content,inboxAddress)
%发送邮件的代码
% subject:邮件主题
% content:邮件内容
% inboxAddress:收件箱
MailAddress = 'XXX@163.com'; %替换为自己的邮箱
password = 'G9rdX7G'; %替换为自己的密码或邮箱客户端授权码
setpref('Internet','E_mail',MailAddress);
setpref('Internet','SMTP_Server','smtp.163.com');%替换为自己邮箱的smtp服务器
setpref('Internet','SMTP_Username',MailAddress);
setpref('Internet','SMTP_Password',password);
props = java.lang.System.getProperties;
props.setProperty('mail.smtp.auth','true');
sendmail( inboxAddress,subject,content);
end
为了方便,可以将这个文件放在Matlab的工作路径下,具体操作可参考这个链接:matlab怎么设置工作路径。如果没有进行这步操作,后续操作时需要将此函数文件放在Matlab的当前工作目录下。
如果有安全的考虑,可以在Matlab的命令行窗口输入下面的命令来生成.p文件
pcode mailLDJ
最后在需要发送邮件的程序未尾添加以下命令,即可实现程序结束后发送邮件的命令
mailTome( 'Matlab程序运行结束',[mfilename,'已运行结束'],'YYY@qq.com' ) % YYY替换为自己要接收邮件的邮箱,mfilename可获得当前运行的m文件的名称
下面再编写一个函数文件来应对m文件运行出错的情况,文件名称为 Mailnotify.m,内容如下:
function Mailnotify( filename, inboxAddress )
% Mailnotify( filename, inboxAddress )
% filename: 需要运行的m文件
% inboxAddress: 收件箱,可留空使用默认邮箱
if nargin < 2
inboxAddress = 'XXX@qq.com'; %默认邮箱,需替换为自己的邮箱
end
[~,cmdout] = system( 'systeminfo');
tmp = regexp(cmdout,'\n');
pc_name = cmdout( tmp(1):tmp(2) ); %获得电脑的主机名
try
% 由于Matlab中的run命令会使用到当前的工作空间,因此需要保存相应的变量,防止m文件中使用clear导致程序出错
save tmp_Mailnotify.mat;
run( filename );
load tmp_Mailnotify.mat;
subject = [ filename, '运行结束' ];
content = [ pc_name ];
catch ME;
load tmp_Mailnotify.mat;
subject = [ filename, '运行出错!' ];
content = [ ME.identifier,' ', ME.message, pc_name ];
end
% 删除之前储存的变量
delete tmp_Mailnotify.mat
mailLDJ(subject,content,inboxAddress );
end
将 Mailnotify.m 放在Matlab的工作目录下,然后在Matlab命令窗口中输入下面的命令即可:
Mailnotify( 'test.m' ) %test.m为需要运行的m文件
需要更改邮箱,可修改 Mailnotify.m 中的默认邮箱,或者使用下面的形式调用
Mailnotify( 'test.m','XXX@qq.com' ) %XXX替换为自己的邮箱