在MATLAB中发送电子邮件(支持附件)

by  dynamic

通过 MATLAB 发送邮件的意义在于,假如您编写了一个程序,希望客户对您的程序有一个反馈或者 bug 提交等互动交流!

另外假如在运行一个大型程序,我们希望将运行过程和结果发送到我们指定的邮箱,方便了解运行进展情况。

MATLAB 自带有 sendmail 函数,可以用来发送电子邮件,但是 sendmail 只能发送不需要 authentication 的邮箱地址,但是互联网上公共邮箱几乎都需要 authentication。

不用担心,由于 Matlab 支持 smtp 邮件,故 163,QQ,gmail 都可以在 MATLAB 中利用 Java 的方式发送邮件。

MATLAB 中的 Demo 中有详细介绍。但是不同的 MATLAB 版本会遇到不同的问题。另外这里有一篇论文,大家可以参考下
<ignore_js_op>

在 MATLAB 中发送电子邮件.pdf

(206.8 KB, 下载次数: 0)

2014-3-19 01:24 上传

点击文件名下载附件

</ignore_js_op>

设定 smtp 服务器,然后使用 sendmail 发送邮件:



% 设置发送邮件的配置,我们用gmail举例

mail = 'my.email.address@gmail.com'; %gmail地址,qq或者163也可以的

password = 'matlabsky';  %邮箱密码



%下面是gmail的标准配置,其他邮箱,可以相应修改

setpref('Internet','E_mail',mail);

setpref('Internet','SMTP_Server','smtp.gmail.com');

setpref('Internet','SMTP_Username',mail);

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('收件人email','邮件标题','邮件内容!')

写成函数的形式(支持附件发送):



function MySendMail

a = rand(100);

DataPath = [matlabroot,filesep,'mydata.mat'];

save(DataPath,'a');

MailAddress = '我的邮箱地址';

password = '我的密码';  

setpref('Internet','E_mail',MailAddress);

setpref('Internet','SMTP_Server','smtp.gmail.com');

setpref('Internet','SMTP_Username',MailAddress);

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');

subject = 'MATLAB 发的测试邮件';

content = '你好,这份邮件是我用MATLAB发的,数据见附件';

sendmail('收件人地址',subject,content,DataPath);

如果在 7.0 以下的版本中 sendmail 的一些 smtp 语法跟不上当前的时代,需要修改语句。在 Matlab7.0 版 sendmail.m 的 140 到 150 行左右:



sendSMTP(out, in, ['MAIL FROM: ' from], 1);改为:sendSMTP(out, in, ['MAIL FROM: <' from '>'], 1);

sendSMTP(out, in, ['RCPT TO: ' to{i}], 1); 改为:sendSMTP(out, in, ['RCPT TO: <' to{i} '>'], 1);

sendSMTP(out, in, ['RCPT TO: ' to], 1);改为:sendSMTP(out, in, ['RCPT TO: <' to '>'], 1);在第210~220行附近:

sendSMTP(out, in, '.',1); 改为:sendSMTP(out, in, sprintf('\n.\n'), 1);

在 7.0 版本以上不需要修改即可用,输入以下代码:



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');

然而,现行的 smtp 服务器都需要身份验证,Matlab7.0 版的 sendmail.m 不支持身份验证,向 m 文件中添加验证语句。

打开 Matlab7.0 版的 sendmail.m 找到 130 多行的语句:



“sendSMTP(out, in, 'HELO mailman', 1);”

在此行之后添加以下三行:



sendSMTP(out, in, 'auth login', 1);

sendSMTP(out, in, '加密的用户名', 1);

sendSMTP(out, in, '加密的密码', 1);

然后输入:



setpref('Internet','SMTP_Server','smtp.email.com');

setpref('Internet', 'E_mail', '用户名');

setpref('Internet', 'E_mail', '密码');

最后,可以向别人发邮件了:



sendmail('收件人地址','邮件标题',{'邮件内容','内容','内容'},'附件地址')

注意:Matlab 发送邮件是通过 Java 接口,速度比较慢,所以不推荐添加太大的附件,以免发送失败。并且 MATLAB 不支持发送中文信息,会出现乱码,当然假如十分特别有这种想法的,可以先用函数 double 将中文转化为数字矩阵保存,然后用 setstr 再转为中文即可。