背景:
有时候在实验室,通过MATLAB做一个计算或者仿真,需要花比较长的时间,比如十几个小时甚至几天。我们希望MATLAB跑完后,我们能够得到通知,或者能够了解到结果。 这个时候,可以设置在MATLAB跑完后,给我们发个邮件,并且把一些计算结果当做附件给我们发过来。如果手机绑定了邮箱,我们就可以立刻知道跑完了,并且大致了解结果。
一个小Demo
我做了一个小的demo来实现以上的需求。这个demo在MATLAB 2018b上做的,邮件发送使用的网易126邮箱。
demo功能介绍
在Simulink中建立了一个简单的模型(没有什么实际意义,仅仅用于展示)代表我们要做仿真计算的任务。 当这个仿真运行完成后,向我的邮箱发送一封邮件,把仿真结果作为正文内容发过来,附件为仿真结果的一张图形。 假设我的邮件地址为 [email protected] ,当然这是一个假的地址 ????
准备工作
为了发邮件,我们需要上我们的126邮箱,对其进行一定的设置,才能让MATLAB把我们的邮件发送出去。虽然我只是以126为例,但是其他邮箱应该也有类似的设置方法。
- 开启SMTP服务
在126邮箱中有一个【设置】选项
选择其中的【POP3/SMTP/IMAP】
然后选中 【POP3/SMTP服务】和【IMAP/SMTP】服务
记住这里的smtp地址,待会会用到
然后开启客户端授权密码,这个密码可以设置成与邮箱的密码不一样,主要用于像这种代发代收的客户端的,设置成不一样更加安全。通过MATLAB发送邮件,其实可以认为MATLAB也是一个客户端。
以上,就把邮箱的设置弄完了
Simulink模型
从一个正态分布生成器中产生数据,将数据的最大、最小值导出到maxValue, minValue,并且所有数据导出到value, 时间序列导出到time。
仿真脚本
sim('simple_model');
plot(time, value);
rlt_str = sprintf('Max=%.2f\nMin=%.2f\n', maxValue, minValue);
rlt_file = 'rlt.jpg';
saveas(gcf, rlt_file);
mail_rlt('Simulation Result', rlt_str, rlt_file);
其中的mail_rlt函数的代码如下
function mail_rlt(mailtitle,mailcontent,attached_file)
receiver='[email protected]'; % 对方的邮件地址
sender = '[email protected]'; % 本人邮箱地址
password = '123456'; % 授权密码非登录密码
smtp_addr = 'smtp.126.com' %smtp服务器地址,可以从邮箱配置中查到
% 服务器设置
setpref('Internet','E_mail',sender);
setpref('Internet','SMTP_Server',smtp_addr);
setpref('Internet','SMTP_Username',sender);
setpref('Internet','SMTP_Password',password);
props = java.lang.System.getProperties;
props.setProperty('mail.smtp.auth','true');
props.setProperty('mail.smtp.socketFactory.class', 'javax.net.ssl.SSLSocketFactory');
props.setProperty('mail.smtp.socketFactory.port','465');
sendmail({sender, receiver},mailtitle,mailcontent, attached_file); %为了避免126将此邮件识别为垃圾邮件(报错554 DT:SPM)发不出去
fprintf('Send Successful\n');
end
这里要注意的一个地方,就是在发送时要把自己的邮件地址也放到收件人列表中,这样做可以避免网易邮箱把这封邮件误认为是垃圾邮件,从而拒绝,发不出去。