配置
如果想用SAS发邮件,还是需要在邮箱中配置一下的,比如开启SMTP,这个就需要登录网页版邮箱去开启,其实本来打算用网易邮箱为例,不过最近登录网易邮箱进行设置我一直点不动...所以就以新浪、搜狐、QQ邮箱为例...
SINA
新浪邮箱的配置是很简单的,只需要勾选一下SMTP就可以了...这里有2个,好像是任意选一个就可以了,不过吧,反正都勾上又不花钱所以还是都勾上好....勾上后就可以正常的使用邮箱账号和邮箱密码用第三方发邮件了,这里发邮件的端口是25...
SOHU
搜狐邮箱的SMTP同样和上面一样...其实每个邮箱开启SMTP都是在设置里面...端口同样是25..
QQ邮箱
首先要请原谅的我无知与无能,普通的QQ邮箱SAS好像暂时还是不支持的,因为QQ邮箱现在好像采用了SSL加密,所以不管你是否端口填对了,还是授权码填对了,都是不可行的....(QQ邮箱SMTP的端口是:465),如果是QQ邮箱可以用Python来操作,待会贴上在网上找的Python代码...还是先来看看如何设置
主要大概是前面俩个比较关键吧,本着都开启也就不要钱的原则就都开启吧...其实每个开启的时候都有一个授权码,当然也可以用最下方的生成授权码来生成...这个授权码就是你用其他软件登陆发邮件的密码,QQ邮箱发件的端口是465...好像官方说也可能是587,当然我这里测试得到的是465... 准备好了这些后,就可以用第三方发邮件了,我在网上找到的Python发邮件的代码..
代码语言:javascript复制import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
my_sender='352055644@qq.com'
my_user='xiaocgn@163.com'
def mail():
ret=True
try:
msg=MIMEText('填写邮件内容','plain','utf-8')
msg['From']=formataddr(["发件人邮箱昵称",my_sender])
msg['To']=formataddr(["收件人邮箱昵称",my_user])
msg['Subject']="主题"
server=smtplib.SMTP_SSL("smtp.qq.com",465)
server.login(my_sender,"此处填写授权码")
server.sendmail(my_sender,[my_user,],msg.as_string())
server.quit()
except Exception:
ret=False
return ret
ret=mail()
if ret:
print("ok")
else:
print("filed")
总结一下,SMTP的开启也是很简单的。那么用程序语言来实现发邮件的功能,如果遇到ERROR,常见的问题大概就是如下的几类了:1.SMTP未开启、2.端口未填写正确、3.邮件内容被认为是垃圾或携带病毒、4.你程序写的有问题了...
程序编写
还是回到正文上面来,在SAS发邮件的程序到底该怎么写,当然程序实现的方式有很多种,仅以我这次的为例,先来看看我这次用SAS发的邮件张的啥样子...
见上图,为邮件的正文及附件,那么如何来实现这些功能(附加,正文列表等)呢,接下来就与我一步一步的来看看我这个程序的代码怎么写的....还是简单大体的说一下原理:option设置发件端口邮箱账号密码等,接下里用filename设置收件人、抄送人、添加附加等等,利用ods、proc report等来输出html作为邮件正文...
第一步:option选项的配置
代码语言:javascript复制options emailsys=smtp;
options emailauthprotocol=PLAIN;
options emailhost="smtp.sina.com";/*SMTP,中间填写对应厂商*/
options emailport=25;/*端口*/
options emailackwait=30;
options emailid="xiaocgn@sina.com";/*发件箱*/
options emailpw="邮箱的密码";
第二步:filename设置邮件主题、收件人等等
代码语言:javascript复制filename temp email to = ( "xiaocgn@sohu.com" ) cc = ("cashes@126.com" )
subject="填写邮件主题" type="text/html" attach=("D:日常练习sas_gtemlnewdoc二维码.jpg");
第三步:制作邮件中资料列表的数据集....(连接都是真实可靠的资料...)
代码语言:javascript复制data temp1;
length name url $200.;
input name $ ;
input url $ ;
cards;
SAS各版本安装包及下载资源
http://pan.baidu.com/s/1kV5mU6F
SAS安装教程
http://mp.weixin.qq.com/s/_8SkZfL_mDaWfJMsSRBP5Q
SAS最新SID及更新方法
http://mp.weixin.qq.com/s/582kFr9x9GtTpUjtjqkwpg
SAS基础相关书籍
https://pan.baidu.com/s/1eUaWTBs
SAS统计类书籍及视频及考证资料题库
https://pan.baidu.com/s/1raduvKw
;
run;
第四步:既然要用到Ods输出,为了字体样式好看一点,就稍微用proc template写一下邮件的样式...也就想改变一下边框,所以随便找了一个系统自带style,修改了一下边框...
代码语言:javascript复制proc template;
define style style_tb1;
parent = styles.rtf;
replace table from output /
frame = void
rules = all
cellspacing = 0pt
cellpadding = 0pt;
end;
run;
第五步:ods text与proc report书写正文、制作样式....(注意:下面的第一句body=temp,这里temp是filename哪儿定义的,所以执行这部分就是在发邮件)
代码语言:javascript复制ods html body=temp style =style_tb1;
title ;
ods html text = "Hi,您好!";
ods html text = "首先请允许我做一个简单的自我介绍,我是微信公众号:SAS程序分享号号号(公众号的微信号:xiaocgn)的小编,
同时值此新春佳节之际,我在这里给您拜年了!";
ods html text = "诚邀各位前辈关注小编的公众号,为了推广,小编已经无所不用其极了,如有打扰,真诚的在此给您道歉~
同时,作为一个SAS编程的晚辈,也欢迎各位前辈关注、指点以及交流...";
ods html text = "在这里,我为您准备了很多迟到的SAS资源....";
proc report data=temp1 nowd headline headskip
style(report)={just=left asis=on }
style(header)={just=left asis=on }
style (column) = {background = #E0FFFF CELLHEIGHT = 2.5% font_face = "Times New Roman" font_size = 7pt just=left};
columns ("资料列表" name url) ;
define name /display ' ' ;
define url / display ' ' ;
run;
ods html text = "Br";
ods html text = "xiaocgn";
ods _all_ close;
单个群发
用程序来发邮件,是为了实现一个群发功能,上面的代码只是发一个人,虽然说可以filename 中的to=(“收件邮箱1" “收件邮箱2” “收件邮箱3”...),但是邮箱对单封邮件最多发送的人都是有限制的,而且同一封邮件如果多个收件人的话,那么很容易造成进入别人垃圾箱...所以在这里就并没有用单封多个收件的人的手段,而且一封邮件一个人收件人...那么也是仅仅写一个循环就可以的...
代码语言:javascript复制%macro sas_send(mail=);
filename temp email to = (" &mail.") subject="....." type="text/html" attach=("D:日常练习sas_gtemlnewdoc二维码.jpg");
ods html body=temp style =style_tb1;
title ;
ods html text = "Hi,您好!";
ods html text = "首先请允许我做一个简单的自我介绍,我是微信公众号:SAS程序分享号号号(公众号的微信号:xiaocgn)的小编,同时值此新春佳节之际,我在这里给您拜年了!";
ods html text = "诚邀各位前辈关注小编的公众号,为了推广,小编已经无所不用其极了,如有打扰,真诚的在此给您道歉~
同时,作为一个SAS编程的晚辈,也欢迎各位前辈关注、指点以及交流...";
ods html text = "在这里,我为您准备了很多迟到的SAS资源....";
proc report data=temp1 nowd headline headskip
style(report)={just=left asis=on }
style(header)={just=left asis=on }
style (column) = {background = #E0FFFF CELLHEIGHT = 2.5% font_face = "Times New Roman" font_size = 7pt just=left};
;
columns ("资料列表" name url) ;
define name /display ' ' ;
define url / display ' ' ;
run;
ods html text = "Br";
ods html text = "xiaocgn";
ods _all_ close;
%mend;
data _null_;
set eml_ds;
call execute('%sas_send(mail='||strip(final)||strip(')'));
run;
前面的配置就不在这里放到Macro中包裹起来(也可以包裹起来), 然后通过call execute来实现循环执行宏的操作,set eml_ds;是包含邮箱的数据,final是一个变量(下面的每一条观测是一个邮箱)...这样就可以实现群发功能了,如果有更高的需求,比如说弄多个发件箱,实现自动交替发件,都可以基于本文代码进行一些简单的修改就可以实现了....
把最终的效果在贴一次,作为本文的结尾!发邮件的代码基本上说完了,本文作为(续1),那么会不会有(续2)呢....这个有想法,但大概近期不会有,同时,要向那些收到我垃圾邮件的朋友在这里再说一次抱歉
因为在未来你还可能会在次收到我的垃圾邮件....因为这次吸收关注效果不怎么样,大概也就吸收了50多个关注,由于我是一个急性子,自动发的邮件没几个,几乎全是手动群发的(有阅读回执),收到的阅读回执不多,所以应该大部分进了垃圾箱,所以我还要发...
或许大概再过半年等网上积攒一波新的邮箱,在一起发一次......
今天就这么多了,后续内容,敬请期待~