很久很久以前,有人问小编:SAS如何实现发邮件的功能,小编尴尬的反问道:SAS居然还能发邮件?是的,SAS可以实现发邮件的功能。以前觉得这个功能好鸡肋,现在小编变赖了,想将一切都交个SAS去实现半自动化乃至全自动化。在运行完SAS程序后,自动将产生的结果发给指定的人。
适用场景:SAS 程序已经调试并测试完成,无bug。如果程序有漏洞,在你执行完后,将有错误的结果对外发送了,那你就尴尬了。
比较适合向小编这种对自己的程序有充分的“自信”的人。。
更适合向小编这样自吹自擂天下一绝的人群。。
code
01
Options
设置邮箱
options emailsys=SMTP;
options emailauthprotocol=LOGIN;
options emailhost="smtp.126.com";/*设置邮箱*/
options emailid="xxxx@126.com";/*设置邮箱账号*/
options emailpw="xxxx";/*设置邮箱密码*/
options emailport=25;
NOTE:小编这里用的126邮箱,163等邮箱都是类似的。但是QQ邮箱是不信的,QQ非企业邮箱为啥不行,小编也不知道,腾讯的企业邮箱是可以的,小编公司的邮箱是腾讯企业邮箱。
optionsemailsys=SMTP;
options emailauthprotocol=LOGIN;
options emailhost="smtp.exmail.qq.com";
options emailid="xxxxx@xxx.com";
options emailpw="xxxx";
options emailport=25;
02
Send
all
Filename mymail email"xxx@xxx.com";/*发邮件的账号*/
data_null_;
file mymail to=("xxxx@qq.com" “xxx@126.com”) /*收件人*/
cc=("xxxx@qq.com" “xxx@163.com”) /*抄送人*/
subject="SAS output" /*主题*/
attach=("A:\Macros.zip" );/*附件*/
put' Daer,';
put' ';
put'Please see attachment for the SAS Output Result . ';
put'Any question, pls contact me freely andtimely, thanks. ';
put' ';
put'Best regards, ';
put' ';
put'gongnxc ';
run;
filename mymail clear;
看完是不是发现简单,恩,确实很简单的。但是有没有发现我添加的附件的.zip文件。压缩包的好处有多个,可以节约上传时间。也避免多个附件重复添加的繁琐。那么问题来了,SAS输出的报表,还是要人工去压缩打包成压缩包啊,并没有实现全自动化啊。不,SAS可以把文件夹,文件打包。SAS语言虽然不可以(小编目前见识短浅暂时还没有发现SAS语言有这个功能,如有大神知道,还请留言相关,万谢!),但是我们可以在SAS中借用第三方语言,如Python语言。然后在通过SAS调用Python语言去实现该功能。
Python:将文件夹压缩成zip Code(此代码通过SAS生成)
代码
1.先引入一个辅助Macro,检查一个文件是否存在
%macro dde_file_yn(myfilerf);
%local _Localhave;
%if%sysfunc(fileexist(&myfilerf))%then%do;
%put NOTE:The external file &myfilerfdoes exist.;
%let _Localhave=1;
%end;
%else%do;
%put NOTE:The external file &myfilerfdoes not exist.;
%let _Localhave=0;
%end;
&_Localhave.
%mend dde_file_yn;
2.sas生成zip文件(本质Python生成zip)
%macro pyh_file2zip(filepath=,outpath=,zipname=);
/*此处创建一个St_Excute_temp.txt 的文件,是为了在后面检查zip是否完全压缩成功,在zip完全压缩成功后,Python代码将执行删除该.txt文件,然后SAS通过判断.txt文件是否存在,在去判断zip文件是否完全压缩成功*/
data _NULL_;
file "&outpath.\St_Excute_temp.txt" encoding="utf-8" lrecl=30000;
run;
options noxsync noxwait;
/*Create a Python Code*/
data _NULL_;
file "&outpath.\file2zip.py" encoding="utf-8" lrecl=30000;
put "import zipfile";
put "import os";
put "if os.path.exists(r'&outpath.\&zipname..zip'):os.remove(r'&outpath.\&zipname..zip')";
put "z=zipfile.ZipFile(r'&outpath.\&zipname..zip', 'w', zipfile.ZIP_DEFLATED)";
put "startdir = '&filepath.'";
put "for dirpath, dirnames, filenames in os.walk(startdir):";
put " for filename in filenames:";
put " z.write(os.path.join(dirpath, filename))";
put "z.close()";
put "if os.path.exists(r'&outpath.\St_Excute_temp.txt'):os.remove(r'&outpath.\St_Excute_temp.txt')";
run;
data _null_;
%if %dde_file_yn(&outpath.\file2zip.py)=0 %then %do;
%put NOTE: Please wait a little,The Python Code will be Created...;
%end;
%do %until (%dde_file_yn(&outpath.\file2zip.py)=1);
%end;
%if %dde_file_yn(&outpath.\file2zip.py)=1 %then %do;
x " %superq(outpath)\file2zip.py";
%end;
%put NOTE: The Python Code Will be Executed...;
run;
/*延迟结束SAS macro的执行,等待ZIP完全压缩完成*/
data _null_;
%if %dde_file_yn(&outpath.\St_Excute_temp.txt)=1 %then %do;
%put NOTE: Please wait a little,The Python Code will be Excuted...;
options nonotes;
%end;
%do %until (%dde_file_yn(&outpath.\St_Excute_temp.txt)=0);
%end;
%if %dde_file_yn(&outpath.\St_Excute_temp.py)=0 %then %do;
options notes;
x "del &outpath.file2zip.py";
%end;
run;
%mend;
/*
filepath:填写需要压缩的文件夹
outpath:填写压缩输出的路径
zipname:填写zip的名称
注意:filepath outpath 不要填相当,为啥不要填一个路径,你可以自己测试一下
测试的时候磁盘空间全占满了,不要怪我。
*/
%pyh_file2zip(filepath=A:\macro,outpath=A:\,zipname=Macros);
★
好了,把上面的都串联起来,就可以实现SAS运行完程序后,自动将结果生成压缩包,在将zip通过邮件自动的发出去。代码都可以直接用。
还有一个小编没有提到,如何把SAS弄成定时运行,一周运行一次,一个月运行一次,完全不用人在去操作,这个也是肯定能做到的。由于小编的数据并不是直接从SQL数据库里面拽出来的,也没有一定的规律,所有小编就没有研究。只要你敢想,很多事情是可以做到。
题外话:给大家科普一点知识:冬天到了,很多人会感冒,但是感冒怎么吃药都不管用,这是为什么呢?因为小小的感冒还分很多类型:风寒感冒,风热感冒,不要吃错了药喔!!!否则向小编这样,越吃药越有一种死神来了的感觉~
★