BookmarkSubscribeRSS Feed
Leandro_Vasconc
Fluorite | Level 6

Olá,

 

Quero encaminhar e-mails via SAS para vários destinatários, precisava de uma sugestão de como criar uma macro para automatizar esse processo.

 

- Ex Tabela com os e-mails

 

setor    nome             e-mail

1234    João              joao@empresa.com.br

4567    Maria            maria@empresa.com.br

8901    Antônio         antonio@empresa.com.br

2345    Joaquina       joaquina@empresa.com.br

 

- Ex de tabela de dados:

 

setor   produto     valor

1234   papel        15,50

1234   grampo     8,00

4567   papel        20,00

8901   papel        12,50

8901   grampo     14,50

8901   fita             3,00

 

A macro precisa encaminhar um e-mail para cada pessoa

 

 

 

 

- Exemplo e-mail:

 

Prezado João,

 

Segue dados referentes ao setor 1234

 

produto     valor

papel        15,50

grampo     8,00

 

Att,

 

Almoxarifado

 

Cada pessoa deve receber apenas os dados referentes ao seu próprio setor.

 

Alguém consegue me ajudar?

 

6 REPLIES 6
hZomer
Obsidian | Level 7

Boa tarde,

Seu servidor tem de ter uma porta smtp aberta.

No modelo abaixo adicionei um proc print para dispor uma tabela específica.

Aí é só ajustar para cada departamento uma macro!

 

Veja aí, espero que ajude:

 

 

******************************************************
* SAS GUIDE - Program send e-mail            *
* BR-Zomer, jun2021                                     *
*******************************************************
* Necessário ajustar o nome do servidor smtp *
*                            smtp.?????.com.br             *
******************************************************;

%macro GeraEmail();
TITLE " ";
options emailsys=smtp emailhost='smtp.?????.com' emailport=25;
FILENAME OUTPUT EMAIL
SUBJECT = "SEU CABECALHO"
attach=("/endereco/nome_anexo.xlsx" content_type="application/xlsx")
FROM = "remetente@remetente.com.br"
TO=('destinatario1@remetente.com.br', 'destinatario2@remetente.com.br')
cc=('destinatario2@remetente.com.br', 'destinatario4@remetente.com.br')
type='text/html'
CT ='text/html';
ods html body=OUTPUT
style=htmlblue;
ods escapechar='^';
ODS TEXT="^S={font_face='Arial' font_size=3 fontweight=Medium foreground=black}Prezados,";
ODS TEXT=" ";
ODS TEXT="^S={font_face='Arial' font_size=3 fontweight=Medium foreground=black}Segue com seu texto.....";
ODS TEXT=" ";
ODS TEXT=" ";

PROC PRINT
DATA=WORK.TABELA_VLR NOOBS STYLE(HEADER)={JUST=C FOREGROUND=BLACK font_size=3} STYLE(TABLE)={JUST=C WIDTH=50%} LABEL;
LABEL SETOR='Setor';
LABEL PRODUTO='Produto';
LABEL VALOR='Valor Opr';
VAR SETOR / STYLE(DATA)={JUST=C font_size=3} STYLE(HEADER)={BACKGROUND=#f4D7D7};
VAR PRODUTO / STYLE(DATA)={JUST=C font_size=3} STYLE(HEADER)={BACKGROUND=#f4F4D7};
VAR VALOR / STYLE(DATA)={JUST=R font_size=3} STYLE(HEADER)={BACKGROUND=#DCF4D7};
RUN;

ODS TEXT=" ";
ODS TEXT="^S={font_face='Arial' font_size=3 fontweight=Medium foreground=black}Atenciosamente,";
ODS TEXT=" ";
ODS TEXT="^S={font_face='Arial' font_size=3 fontweight=Medium foreground=black}-------------------------------------------------------------------------------------------------------------------------------------------";
ODS TEXT="^S={font_face='Arial' font_size=2 fontweight=Medium foreground=black}Esta é uma mensagem automática do sistema SAS. Não é necessário responder.";
ODS TEXT="^S={font_face='Arial' font_size=3 fontweight=Medium foreground=black}-------------------------------------------------------------------------------------------------------------------------------------------";
ods html close;
%mend GeraEmail;

 

%GeraEmail();

Leandro_Vasconc
Fluorite | Level 6

Obrigado pela dica, mas o problema é em relação aos destinatários.

 

Tentando colocar o problema de uma outra forma.

 

- Preciso que a tabela com os destinatários seja aberta, capture o ID do setor, nome do funcionário e e-mail.

- Então gere um e-mail para funcionário selecionado, incluindo uma tabela que tem o nome começando com o respectivo ID

 

Essa rotina deve ser aplicada para cada um dos IDs, sendo que a qtd pode variar, ou seja, hoje pode ter 5 IDs, amanhã 40 IDs.

 

Pensei em criar variáveis para fazer as capturas dentro da tabela de destinatários, aí seria apenas colar elas na macro de e-mail, mas não sei como criar essa rotina de abrir tabela, salva o dado na variável, repetindo isso enquanto não chega no último registro da tabela.

 

mbmpaulo
Calcite | Level 5

Leandro,

 

Entendi seu problema e montei uma query que vai receber as tabelas "email" e "produto" conforme você criou no início deste tópico. Elas poderão conter o número de setores / produtos / e-mails que forem, mas o SAS se encarregará de fazer os disparos pra cada uma das combinações. Segue:


/*************************************************************************/
/*Cria contagem de e-mails a serem disparados*/

 

data work.email_enviar;
retain INDEX;
set work.email;
INDEX = _N_;
run;

 

/*************************************************************************/
/*Conta quantos e-mails serão disparados*/

 

proc sql noprint;
select max(INDEX)
into :MAX
from work.email_enviar;
quit;

 

/*************************************************************************/
/*Macro que irá disparar os e-mails*/

 

%macro email;

 

/*Looping*/

 

%do I = 1 %to &MAX.;

 

/*Seleciona e-mail da vez*/

 

data work.email_da_vez;
set work.email_enviar (where=(INDEX=&I.));
call symput('NOME',strip(NOME));
call symput('SETOR',strip(SETOR));
call symput('EMAIL',strip(EMAIL));
run;

 

/*Busca produtos de seu setor*/

 

proc sql;
create table work.email_da_vez as select
tb1.*, tb2.*
from work.email_da_vez as tb1
left join work.produto as tb2
on tb1.SETOR = tb2.SETOR;
quit;

 

/*Disparo do e-mail*/

 

filename mailbox email;

title " ";
filename output email
subject = "Produtos no almoxerifado"
sender = 'Leandro Vasconc'
replyto = 'leandro.vasconc@empresa.com.br'
from = ('Leandro Vasconc <leandro.vasconc@empresa.com.br>')
to = ("&EMAIL.")

type = 'text/html'
CT = 'text/html';
ods html body = output
style=htmlblue;

ods escapechar='^';
ods text = "^S={font_face='Arial' font_size=3 fontweight=Medium foreground=black}Prezado(a) &NOME.,";
ods text = " ";
ods text = "^S={font_face='Arial' font_size=3 fontweight=Medium foreground=black}Seguem dados referentes ao setor &SETOR.:";
ods text = " ";
ods text = " ";

proc print
data = work.email_da_vez (keep=PRODUTO VALOR) noobs style(header)={just=c foreground=black font_size=3} style(table)={just=c width=50%} label;
run;

ods text = " ";
ods text = "^S={font_face='Arial' font_size=3 fontweight=Medium foreground=black}Atenciosamente,";
ods text = " ";
ods text = "^S={font_face='Arial' font_size=3 fontweight=Medium foreground=black}Almoxerifado";
ods html close;

%end;

%mend email;
%email;

Romanojr
Calcite | Level 5

Vc saberia como eu tiro as bordas geradas em cada linha?  No HTML fica ok, mas no  Outlook (desktop) as linhas antes e depois da tabela aparecem todas em tabelas.  Segue abaixo o código fonte que aparece no Outlook.

 

<table class="systitleandfootercontainer" width="100%" cellspacing="1" cellpadding="1" rules="none" frame="void" border="0" summary="Page Layout">
<tr>
<td class="l systemtitle5">Teste de e-mail OK!</td>
</tr>
</table><br>
<table width="100%" style=" border: 0px solid #000000; border-spacing: 0px;" cellspacing="0" cellpadding="0" rules="none" frame="void">
<tr>
<td class="l usertext">&nbsp;</td>
</tr>
</table>
<table width="100%" style=" border: 0px solid #000000; border-spacing: 0px;" cellspacing="0" cellpadding="0" rules="none" frame="void">
<tr>
<td class="l usertext">Prezados,</td>
</tr>
</table>
<table width="100%" style=" border: 0px solid #000000; border-spacing: 0px;" cellspacing="0" cellpadding="0" rules="none" frame="void">
<tr>
<td class="l usertext">Segue com seu texto.....</td>
</tr>
</table>

cmrworldtech
Calcite | Level 5
Pode tentar farzer isso, clicar na linha, no conector ou na forma que
deseja excluir e presionar delete. Mas caso queira excluir mais de uma
linha ou um conjunto de conectores, selecione a primeira linha e pressione
CTrl, mantendo-o botão pressionado enquanto seleciona os outros conectores
ou linhas e pressione delete.

Zomer
Calcite | Level 5

Bom dia,

Realmente, no Outlook para desktop também tenho esse problema quando coloco vários ODS, cheio de linhas, aff...

 

O que descobri e atualmente faço depois de muito pesquisar e milhares de tentavas e erros (pq tb não achei nada nesse sentido nos fóruns) e deixo como sugestão é:

 

  • Colocar "tudo" dentro de um único ODS

 

Simples não?!?!?!

 

E funciona muito bem, abro um ODS no início, faço as aberturas, laços, parâmetros, tables e procs necessárias, além das chamadas HTML, e só fecho no final, deixo tudo num grande "quadradão" 😁

 

Fica praticamente imperceptível, usuário nem vê (até eu esqueço desde detalhe).

Teste ai!

 

Espero que ajude,

Abraço!