Histórico da Página
01. DADOS GERAIS
| Produto: | TOTVS Saúde Planos
| ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Linha de Produto: | Linha Protheus | ||||||||||||||||
| Segmento: | Saúde | ||||||||||||||||
| Módulo: | GESTÃO DE CONTRATOS / FAMÍLIAS | ||||||||||||||||
| Função: | GERENCIADOR DE EMAILCONTAS DE E-MAIL | ||||||||||||||||
| Issue : | DSAUBE-26611 |
02.
...
SITUAÇÃO/REQUISITO
Foi necessário criar uma rotina automatizada para o envio de e-mails, com o objetivo de tornar a comunicação mais eficiente e padronizar as mensagens geradas pelo sistema.
Durante esse processo, identificou-se a importância de permitir a configuração de eventos para disparo automático, garantindo que as notificações sejam enviadas de forma precisa e no momento adequado.
03. SOLUÇÃO
Gerenciador de Contas de E-
...
O gerenciador de contas de e-mails mail foi desenvolvido para otimizar e automatizar o envio de e-mails de forma rápida, segura e personalizada.
Introdução
Com uma interface intuitiva, o gerenciador de contas de e-mails mail permite a personalização de mensagens com campos dinâmicos. Além disso, pode ser utilizado em customizações das mais simples as mais comprexascomplexas.
O gerenciador de contas de e-mails mail também prioriza a segurança, utilizando protocolos de envio confiáveis (como SMTP com autenticação TLS).
Funcionalidades
Entre as principais funcionalidades do gerenciado de e-mails, destacam-se:
Layouts em HTML e CSS
- Criação de layouts específicos em HTML e CSS para cada configuração.
Configuração de Remetentes
- Permite configurar diferentes remetentes para rotinas diferentes ou para uma mesma rotina
...
- .
Personalização do Corpo do E-mail
...
- Personalize o
...
- corpo do e-
...
- mail de acordo com diferentes rotinas
...
- , utilizando a mesma conta de e-mail ou contas distintas, conforme a necessidade sem precisar alterar código-fonte.
Como Acessar a Rotina
- Para acessar o gerenciador de contas de e-mail, digite no campo que está na parte superior do lado esquerdo a seguinte informação: PLMNG001.
- Voce também pode acessar a rotina navegando pelo menu:Miscelanea > Configurações > Gerenciador de Contas de E-mail.
Tela de configuração de e-mail:
Tela de configuração de e-mail:
1 - Título Conf. - Título de identificação do gerenciador de E-mail.
...
- Título Conf. - Título de identificação do objetivo da configuração.
- Usu. Conta / Senha - Dados do e-mail remetente que irá enviar o
...
- e-mail.
...
- Autentica? -
...
- Define se a conta utiliza fator de autenticação. Ao selecionar a opção 1 - Sim, é obrigatório preencher os campos Usuário Aut. e Senha Aut. Caso contrário, o preenchimento desses campos não é necessário.
- Usuario Aut. / Senha Aut. - Usuário de e-mail com dados de autenticação e token de autenticação para liberar o envio de
...
- e-mail.
...
5 - Remetente - Remetente que será enviado o E-mail.
6 - SMTP / Porta - SMTP do E-mail que está sendo configurado como Rementente (No exemplo estamos utilizando Gmail) e a Porta que deve ser usada conforme seleção do Passo 7 (No exemplo, utilizamos a porta SSL).
7 - Utiliza TLS? / Utiliza SSL? - Uma das duas deve estar como Sim para poder fazer a conexão com o SMTP e deverá ser configurado conforme informações do Passo 6.
8 - Assun. Email - Assunto que irá aparecer no E-mail que será enviado.
9 - Corpo E-mail - Dados do HTML e CSS para personalizar o E-mail que será enviado conforme tópico Código exemplo de HTML para geração do E-mail.
10 - Func. Dados - Função de dados para extrair informações da rotina para preencher o E-mail.
- A função de dados deve retornar um objeto JSON onde os atributos devem ser um sequencial de numeral conforme o exemplo no tópico Função de Dados Exemplo.
11 - Funcao Conf. - Função que chamará esse Gerenciador de E-mail (No Exemplo está sendo chamado ao Bloquear um Beneficiário).
...
| Nota |
|---|
Em alguns provedores de serviços de e-mail, a senha de acesso à conta e a senha de autenticação para aplicativos externos são diferentes. Além disso, pode ser necessário autorizar o uso da conta por aplicativos de terceiros para o envio de e-mails. Recomenda-se consultar o provedor de e-mail utilizado para verificar se as configurações e credenciais estão corretas. |
- Remetente - Endereço do remetente que será utilizado para o envio do e-mail.
- SMTP - SMTP do E-mail que está sendo configurado como remetente (no exemplo estamos utilizando Gmail).
- Porta - Porta do SMTP.
- Utiliza TLS? / Utiliza SSL? - A configuração pode variar de acordo com o provedor de serviços de e-mail utilizado, consulte o provedor de e-mail utilizado para verificar.
- Assun. E-mail - Assunto que irá aparecer no E-mail que será enviado.
- Corpo E-mail - Dados do HTML e CSS para personalizar o corpo do e-mail que será enviado. Exemplo disponível no tópico Exemplo de Código HTML Para o Corpo do E-mail.
Exemplo de Código HTML Para o Corpo do E-mail
| Bloco de código | ||
|---|---|---|
|
...
Função de Dados Exemplo:
| Bloco de código | ||||||||
|---|---|---|---|---|---|---|---|---|
| ||||||||
#INCLUDE "Totvs.ch"
function dados()
Local cCompHtml := ""
Local oJEmailData := JsonObject():New()
cCompHtml += "<tr>"
cCompHtml += " <td>" + AllTrim(BA1->BA1_NOMUSR) + "</td>"
cCompHtml += " <td>" + DTOC(BA1->BA1_DATINC) + "</td>"
cCompHtml += " <td>" + DTOC(BA1->BA1_DATBLO) + "</td>"
cCompHtml += "</tr>"
oJEmailData["1"] := BA1->BA1_NOMUSR
oJEmailData["2"] := BA1->(BA1_CODINT+BA1_CODEMP+BA1_MATRIC+BA1_TIPREG+BA1_DIGITO)
oJEmailData["3"] := BA1->BA1_EMAIL
oJEmailData["4"] := BA1->BA1_TELEFO
oJEmailData["5"] := cCompHtml
Return oJEmailData |
Código exemplo de HTML para geração do E-mail
| Bloco de código | ||||||||
|---|---|---|---|---|---|---|---|---|
| ||||||||
<!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <style> body {<!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <style> body { font-family: Arial, sans-serif; margin: 0; padding: 0; background-color: #f4f4f4; } .container { max-width: 600px; margin: 40px auto; padding: 20px; fontborder-familyradius: Arial, sans-serif8px; marginbackground-color: 0#ffffff; paddingbox-shadow: 0; 4px 8px rgba(0, 0, background-color: #f4f4f40, 0.05); } .container {header, max-width: 600px;.footer { marginbackground-color: 40px auto#6c9ebd; paddingcolor: 20px#ffffff; bordertext-radiusalign: 8pxcenter; background-colorpadding: #ffffff10px; boxborder-shadowradius: 08px 4px 8px rgba(0, 0, 0, 0.05); } .header, .footer { backgroundborder-colorradius: #6c9ebd0 0 8px 8px; colormargin-top: #ffffff20px; textfont-alignsize: center14px; } padding:h2 10px;{ bordertext-radiusalign: 8px 8px 0 0center; color: #333; } .footerinfo { border-radiuspadding: 010px 0 8px 8px; marginfont-topsize: 20px16px; font-sizecolor: 14px#555; } h2.info strong { text-aligncolor: center#222; } color: #333; table { } .info { padding: 10px 0width: 100%; fontborder-sizecollapse: 16pxcollapse; colormargin-top: #55520px; } .info strong {th, color: #222;td { } border: 1px table {solid #ddd; widthpadding: 100%12px; bordertext-collapsealign: collapseleft; } margin-top: 20px; th }{ th, background-color: #6c9ebd; td { color: #ffffff; border: 1px solid #ddd;} padding: 12px;tr:nth-child(even) { textbackground-aligncolor: left#f9f9f9; } th.company-name { backgroundfont-colorsize: #6c9ebd20px; color: #ffffff#333; } text-align: center; tr:nth-child(even) {margin-bottom: 20px; backgroundfont-colorweight: #f9f9f9bold; } </style> .company-name {</head> <body> font-size: 20px;<div class="container"> <div color: #333; class="header"> <h2>Usuario Bloqueado</h2> text-align: center; </div> margin-bottom: 20px;<p class="info"> font-weight: bold; <strong>Prezado(a):</strong> ##1, portador da matrícula } <<strong>##2</style>strong> </head>p> <body> <div<p class="container">info">Esperamos que esta mensagem o(a) encontre bem.</p> <div<p class="headerinfo"> <h2>Usuario Bloqueado</h2> </div> Verificamos em nosso sistema que seu plano de saúde foi bloqueado devido <p class="info"> <strong>Prezado(a):</strong> ##1, portador da matrícula à inadimplência. Conforme a Resolução Normativa nº 593 da ANS (Agência Nacional de Saúde <strong>##2</strong> </p> Suplementar), o contrato pode ser suspenso ou <p class="info">Esperamos que esta mensagem o(a) encontre bem. rescindido caso haja atraso superior a 60 dias, consecutivos ou não. </p> <p class="info"> VerificamosPara emrestabelecer nossoseus sistemaserviços quede seuassistência planoà desaúde, saúdeé foinecessário bloqueado devido regularizar os àdébitos inadimplênciapendentes. ConformeCaso ajá Resoluçãotenha Normativaefetuado nº 593 da ANS (Agência Nacional de Saúde Suplementar), o contrato pode ser suspenso ouo pagamento, rescindido caso haja atraso superior pedimos a 60gentileza dias,de consecutivosdesconsiderar ouesta nãomensagem. </p> <p class="info"> ParaEstamos restabelecerà seusdisposição serviços de assistência à saúde, é necessáriopara auxiliá-lo(a) no que for necessário. </p> regularizar os débitos pendentes. Caso<table> já tenha efetuado o pagamento, <thead> pedimos a gentileza de desconsiderar esta mensagem.<tr> </p> <p class="info"><th>Nome</th> Estamos à disposição para auxiliá-lo(a) no que for necessário. <th>Data de Inclusão</th> </p> <th>Data de <table>Bloqueio</th> <thead> </tr> <tr></thead> <tbody> <th>Nome</th> ##5 <th>Data de Inclusão<</th>tbody> </table> <th>Data de Bloqueio</th> <div class="footer"> <p> </tr> Entre </thead> em contato conosco para mais informações.<br />Email: ##3 <tbody>| ##5Telefone: ##4 </tbody>p> </table> div> <div class="footer"></div> <p> Entre em contato conosco para mais informações.<br />Email: ##3 | Telefone: ##4 </p> </div> </div> </body> </html> |
Função de Configuração
| Bloco de código | ||||||||
|---|---|---|---|---|---|---|---|---|
| ||||||||
//Código acima
// instanciando a classe Gerenciadora de E-mail
oemail := totvs.protheus.health.plan.configurator.EmailConfigurator():New()
// Chamada do método responsável por fazer todo o processamento de envio de E-mail.
// param1 = Cod. do ID do gerenciador,
// param2 = email destinatário,
// param3 = Diretório de anexos que deseja enviar no email (Pode receber um array de diretórios),
// param4 = email que você deseja enviar como cópia
ojson := oemail:SendEmailUsingConfigurator(, "[email protected]",, )
//Código abaixo |
...
</body>
</html> |
- Func. Dados - Função que retorna os dados que por sua vez irão substituir as marcações no HTML com o ##Número.
- Para função de usuário, deve-se inserir a chamada completa U_FuncaoUsuario sem parênteses.
- A função de dados deve retornar um objeto JSON onde os atributos devem ser um sequencial de numeral conforme o exemplo no tópico Exemplo de Função de Dados.
Exemplo de Função de Dados:
| Bloco de código | ||||||||
|---|---|---|---|---|---|---|---|---|
| ||||||||
#INCLUDE "Totvs.ch"
function dados()
Local cCompHtml as character
Local oJEmailData := JsonObject():New()
cCompHtml += "<tr>"
cCompHtml += " <td>" + AllTrim(BA1->BA1_NOMUSR) + "</td>"
cCompHtml += " <td>" + DTOC(BA1->BA1_DATINC) + "</td>"
cCompHtml += " <td>" + DTOC(BA1->BA1_DATBLO) + "</td>"
cCompHtml += "</tr>"
oJEmailData["1"] := BA1->BA1_NOMUSR
oJEmailData["2"] := BA1->(BA1_CODINT+BA1_CODEMP+BA1_MATRIC+BA1_TIPREG+BA1_DIGITO)
oJEmailData["3"] := BA1->BA1_EMAIL
oJEmailData["4"] := BA1->BA1_TELEFO
oJEmailData["5"] := cCompHtml
Return oJEmailData |
- Funcao Conf. - Campo destinado ao nome da função ou método que utilizará a configuração de e-mail. Cada função ou método deve ser inserido em uma nova linha no grid, permitindo o uso compartilhado da configuração por diferentes pontos do sistema.
- A função inseridano campo Funcao Conf. não pode ser do tipo static e deverá fazer a chamada da função conforme tópico Função de Configuração.
- Para função de usuário, deve-se inserir a chamada completa U_FuncaoUsuario sem parênteses.
Envio de E-mail Utilizando a Configuração do Gerenciador de Contas de E-mail
Após configurar uma conta no Gerenciador de Contas de E-mail, essa configuração poderá ser utilizada para o envio de mensagens, considerando os dados do remetente e o layout em HTML definidos. Para isso, basta utilizar o método SendEmailUsingConfigurator da classe EmailConfigurator. Com apenas alguns parâmetros, a classe identifica automaticamente a configuração apropriada, executa a função de retorno de dados, realiza a substituição das marcações no conteúdo e efetua o envio do e-mail.
Sintaxe
|
Parâmetros
Nome | Tipo | Descrição | Obrigatório |
|---|---|---|---|
| cConfigCode | caractere | Código sequencial criado pelo gerenciador de contas de e-mail no campo ID Config. | |
| cRecipient | caractere | Endereço de e-mail do destinatário que receberá o e-mail. | X |
| aAttachments | Array | Array contendo em cada posição o caminho completo do arquivo com a extensão que será enviado junto ao e-mail. | |
| cCopOcult | caractere | Endereços de e-mail dos destinatários que receberão a mensagem como cópia oculta (CCO), separados por vírgula. |
Retorno
Nome | Tipo | Descrição |
|---|---|---|
oJSendmail | json | Retorna um objeto do tipo json com dois atributos. oJSendmail["sendMail"] - Retorna .T. caso o e-mail tenha sido enviado com sucesso, ou retorna .F. caso tenha ocorrido algum erro no envio. oJSendmail["message"] - Mensagem de sucesso ou de erro. |
| Nota |
|---|
O parâmetro cConfigCode deve ser utilizado apenas quando for necessário informar diretamente o código de uma configuração de e-mail, dispensando o preenchimento do campo "Função Conf." na configuração. Nesse caso, não é preciso vincular a função ou método de origem ao envio do e-mail. No entanto, vale destacar que, ao utilizar esse parâmetro, qualquer alteração de layout exigirá a modificação direta no código-fonte, o que reduz a flexibilidade e dificulta a manutenção. Por esse motivo, recomenda-se evitar o uso do parâmetro cConfigCode e, sempre que possível, preencher o campo "Função Conf." com o nome da função responsável pelo envio do e-mail. |
Função de Configuração
Primeiro identifique a função (não pode ser static) ou método que irá realizar o processo de envio do e-mail.
No exemplo abaixo a função de usuário MailTste irá utilizar uma das configurações do gerenciador de contas de e-mail para enviar o e-mail.
| Bloco de código | ||||||||
|---|---|---|---|---|---|---|---|---|
| ||||||||
User Function MailTste()
Local oemail as object
Local ojson as object
// instanciando a classe Gerenciadora de E-mail
oemail := totvs.protheus.health.plan.manager.EmailManager():New()
// Chamada do método responsável por fazer todo o processamento de envio de e-mail
// param1 = ID do gerenciador
// param2 = e-mail destinatário
// param3 = Diretório de anexos que deseja enviar no e-mail (Pode receber um array de diretórios)
// param4 = e-mail que você deseja enviar como cópia
ojson := oemail:SendEmailUsingManager(NIL,"[email protected]")
If ojson["sendMail"] //.T. = enviado com sucesso
FWAlertSuccess(ojson["message"])
Else
FWAlertError(ojson["message"])
EndIf
Return |
Após a implementação da classe de envio de e-mail, acesse o Gerenciador de Contas de E-mail, localize a configuração que será utilizada e insira o nome da função no campo "Função Conf." do grid que no caso será U_MAILTSTE. É possível adicionar quantas linhas forem necessárias para registrar diferentes funções ou métodos que utilizarão essa configuração.
Log de Erros
A maioria dos erros relacionados ao envio de e-mails utilizando o Gerenciador de Contas de E-mail pode ser analisada em maior detalhe no arquivo LogConfigEmail.log, localizado no diretório LOGPLS, dentro da pasta PROTHEUS_DATA.
Vídeo com o resultado das configurações acima:
| View file | ||||
|---|---|---|---|---|
|
04. DEMAIS INFORMAÇÕES
Atualização do Dicionário de Dados
inclusão de itens da tabela BZD no Arquivo SX3:
...
| Tabela | BZF |
| Modo | Compartilhado |
| Modo Unidade | Exclusivo |
| Modo Empresa | Exclusivo |
| Chave Única | BZF_FILIAL + BZF_IDBZD + BZF_FUNCFG |
| Nome | Funcoes do Config. de email |
Card documentos Informacao As alterações de dicionário referente a essa implementação estarão disponíveis através de pacote de expedição contínua do plano de saúde com data igual ou superior
| Informacao | As alterações de dicionário referente a essa implementação estarão disponíveis através de pacote de expedição contínua do plano de saúde com data igual ou superior |
|---|
...
30/05/2025. Titulo Importante
| 30/05/2025. | |
| Titulo | Importante |
|---|
05. ASSUNTOS RELACIONADOS
Não se aplica
| Templatedocumentos |
|---|
...


