Hello,
Recently, I encounter one problem on email sending. In my code, if there is no error (&syscc. = 0) the email will be sent with error free message. If &syscc. <= 4, the email will be sent with warning message. Otherwise, the email will be sent with error alert message.
This code works well on Unix via SAS EG (also run the code on Unix), and I can receive all these three type of messages under different situation. The log of "%f_notice;
" for error alert message by SAS EG is below:
379 %f_notice;
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
4 The SAS System 15:07 Thursday, August 25, 2022
NOTE: The file OUTBOX is:
E-Mail Access Device
Message sent
To: "test@test.com"
Cc:
Bcc:
Subject: Test_Code run status for 202207
Attachments: (
"/sasdata/Test_Code.log" CONTENT_TYPE =
"application/txt" )
NOTE: 2 records were written to the file OUTBOX.
The minimum record length was 66.
The maximum record length was 141.
NOTE: There were 2 observations read from the data set WORK.BODY_FAIL.
NOTE: DATA statement used (Total process time):
real time 0.02 seconds
cpu time 0.00 seconds
NOTE: Fileref OUTBOX has been deassigned.
380
However, when I run it on Unix via "Tectia - SSH Terminal", both "Error free" and "Warning" messages can be sent successfully, but the message with "Error alert" cannot be sent. The log of "%f_notice;
" for error alert message by Unix via "Tectia - SSH Terminal" is below:
354 %f_notice; NOTE: DATA statement used (Total process time): real time 0.00 seconds cpu time 0.00 seconds NOTE: DATA statement used (Total process time): real time 0.00 seconds cpu time 0.01 seconds NOTE: DATA statement used (Total process time): real time 0.00 seconds cpu time 0.01 seconds NOTE: Fileref OUTBOX has been deassigned. 355
The code is included as below. Could anyone please advise on this? Is there any difference on initial options between SAS EG and Unix environment caused this observation?
Any suggestion will be appreciated!
Thanks,
Wayne
data body_Success;
length body $500.;
body = "The code of &report_code. is executed successfully without any issue for &YM_ID..
<br /><br />
Please find the details in the attached log."; output;
body = "<br /><br /><i>This is an automated e-mail. Please do not respond."; output;
run;
data body_Fail;
length body $500.;
body = "The code of &report_code. is failed on &YM_ID. execution.
<br /><br />
Please find the details in the attached log."; output;
body = "<br /><br /><i>This is an automated e-mail. Please do not respond."; output;
run;
data body_Warn;
length body $500.;
body = "The code of &report_code. is successfully executed for &YM_ID., but some warning messages are detected.
<br /><br />
Please find the details in the attached log."; output;
body = "<br /><br /><i>This is an automated e-mail. Please do not respond."; output;
run;
/* Email with XLSX attachments */
%macro EMAIL_XLSX (subject=, body=, to=, from=%str(Automated Process <do.not.reply@test.com>), attach1=, attach2=, attach3=, attach4=, attach5=);
data _null_;
call symput("to", tranwrd(trim(left(%trim("&to."))), " ", ",")); /* space delimited - replace all spaces with comma */
run;
data _null_;
length out $1024;
To = %trim("&to.");
do while (index(To,",")>0);
out = trim(out) || ' "' || trim(substr(To, 1, index(To,",")-1)) || '"';
To = strip(substr(To, index(To,",")+1, length(To)-index(To,",")));
end;
out = trim(out) || ' "' || trim(To) || '"';
out = trim(out);
call symput("To", out);
run;
filename outbox email "do.not.reply@test.com";
data _null_;
file outbox
to=(&to.)
from=("&from.")
sender=("&from.")
subject="&subject."
attach=("&attach1." content_type="application/txt")
type='text/html'
;
set &body.;
put Body;
run;
filename outbox clear;
%mend;
%macro f_notice;
%if &syscc. = 0 %then %do;
%EMAIL_XLSX(
subject=%str(&report_code. monthly run status for &YM_ID.),
body=body_Success,
to= &daily_exrtact_recipients.,
attach1=%str(&report_code_folder.&report_code..log)
);
%end;
%else %if &syscc. <= 4 %then %do;
%EMAIL_XLSX(
subject=%str(&report_code. monthly run status for &YM_ID.),
body=body_Warn,
to= &daily_exrtact_recipients.,
attach1=%str(&report_code_folder.&report_code..log)
);
%end;
%else %do;
%EMAIL_XLSX(
subject=%str(&report_code. monthly run status for &YM_ID.),
body=body_Fail,
to= &daily_exrtact_recipients.,
attach1=%str(&report_code_folder.&report_code..log)
);
%end;
%Mend;
Is it possible that in that other environment OPTIONS ERRORABEND is set?
ERRORABEND System Option
Specifies whether SAS responds to errors by terminating.
Hi @ChrisHemedinger ,
Thank you so much for your quick response! It is possible, but looks like the code keep running after encountering the first error. Because, in my test code, I have one more data step to create a new table after the error process. The new table can be created successfully.
However, may I know how to cancel the option of "ERRORABEND"? I tried "Options = NOERRORABEND;" at the first beginning of the code, but it still does not work.
Thanks,
Wayne
I just checked by %put %sysfunc(getoption(errorabend));, and the value is 'NOERRORABEND'. Therefore, this should not be the root cause. I plan to compare all of options tomorrow to see if there is any difference between my EG and Unix environment.
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.