Envio de e-mails via fila de e-mails

De IT's Instruções de Trabalho - FAHOR/CFJL
Ir para navegação Ir para pesquisar

Esta instrução mostra como utilizar a fila de e-mails para enviar mensagens de e-mail, ao invés do componente nativo Enviar e-mail.

O problema do componente nativo é que ele bloqueia a execução do processo até a conclusão do envio da mensagem. Assim, por exemplo, caso esse componente seja utilizado em uma fórmula visual disparada automaticamente por um gatilho do sistema ao salvar um registro, o processo de salvamento fica bloqueado até o envio do e-mail concluir. Caso o envio do e-mail falhe momentaneamente, o processo de salvamento do registro falha. Se essa falha for uma indisponibilidade do servidor de e-mails, o processo irá levar vários segundos para falhar (até atingir o timeout da conexão). Para processos executados em lote ainda há a situação de que uma das mensagens "do meio" da lista pode falhar durante o envio, interrompendo a execução do processo pela metade, levando à situações em que algumas mensagens são enviadas e outras não.

O uso da fila de e-mails visa evitar esse tipo de situação. A inclusão do e-mail na fila é uma operação rápida, que envolve apenas o banco de dados, e nenhum recurso extra de rede. As mensagens existentes na fila são coletadas e enviadas posteriormente pela execução da fórmula visual 452 - Envia e-mails na fila de e-mails, que está agendada para ser executada automaticamente a cada minuto e a sua execução é monitorada pelo Dude. Assim, caso o processo de envio das mensagens da fila de e-mails pare por algum motivo (trancamento do sistema ou erro de rede que impeça o envio das mensagens), um alerta é gerado para que possamos atuar nele. De qualquer forma, as mensagens existentes na fila não são perdidas; no máximo elas serão enviadas um pouco mais tarde, quando a fila de e-mails for reprocessada.

O processo

Em resumo, o que precisa ser feito é incluir o registro com os campos que compõe a mensagem na tabela CFJLFAHOR_FILAEMAILS. Há 2 formas de fazer isso, conforme descrito abaixo.

Inclusão manual

Insira o registro manualmente na tabela CFJLFAHOR_FILAEMAILS, utilizando os componentes SQLActivity ou o componente de execução de SQLs nativo da Totvs. A tabela possui a seguinte estrutura:

  • ID int identity not null,
  • DESTINATARIO varchar(1024),
  • CC varchar(1024),
  • CCO varchar(1024),
  • ASSUNTO varchar(1024) not null,
  • MENSAGEM varchar(max) not null,
  • HTML varchar(5) not null,
  • DATAHORAINCLUSAO datetime not null,
  • PROCESSOORIGEM varchar(1024),
  • ENVIADO bit not null

Detalhamento

  • Campo HTML: aceita os valores True ou False. Quando preenchido como True, indica que o conteúdo da mensagem (campo MENSAGEM) deve ser interpretado como um HTML e não como texto puro.
  • Campo DATAHORAINCLUSAO: informe a data/hora atual, do momento da inserção.
  • Campo PROCESSOORIGEM: texto livre, que permite identificar mais facilmente qual o processo que incluiu a mensagem na fila.
    • Uma sugestão, para fórmulas visuais, é incluir o texto Fórmula visual IDXXX - NOME DA FÓRMULA VISUAL.
  • Campo ENVIADO: informe 0 ao inserir um registro novo. Ele será alterado para 1 quando o processo de envio efetivamente fizer o envio da mensagem.

Inclusão via fórmula visual, a partir dos resultados de uma SQL

Com frequência ocorre a situação em que existe uma consulta SQL que retorna os dados que precisam ser enviados por e-mail. Assim, foi criado uma fórmula visual que pega o resultado de uma SQL e, automaticamente, faz a inserção destes na tabela CFJLFAHOR_FILAEMAILS. Para isso, estruture a fórmula visual da seguinte forma:

  1. Inclua o componente nativo Executar consulta SQL.
    • Vincule ele em uma consulta que retorne os seguintes campos: DESTINATARIO, CC, CCO, ASSUNTO, MENSAGEM, HTML (com os valores True ou False) e PROCESSOORIGEM. Esses campos precisam existir no resultado (podem ser incluídos campos extras, mas estes são os campos mínimos que devem estar contidos no resultset produzido ao executar a consulta). Campos não utilizados devem estar preenchidos com NULL.
  2. Inclua o componente nativo Executar fórmula visual.
    • Propriedade Código da coligada: defina como 1
    • Propriedade ID da fórmula visual: defina como 453 (que é a fórmula visual Inclui e-mail na fila de envio a partir de dataset)
    • Propriedade Conjunto de dados: ligue ela à propriedade DataSet do componente Executar consulta SQL inserido no passo anterior.

Durante a execução, o sistema irá executar a consulta SQL e o resultado será transferido para a fórmula visual 453 - Inclui e-mail na fila de envio a partir de dataset. A fórmula visual irá se encarregar de inserir os dados na tabela CFJLFAHOR_FILAEMAILS.

Inclusão via fórmula visual, usando uma fila local na fórmula visual

As 3 atividades utilizadas para montar uma fila local, antes de juntar os dados à fila global

Para situações em que os dados do e-mail não são fornecidos por uma consulta SQL mas sim montados utilizando alguma lógica na própria fórmula visual, uma opção é criar um dataset local, inserir os dados neste dataset (que atuará como uma fila de e-mails "local" à fórmula visual) e, depois, incluir todo o conteúdo desse dataset na tabela CFJLFAHOR_FILAEMAILS (que é a fila global que pode ser utilizada a partir de qualquer processo do ERP). Para isso, inclua os componentes a seguir, e configure suas propriedades da seguinte forma:

  1. Componente Criar fonte de dados (dataset).
    1. Priopriedade Nome do conjunto de dados: informe algo (ex: ListaEmails). Este nome não é utilizado em nenhum local, mas é necessário preenchê-lo para que a inserção de dados funcione.
    2. Propriedade Estrutura de tabelas: clique no botão ... e configure a tela da seguinte forma:

      ClipCapIt-251007-160339.PNG

  2. Componente Adicionar registro na tabela.
    1. Propriedade Tabela: vincule ela na propriedade Tables[0].DataTable do componente Criar fonte de dados (dataset) inserido no passo anterior.
    2. Dados da mensagem: preencha/vincule as novas propriedades que surgiram com os dados da mensagem a ser enviada, conforme print a seguir:

      ClipCapIt-251007-160642.PNG

  3. Componente Executar fórmula visual.
    1. Propriedade Código da coligada: defina como 1
    2. Propriedade ID da fórmula visual: defina como 453 (que é a fórmula visual Inclui e-mail na fila de envio a partir de dataset)
    3. Propriedade Conjunto de dados: ligue ela à propriedade DataSet do componente Criar fonte de dados (dataset).

Obs: um exemplo completo, a partir do qual pode ser copiado o componente Criar fonte de dados (dataset) (já com todas as propriedades preenchidas) pode ser observado na fórmula visual 459 - Envio de e-mail via fila de e-mails - construção da fila local.