Matlab在程序运行异常及正常后发送邮件通知

最近在远程工作站上运行一个耗时比较久的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 = '[email protected]';    %替换为自己的邮箱
    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,'已运行结束'],'[email protected]' ) % YYY替换为自己要接收邮件的邮箱,mfilename可获得当前运行的m文件的名称


下面再编写一个函数文件来应对m文件运行出错的情况,文件名称为 Mailnotify.m,内容如下:

function Mailnotify( filename, inboxAddress  )
% Mailnotify( filename, inboxAddress )
% filename: 需要运行的m文件
% inboxAddress: 收件箱,可留空使用默认邮箱
    if nargin < 2
        inboxAddress = '[email protected]'; %默认邮箱,需替换为自己的邮箱
    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','[email protected]' )  %XXX替换为自己的邮箱

你可能感兴趣的:(Matlab在程序运行异常及正常后发送邮件通知)