近期由于需要做一些需要随时调整参数的MATLAB仿真,所有参数都仿真时间不允许,但单次仿真时间太长,坐等也不合适(杂事较多)。突发奇想,想看看能不能在程序结束时给自己发微信。结果没查到怎么发微信,倒查到了怎么发邮件。本来已有的CSDN博客已足够解决代码问题,但无奈遇到了大家大概率会遇到的“身份验证失败”问题,相关博客又没有解决方案,所以干脆一并整理至此,以便大家一步到位解决问题。
如果你需要用Python发邮件,可以参考链接如何用Python发邮件?。
如何用MATLAB发邮件?
1. MATLAB源代码
下面是本人使用的代码,各位填好个人邮箱地址、授权码和服务器三处需要修改的信息后,可以直接使用。
function mail2me( subject, message, varargin )
% Function: Mail to myself.
MailAddress = 'xxx@163.com'; %个人邮箱地址
password = 'yyy'; % 授权码
setpref('Internet', 'E_mail', MailAddress);
setpref('Internet', 'SMTP_Server', 'smtp.163.com'); % 服务器
setpref('Internet', 'SMTP_Username', MailAddress);
setpref('Internet', 'SMTP_Password', password);
props = java.lang.System.getProperties;
props.setProperty('mail.smtp.auth', 'true');
if nargin > 2 % 如果有附件
sendmail( MailAddress, subject, message, varargin{1} );
else % 如果没有附件
sendmail( MailAddress, subject, message );
end
end
上述函数的三个形参分别代表邮件主题,邮件内容,附件(可选)。使用时,可在自己的仿真程序末尾添上
mailTome('程序运行已结束','程序运行已结束,请尽快查看');
如果还有附件,可采用下面的代码
mailTome('程序已结束','程序运行已结束,请尽快查看', 'result.jpg'); % 单个文件的附件
mailTome('程序已结束','程序运行已结束,请尽快查看', {'result_1.jpg', 'result_2.csv'}); % 多个附件
注1:代码中的“授权码”直接填密码可能也对,但如果MATLAB提示“身份验证失败”了,请参考本博客第2项来解决。
注2:服务器与注册的邮箱网站对应。这里以网易163和126邮箱为例:
163邮箱的SMTP服务器: smtp.163.com
126邮箱的SMTP服务器: smtp.126.com
网易其他邮箱、QQ邮箱、gmail等据查也是可以的,各位可以百度相关邮箱的SMTP服务器(如搜索“163邮箱的SMTP服务器”,浏览信息即可找到),将代码中的“smtp.163.com”更换为相应的服务器即可。注3:有兴趣了解大致原理的各位,可以参考sendmail函数的MATLAB官方中文文档。里面有sendmail函数使用方法的详细介绍,各位可以根据个人需求,按需定制。
2. 如何解决“身份验证失败”的问题
把password设置为邮箱密码后,在MATLAB中运行上述代码,可能会出现“身份验证失败”(或“Authentication failed”)的问题。这是因为邮箱网站官方出于对你邮箱的保护,避免一旦获取了你的邮箱和密码就可以滥用你的邮箱,所以增加的一道障碍,称为“授权码”。(可能不严谨,不过大家理解就好~)
想要解决,只需要搜索“xxx邮箱如何获取授权码”,找到相应解决方案即可。
这里以163邮箱为例,说一下我在过程中遇到的问题(搜索不一定找得到的部分)。
相信使用邮箱的各位都能在自己邮箱的设置界面找到POP3/SMTP/IMAP这一选项,找到“IMAP/SMTP服务”一项,选择开启。之后按照要求官方要求扫码以给制定账号发送短信,即可获得需要的授权码(官方给的一段乱码)。如果一切顺利,那么没问题;但我遇到的情况是,我的这项服务已经开启,还是不知道自己的授权码是什么。
这时,我的解决方案是:
- 选择关闭该项服务,然后再开启;
- 按照相应要求扫码、发短信,获取授权码。如果没有其他问题,直接把得到的授权码粘贴,赋值给password变量即可。
但如果你在手机上使用了“邮箱大师”,那么你很可能还会遇到下面的问题:之前可以用密码登录的邮箱就已经无法再用密码登录了。解决方案是原来需要输入密码的位置,现在需要输入你新获得的授权码。鉴于网易在给你授权码的时候,会提醒你“此授权码只显示一次”,建议各位保存好该授权码。如果确实忘记了,按步骤重新申请一个授权码也可以解决。
3. 如何保证授权码/密码的隐私性
因为各种原因,个人的代码可能会分享给其他人或被他人看到。而mail2me函数中存在个人邮箱地址及关键的授权码/密码。为避免关键信息的泄露,可以运行下面的代码
pcode mail2me
此时,相应文件夹下除了“mail2me.m”文件外,还会生成一个“mail2me.p”文件。删除“mail2me.m”,直接使用“.p”后缀的文件即可。这是MATLAB自带的代码保护机制“protected-code”。似乎有人专门做了这个的破解,但难度极高,本人多方查找,仍未找到可以打开“,p”后缀函数的代码(说来话长)。因此,隐私保护能力个人认为绝对够用了。
记得保存好你的授权码哦。当你只有“.p”文件后,连你自己也看不到当时的授权码是什么了。如果再需要,据我所知只能重新申请了。😦
之所以能想到保护机制,得益于博客Matlab 程序结束后发送短信或者邮件,本文的主要代码也是参考该博客。另外,博客如何使用matlab发邮件 sendmail也提醒了我可以在MATLAB的官方文档中查找MATLAB的sendmail函数。标注在此,一并感谢。
整理不易,如果你觉得对你有用,请帮我点个赞吧 😃