Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Informações
iconfalse

Índice


Pré Requisitos

...

  • TOTVS 12 com versão 12.1.

...

  • 15 ou superior;
  • Comunicação com o AppServer ativa e funcional para o resgate das informações 'base' para o envio de e-mail;
  • Servidor de e-mails com

...

  • suporte a SMTP e uma conta válida para envio de e-mails.

Mail Service

O Datasul Mail Service é um serviço que permite que tanto aplicações Progress como HTML possam realizar de forma simples o envio de e-mails.

Por se tratar de um serviço a chamada para o envio do e-mail se dá através de chamadas REST. A imagem abaixo exemplifica a arquitetura do serviço:

 

Image Removed

Configurações mínimas

Para utilização do serviço é preciso se atentar a algumas configurações no produto.

...

  • No caso dos ambientes locais ao utilizar uma das contas de e-mails da TOTVS o usuário é simplesmente o e-mail sem o '@totvs.com.br'.

...

Bloco de código
languagejs
firstline1
titleExemplo
linenumberstrue
#+----------------------------------------------------------+
#|              DATASUL MAIL                                |
#+----------------------------------------------------------+
# Usuário e senha da conta que irá realizar o envio de e-mail.
mail.smtp.user=thiago.weber
mail.smtp.pass=w.as7tset#LK
# Endereço e porta do serviço de e-mail.
mail.smtp.host=mail.totvs.com.br
mail.smtp.port=587
# Habilita o suporte a SMTPS caso o servidor de e-mail esteja com HTTPS (SSL) habilitado.
mail.smtp.ssl.enable=true
# Indica se o servidor de e-mail está com o suporte ao TLS ativo.
mail.smtp.starttls.enable=true
# Habilita o DEBUG da API do JAVA MAIL.
mail.smtp.debug.enable=true

Serviços disponíveis

Através do contexto datasul-mail/resources estão disponíveis 3 serviços para envio de e-mails com as seguintes assinaturas:

 

...

  1. Path: N/A.
  2. Query: N/A.
  3. Body: JSON contendo a entidade Mail;
  4. Response: Uma cópia da entidade Mail em formato JSON.

...

  1. Path: N/A.
  2. Query: N/A.
  3. Body: JSON contendo a entidade Mail;
  4. Response: Uma cópia da entidade Mail em formato JSON.

...

 

...

  • subject: (string) assunto do e-mail;
  • content: (string) conteúdo do e-mail, podendo ser HTML;
  • from: (string) endereço de e-mail do remetente da mensagem;
  • fromName: (string) (opcional) caso queira utilizar um 'apelido' para sobrepor o endereço de e-mail do remetente;
  • to: ([string]) lista contendo os endereços de destinatários;
  • cc: ([string]) (opcional) lista contendo os endereços de destinatários a receberem a cópia do e-mail;
  • bcc: ([string]) (opcional) lista contendo os endereços de destinatários a receberem a cópia oculta do e-mail;
  • returnNotificationType: (integer) (opcional): indica como deve ser o retorno em caso do envio retornar alguma confirmação ou erro.
    • 1. Retorna o e-mail completo;
    • 2. Retorna apenas o cabeçalho (default). 
  • deliveryNotification: (integer) (opcional): indica o tipo de notificação que o remetente gostaria de receber.
    • -1. Nenhuma (defaul);
    • 1. Ao entregar o e-mail ao destinatário;
    • 2. Ao falhar na entrega ao destinatário;
    • 4. Ao atrasar a entrega ao destinatário;
  • readNotificationTo: (string) Em caso de leitura do e-mail, caso tenha sido informado um endereço válido para este atributo, este receberá uma notificação de que o e-mail foi lido;
  • priority: (integer) (opcional): prioridade do e-mail:
    • 1: Alta;
    • 3: (default) Normal;
    • 5: Baixa.

 

Dica

As mensagens de confirmação de entrega e falhas serão retornadas a caixa de e-mail do usuário que estiver sendo utilizado como sender pelo serviço de e-mail. Entretanto, quando informado um endereço de e-mail válido no atributo readNotificationTo este receberá o e-mail de confirmação de leitura.

Dica

O envio de e-mail ocorre de forma assíncrona desta forma os erros ou retornos de falhas do envio propriamente dito não são resgatados no momento da execução. Isso se deve ao fato de que o Datasul Mail Service delega ao servidor SMTP o envio da mensagem, sendo que este pode não efetuar o envio no momento em que for solicitado, variando de acordo com a sua fila de despachos e parametrizações.

API Progress

A API Progress se destina ao uso exclusivo para envio de e-mails, partindo o princípio que conteúdo do e-mail já esteja estruturado e o Progress vai apenas solicitar o envio da mensagem. Para este cenário foi disponibilizada a api: utp/ut-mail-api.p

Nesta API estão disponíveis 3 método, com a seguintes assinaturas:

 

...

Configurações Mínimas

...

Para utilização do serviço, algumas configurações são necessárias:

  • Inserir o trecho de código abaixo no arquivo "josso-agent-config.xml".
Bloco de código
languagexml
<partner-app>
	<context>/dts/datasul-mail</context>
</partner-app>


  • Configurar os parâmetros de localização e porta, interno e externo, do servidor de aplicação (JBoss) no programa 'Parâmetros Gerais Módulo Básico' (btb946aa), aba 'Servidor'. Para mais informações acesse Configurar Aba Servidor (BTB946AA).

  • Configurar os parâmetros para envio de e-mail utilizando o programa 'Parâmetros Email Foundation' (btb962zb).  Para mais informações acesse Parâmetros Email Foundation (BTB962ZB).

Mail Service

...

O Datasul Mail Service é um serviço que permite tanto aplicações Progress quanto HTML possam realizar envio de e-mails de forma simples.

Por se tratar de um serviço, a chamada para o envio do e-mail usando esta funcionalidade é realizada através de chamadas REST.

Exemplo da arquitetura do serviço:


Image Added

Serviços Disponíveis

...

Através do contexto datasul-mail/resources existem 3 serviços disponíveis para envio de e-mails com as seguintes assinaturas:

@GET /help

Path: N/A.

Query: N/A.

Response: Retorna as propriedades do Mail Service (mail.smtp.sender, mail.smtp.auth, mail.smtp.user, mail.smtp.pass, mail.smtp.host, mail.smtp.port, mail.smtp.ssl.enable, mail.smtp.starttls.enable, mail.smtp.debug.enable).


Bloco de código
languagejava
titleEXEMPLO
http://<server>:8080/dts/datasul-mail/resources/help/


@POST /send: @Consumes({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN })

Este serviço recebe o e-mail e suas opções para envio. Não suporta anexos.

Path: N/A.

Query: N/A.

Body: JSON contendo a entidade Mail;

Response: Uma cópia da entidade Mail em formato JSON.


Bloco de código
languagejava
titleEXEMPLO
http://<server>:8080/dts/datasul-mail/resources/send/


@POST /send: @Consumes(MediaType.MULTIPART_FORM_DATA)

Este serviço recebe o e-mail e suas opções para envio. Suporta anexos.

Path: N/A.

Query: N/A.

Body: JSON contendo a entidade Mail;

Response: Uma cópia da entidade Mail em formato JSON.


Bloco de código
languagejava
titleEXEMPLO
http://<server>:8080/dts/datasul-mail/resources/send/


Âncora
mail_object
mail_object


Painel
borderColororange
borderStyledashed

O objeto Mail, encaminhado no corpo das requisições, possui a seguinte estrutura:

  1. subject: (string) assunto do e-mail;
  2. content: (string) conteúdo do e-mail, podendo ser HTML;
  3. reply: (string) (opcional) endereço de e-mail que receberá a resposta do e-mail enviado;
  4. to: ([string]) lista contendo os endereços de destinatários;
  5. cc: ([string]) (opcional) lista contendo os endereços de destinatários a receberem a cópia do e-mail;
  6. bcc: ([string]) (opcional) lista contendo os endereços de destinatários a receberem a cópia oculta do e-mail;
  7. returnNotificationType: (integer) (opcional): indica como deve ser o retorno em caso do envio retornar alguma confirmação ou erro.
    1. 1. Retorna o e-mail completo;
    2. 2. Retorna apenas o cabeçalho (default). 
  8. deliveryNotification: (integer) (opcional): indica o tipo de notificação que o remetente gostaria de receber.
    1. -1. Nenhuma (defaul);
    2. 1. Ao entregar o e-mail ao destinatário;
    3. 2. Ao falhar na entrega ao destinatário;
    4. 4. Ao atrasar a entrega ao destinatário;
  9. readNotificationTo: (string) Em caso de leitura do e-mail, caso tenha sido informado um endereço válido para este atributo, este receberá uma notificação de que o e-mail foi lido;
  10. priority: (integer) (opcional): prioridade do e-mail:
    1. 1: Alta;
    2. 3: (default) Normal;
    3. 5: Baixa.



Dica
  • As mensagens de confirmação de entrega e falhas serão retornadas a caixa de e-mail do usuário que estiver sendo utilizado como sender pelo serviço de e-mail. Entretanto, quando informado um endereço de e-mail válido no atributo readNotificationTo, este receberá o e-mail de confirmação de leitura.


  • O envio de e-mail ocorre de forma assíncrona, desta forma os erros ou retornos de falhas do envio propriamente dito não são resgatados no momento da execução. Isso se deve ao fato de que o Datasul Mail Service delega ao servidor SMTP o envio da mensagem, sendo que este pode não efetuar o envio no momento em que for solicitado, variando de acordo com a sua fila de despachos e parametrizações.



Recursos Disponíveis

...

Para mais informações de quais são os recursos disponíveis quanto a esta opção de envio, consultar o link: Envio de E-mail Datasul.


API Progress

A API a ser utilizada no progress é a utapi019.p que está preparada para enviar e-mails de acordo com a configuração indicada no programa 'Parâmetros Email Foundation(btb962zb).

Para mais informações sobre como utilizar a API utapi019 acesse Utilização de API de envio de e-mail.


Bloco de código
languagejava
themeEclipse
firstline1
titleEXEMPLO Progress: sendWithAttachment
linenumberstrue
collapsetrue
{utp\utapi019.i2}

RUN utp/utapi019.p PERSISTENT SET h-utapi019. 

create tt-envio2.
assign tt-envio2.versao-integracao = 1
       tt-envio2.exchange    = NO
       tt-envio2.servidor    = 'smtp.totvs.com.br'
       tt-envio2.porta       = 587
       tt-envio2.destino     = "[email protected]"
       tt-envio2.remetente   = "[email protected]"
       tt-envio2.assunto     = "Datasul Mail Service"
       tt-envio2.mensagem    = "Hello from the other side !"
       tt-envio2.importancia = 2
       tt-envio2.log-enviada = NO
       tt-envio2.log-lida    = NO
       tt-envio2.acomp       = NO
       tt-envio2.formato     = 'html'.

CREATE tt-mensagem.
ASSIGN tt-mensagem.mensagem = tt-envio2.mensagem.

caso não sejam informados os campos da tabela tt-paramEmail2, serão utilizados as configurações dos parâmetros de email foundation */
CREATE tt-paramEmail2.
ASSIGN tt-paramEmail2.caminhoEmail = 5
       tt-paramEmail2.mailUser = '<user_email>'
       tt-paramEmail2.mailPass = '<senha_email>'
       tt-paramEmail2.TLS      = NO
       tt-paramEmail2.SSL      = NO
       tt-paramEmail2.DEBUG    = YES. 


CREATE ttAttachment.
ASSIGN ttAttachment.fileName = '<nome_arquivo>'.

COPY-LOB FROM FILE ttAttachment.FILENAME TO ttAttachment.fileContent NO-CONVERT NO-ERROR.  /* caso esteja disponível apenas o binário do arquivo, basta atribui-lo ao campo ttAttachment.fileContent */

RUN pi-execute4 IN h-utapi019 (INPUT  Table tt-envio2,
    INPUT  Table tt-mensagem,
    INPUT  Table tt-paramEmail2,
    INPUT  TABLE ttAttachment,
    OUTPUT Table tt-erros).
if  return-value = "NOK" then do:
    for each tt-erros:
        disp tt-erros with 1 column width 300.
    end.                               
end.


API Javascript

Está é a API para utilização nos projetos utilizando THF e está disponível em forma de um serviço nomeado como 'MailService'. Para utilizá-lo, basta injetar o MailService no construtor do seu controller.

Sua principal função é realizar os envios de e-mail a partir de programas HTML, abstraindo a chamada REST (utilizando o Datasul Rest) para a API utapi019, que centraliza qualquer envio de e-mail, tornando a configuração de envio de e-mails única.


O MailService disponibiliza 2 métodos para realizar o envio de e-mail, contendo as seguintes assinaturas:



Painel
borderColororange
borderStyledashed
  1. send
    1. email: contendo o objeto Mail;
      1. reply: Remetente do e-mail;
      2. mailTo: Destinatário do e-mail;
      3. cc: Endereço de e-mail em cópia;
      4. subject: Assunto da mensagem;
      5. content: Conteúdo da mensagem.
    2. callback: função a ser chamada quando terminar o processo.



Painel
borderColororange
borderStyledashed
  1. sendWithAttachment
    1. email: contendo o objeto Mail;
      1. reply: Remetente do e-mail;
      2. mailTo: Destinatário do e-mail;
      3. cc: Endereço de e-mail em cópia;
      4. subject: Assunto da mensagem;
      5. content: Conteúdo da mensagem;
    2. files: anexo ou lista de arquivos anexos obtidos através do seletor de arquivos do navegador;
    3. callback: função a ser chamada quando terminar o processo;
    4. callbackProgress: função que devolve o '%' de progresso do envio dos anexos para o serviço, o evento retornado pelo server a entidade de Mail relacionada ao anexo;
    5. callbackError: função a ser chamada caso ocorra algum erro inesperado.



Bloco de código
languagejs
titleEXEMPLO JavaScript: send
linenumberstrue
collapsetrue
var controller;
controller = function ($rootScope, $scope, MailService) {
	this.sendEmail = funcion() {
		MailService.send({
			reply: "[email protected]",
		    mailTo: "[email protected]",
			cc: "[email protected]",
			subject: "Datasul Mail Service",
			content: "Hello from the other side !"
		}, function(result) {
			console.info(result);
		});
    };
};
controller.$inject = ['$rootScope', '$scope', 'MailService'];
Bloco de código
languagejs
titleEXEMPLO JavaScript: sendWithAttachment
linenumberstrue
collapsetrue
var controller;
controller = function ($rootScope, $scope, MailService) {
	this.onSelectFiles = function(selectedFiles) {
		if (angular.isDefined(selectedFiles)) {
			this.sendEmail(selectedFiles);
		}
	};
	this.sendEmail = funcion(files) {
		MailService.sendWithAttachment({
			reply: "[email protected]",
		    mailTo: "[email protected]",
			cc: "[email protected]",
			subject: "Datasul Mail Service",
			content: "Hello from the other side !"
		}, files, 
		function(result, mail) {
			console.info(result, mail);
		}, function(progress, evt, mail) {
			console.warn(progress, evt, mail);
		}, function(result, status, headers, config, email) {
			console.error(result, status, headers, config, email);
		});
    };
};
controller.$inject = ['$rootScope', '$scope', 'MailService'];
Bloco de código
languagexml
titleEXEMPLO HTML: sendWithAttachment
linenumberstrue
collapsetrue
<html>
	<head></head>
	<body>	
		<label class="btn btn-default pull-right"
    		   role="button"
	           for="file-input">
			Selecione os arquivos...
		</label>
		<span class="file-text"></span>
    	<input id="file-input"
        	type="file"
	        style="position:fixed;top:-999px;"
    	    ngf-select
        	ngf-change="controller.onSelectFiles($files);"
        	ngf-multiple="true"
            ngf-allow-dir="false"/>
	</body>
</html>

...

  1. m_response: (MEMPTR): entidade Mail em formato JSON, ou erro em caso de algum problema na execução;
  2. i_response_code: (INTEGER): código do status de resposta da chamada REST ao serviço;
  3. c_response_status: (CHARACTER): descrição do status de resposta da chamada REST ao serviço.

 

Dica

Internamente esta API utiliza a API utp/ut-http-api.p para realizar as chamadas REST ao Datasul Mail Service.

Dica

Tanto para montagem do conteúdo do e-mail como para adicionar o conteúdo do arquivo a TEMP-TABLE de anexos, utilize o comando COPY-LOB. No caso do conteúdo do e-mail utilize a opção NO-CONVERT para evitar problemas com charset; por padrão o Datasul Mail Service utiliza o encode UTF-8. Na sessão de exemplos é possível verificar como realizar as operações.

API Javascript

Está é a API para utilização nos projetos com o TFH.

A API está disposta em forma de um service através do nome: 'MailService'.

Sua principal função é abstrair a chamada REST para o serviço do Datasul Mail Service, desta forma ela possui apenas 2 métodos com as seguintes assinaturas:

 

...

  • email: contendo o objeto Mail;
  • files: anexo ou lista de arquivos anexos obtidos através do seletor de arquivos do navegador;
  • callback: função a ser chamada quando terminar o processo.
  • callbackProgress: função que devolve o '%' de progresso do envio dos anexos para o serviço, o evento retornado pelo server a entidade de Mail relacinada ao anexo;
  • callbackError: função a ser chamada caso ocorra algum erro inesperado.

Exemplos

Bloco de código
languagejs
firstline1
titleJavascript: send
linenumberstrue
collapsetrue
var controller;

controller = function ($rootScope, $scope, MailService) {
	this.sendEmail = funcion() {
		MailService.send({
			from: "[email protected]",
			fromName: "Jhon Doe",
		    to: ["[email protected]"],
			cc: ["[email protected]"],
			subject: "Datasul Mail Service",
			content: "Hello from the other side !"
		}, function(result) {
			console.info(result);
		});
    };
};

controller.$inject = ['$rootScope', '$scope', 'MailService'];
Bloco de código
languagejs
firstline1
titleJavascript: sendWithAttachment
linenumberstrue
collapsetrue
var controller;

controller = function ($rootScope, $scope, MailService) {

	this.onSelectFiles = function(selectedFiles) {
		if (angular.isDefined(selectedFiles)) {
			this.sendEmail(selectedFiles);
		}
	};

	this.sendEmail = funcion(files) {
		MailService.sendWithAttachment({
			from: "[email protected]",
			fromName: "Jhon Doe",
		    to: ["[email protected]"],
			cc: ["[email protected]"],
			subject: "Datasul Mail Service",
			content: "Hello from the other side !"
		}, files, 
		function(result, mail) {
			console.info(result, mail);
		}, function(progress, evt, mail) {
			console.warn(progress, evt, mail);
		}, function(result, status, headers, config, email) {
			console.error(result, status, headers, config, email);
		});
    };
};

controller.$inject = ['$rootScope', '$scope', 'MailService'];

------------------------------------------------------------------------------------
<html>
<head></head>
<body>
	
	<label class="btn btn-default pull-right"
    	   role="button"
           for="file-input">
		Selecione os arquivos...
	</label>
	
	<span class="file-text"></span>
    
	<input id="file-input"
           type="file"
           style="position:fixed;top:-999px;"
           ngf-select
           ngf-change="controller.onSelectFiles($files);"
           ngf-multiple="true"
           ngf-allow-dir="false"/>

</body>
</html>
Bloco de código
languagejava
themeEclipse
firstline1
titleProgress: sendSimple
linenumberstrue
collapsetrue
DEFINE VARIABLE h_mail AS HANDLE NO-UNDO.

IF NOT VALID-HANDLE(h_mail) THEN DO: 
	RUN utp/ut-mail-api.p PERSISTENT SET h_mail.
END.

DEFINE VARIABLE c_to                    AS CHARACTER NO-UNDO EXTENT.
DEFINE VARIABLE c_cc                    AS CHARACTER NO-UNDO EXTENT.
DEFINE VARIABLE c_bcc                   AS CHARACTER NO-UNDO EXTENT.
DEFINE VARIABLE c_subject               AS CHARACTER NO-UNDO INITIAL 'Teste API Progress - Datasul Mail Service':U.
DEFINE VARIABLE c_from                  AS CHARACTER NO-UNDO INITIAL '[email protected]':U.
DEFINE VARIABLE c_from_name             AS CHARACTER NO-UNDO INITIAL 'Datasul Mail Service':U.
DEFINE VARIABLE lc_content_mail         AS LONGCHAR  NO-UNDO.
DEFINE VARIABLE l_html                  AS LOGICAL   NO-UNDO INITIAL TRUE.

ASSIGN lc_content_mail = 'Teste de envio de e-mail pelo PROGRESS :D':U.

EXTENT (c_to) = 1.                                       
ASSIGN c_to[1] = '[email protected]':U.

RUN sendSimple IN h_mail(
    INPUT c_to,
    INPUT c_cc,
    INPUT c_bcc,
    INPUT c_subject,
    INPUT c_from,
    INPUT c_from_name,
    INPUT lc_content_mail,
    INPUT l_html,
    OUTPUT mptr_response,
    OUTPUT i_response_code,
	OUTPUT c_response_status
).

IF VALID-HANDLE(h_mail) THEN DO: 
	DELETE PROCEDURE h_mail.
END.
Bloco de código
languagejava
themeEclipse
firstline1
titleProgress: sendWithAttachment
linenumberstrue
collapsetrue
{utp/ut-mail-api.i}

DEFINE VARIABLE h_mail AS HANDLE NO-UNDO.

IF NOT VALID-HANDLE(h_mail) THEN DO: 
	RUN utp/ut-mail-api.p PERSISTENT SET h_mail.
END.

DEFINE VARIABLE c_to                    AS CHARACTER NO-UNDO EXTENT.
DEFINE VARIABLE c_cc                    AS CHARACTER NO-UNDO EXTENT.
DEFINE VARIABLE c_bcc                   AS CHARACTER NO-UNDO EXTENT.
DEFINE VARIABLE c_subject               AS CHARACTER NO-UNDO INITIAL 'Teste API Progress - Datasul Mail Service':U.
DEFINE VARIABLE c_from                  AS CHARACTER NO-UNDO INITIAL '[email protected]':U.
DEFINE VARIABLE c_from_name             AS CHARACTER NO-UNDO INITIAL 'Datasul Mail Service':U.
DEFINE VARIABLE lc_content_mail         AS LONGCHAR  NO-UNDO.
DEFINE VARIABLE l_html                  AS LOGICAL   NO-UNDO INITIAL TRUE.

ASSIGN lc_content_mail = 'Teste de envio de e-mail pelo PROGRESS :D':U.

EXTENT (c_to) = 1.                                       
ASSIGN c_to[1] = '[email protected]':U.

CREATE ttAttachment.
ASSIGN ttAttachment.fileName = '<NOME ANEXO 1>'.
    
COPY-LOB FROM FILE '<CAMINHO ANEXO 1>' 
	TO ttAttachment.fileContent NO-CONVERT NO-ERROR.

CREATE ttAttachment.
ASSIGN ttAttachment.fileName = '<NOME ANEXO 2>'.
    
COPY-LOB FROM FILE '<CAMINHO ANEXO 2>' 
	TO ttAttachment.fileContent NO-CONVERT NO-ERROR.

RUN sendWithAttachment IN h_mail(
    INPUT c_to,
    INPUT c_cc,
    INPUT c_bcc,
    INPUT c_subject,
    INPUT c_from,
    INPUT c_from_name,
    INPUT lc_content_mail,
    INPUT l_html,
	INPUT TABLE ttAttachment,
	OUTPUT mptr_response,
    OUTPUT i_response_code,
	OUTPUT c_response_status
).

IF VALID-HANDLE(h_mail) THEN DO: 
	DELETE PROCEDURE h_mail.
END.
Bloco de código
languagejava
themeEclipse
firstline1
titleProgress: sendWithAttachment
linenumberstrue
collapsetrue
{utp/ut-mail-api.i}

DEFINE VARIABLE h_mail AS HANDLE NO-UNDO.

IF NOT VALID-HANDLE(h_mail) THEN DO: 
	RUN utp/ut-mail-api.p PERSISTENT SET h_mail.
END.

DEFINE VARIABLE c_to                    AS CHARACTER NO-UNDO EXTENT.
DEFINE VARIABLE c_cc                    AS CHARACTER NO-UNDO EXTENT.
DEFINE VARIABLE c_bcc                   AS CHARACTER NO-UNDO EXTENT.
DEFINE VARIABLE c_subject               AS CHARACTER NO-UNDO INITIAL 'Teste API Progress - Datasul Mail Service':U.
DEFINE VARIABLE c_from                  AS CHARACTER NO-UNDO INITIAL '[email protected]':U.
DEFINE VARIABLE c_from_name             AS CHARACTER NO-UNDO INITIAL 'Datasul Mail Service':U.
DEFINE VARIABLE lc_content_mail         AS LONGCHAR  NO-UNDO.
DEFINE VARIABLE l_html                  AS LOGICAL   NO-UNDO INITIAL TRUE.
    
ASSIGN lc_content_mail = 'Teste de envio de e-mail pelo PROGRESS :D':U.

EXTENT (c_to) = 1.                                       
ASSIGN c_to[1] = '[email protected]':U.

CREATE ttAttachment.
ASSIGN ttAttachment.fileName = '<NOME ANEXO 1>'.
    
COPY-LOB FROM FILE '<CAMINHO ANEXO 1>' 
	TO ttAttachment.fileContent NO-CONVERT NO-ERROR.

RUN sendEmail IN h_mail(
    INPUT c_to,
    INPUT c_cc,
    INPUT c_bcc,
    INPUT c_subject,
    INPUT c_from,
    INPUT c_from_name,
    INPUT lc_content_mail,
    INPUT l_html,
	INPUT '[email protected]',
    INPUT 1, /* Notificar: -1. Nunca 1. Sucesso 2. Falha 3. Atraso */
    INPUT 1, /* Tipo de Retorno: 1. Completo 2. Cabeçalho          */
	INPUT 1, /* Prioridade: 1. Alta 3. Normal 5. Baixa             */
    INPUT TABLE ttAttachment,
	OUTPUT mptr_response,
    OUTPUT i_response_code,
	OUTPUT c_response_status
).

IF VALID-HANDLE(h_mail) THEN DO: 
	DELETE PROCEDURE h_mail.
END.
Bloco de código
languagejava
themeEclipse
firstline1
titleProgress: Report + Mail
linenumberstrue
collapsetrue
{utp/ut-mail-api.i}
{utp/ut-report-api.i}

DEFINE VARIABLE i_ocorrencia      AS INTEGER   NO-UNDO INITIAL 101552.
DEFINE VARIABLE c_report          AS CHARACTER NO-UNDO INITIAL 'crm/rel_ratec_tecnico/':U.
DEFINE VARIABLE c_program         AS CHARACTER NO-UNDO INITIAL 'program=/report/crm/crm0001':U.
DEFINE VARIABLE c_format          AS CHARACTER NO-UNDO INITIAL 'html':U.
DEFINE VARIABLE c_dialect         AS CHARACTER NO-UNDO INITIAL 'pt':U.
DEFINE VARIABLE l_publish         AS LOGICAL   NO-UNDO INITIAL TRUE.
DEFINE VARIABLE l_download        AS LOGICAL   NO-UNDO INITIAL TRUE.

DEFINE VARIABLE h_api             AS HANDLE    NO-UNDO.
DEFINE VARIABLE h_mail            AS HANDLE    NO-UNDO.
DEFINE VARIABLE h_report          AS HANDLE    NO-UNDO.

DEFINE VARIABLE lc_content        AS LONGCHAR  NO-UNDO.
DEFINE VARIABLE c_query_params    AS CHARACTER NO-UNDO.

DEFINE VARIABLE i_response_code   AS INTEGER   NO-UNDO.
DEFINE VARIABLE c_response_status AS CHARACTER NO-UNDO.
DEFINE VARIABLE mptr_response     AS MEMPTR    NO-UNDO.

/* ************************************************** */
/* *** Busca os dados para impressão do relatório *** */
/* ************************************************** */

ASSIGN c_query_params = '&num_id_ocor=':U + STRING(i_ocorrencia).

IF NOT VALID-HANDLE(h_api) THEN DO: 
    RUN report/crm/crm0001.p PERSISTENT SET h_api.
END.

RUN getReportDataRPW IN h_api(INPUT TABLE ttReport, INPUT i_ocorrencia, OUTPUT lc_content, OUTPUT TABLE RowErrors).

IF VALID-HANDLE(h_api) THEN DO: 
    DELETE PROCEDURE h_api.
END.

/* ************************************************** */
/* *** Realiza a chamada para o Datasul Report    *** */
/* ************************************************** */

IF NOT VALID-HANDLE(h_report) THEN DO: 
    RUN utp/ut-report-api.p PERSISTENT SET h_report.
END.

RUN print IN h_report (
    INPUT c_report, 
    INPUT c_program, 
    INPUT c_format, 
    INPUT c_dialect,
    INPUT l_publish, 
    INPUT l_download, 
    INPUT lc_content, 
    INPUT c_query_params,
    OUTPUT mptr_response,
    OUTPUT i_response_code,
    OUTPUT c_response_status
).

IF VALID-HANDLE(h_report) THEN DO: 
    DELETE PROCEDURE h_report.
END.

IF i_response_code EQ 200 AND mptr_response NE ? THEN DO:

    /* ************************************************** */
    /* *** Agora enviamos por e-mail o HTML gerado    *** */
    /* ************************************************** */
    
    IF NOT VALID-HANDLE(h_mail) THEN DO: 
        RUN utp/ut-mail-api.p PERSISTENT SET h_mail.
    END.
    
    DEFINE VARIABLE c_to                    AS CHARACTER NO-UNDO EXTENT.
    DEFINE VARIABLE c_cc                    AS CHARACTER NO-UNDO EXTENT.
    DEFINE VARIABLE c_bcc                   AS CHARACTER NO-UNDO EXTENT.
    DEFINE VARIABLE c_subject               AS CHARACTER NO-UNDO INITIAL 'Teste API Progress - Datasul Mail Service':U.
    DEFINE VARIABLE c_from                  AS CHARACTER NO-UNDO INITIAL '[email protected]':U.
    DEFINE VARIABLE c_from_name             AS CHARACTER NO-UNDO INITIAL 'Datasul Mail Service':U.
    DEFINE VARIABLE lc_content_mail         AS LONGCHAR  NO-UNDO.
    DEFINE VARIABLE l_html                  AS LOGICAL   NO-UNDO INITIAL TRUE.
    
    COPY-LOB FROM mptr_response TO lc_content_mail NO-CONVERT NO-ERROR.

    EXTENT (c_to) = 1.                                   
    
    ASSIGN c_to[1] = '[email protected]':U.   
    
    CREATE ttAttachment.
    ASSIGN ttAttachment.fileName = '<NOME ANEXO 1>'.
    
    COPY-LOB FROM FILE '<CAMINHO ANEXO 1>' 
        TO ttAttachment.fileContent NO-CONVERT NO-ERROR.

    RUN sendEmail IN h_mail(
        INPUT c_to,
        INPUT c_cc,
        INPUT c_bcc,
        INPUT c_subject,
        INPUT c_from,
        INPUT c_from_name,
        INPUT lc_content_mail,
        INPUT l_html,
        INPUT '[email protected]',
        INPUT 1, /* Notificar: -1. Nunca 1. Sucesso 2. Falha 3. Atraso */
        INPUT 1, /* Tipo de Retorno: 1. Completo 2. Cabeçalho          */
		INPUT 1, /* Prioridade: 1. Alta 3. Normal 5. Baixa             */
		INPUT TABLE ttAttachment,
        OUTPUT mptr_response,
        OUTPUT i_response_code,
        OUTPUT c_response_status
    ).
    
    IF VALID-HANDLE(h_mail) THEN DO: 
        DELETE PROCEDURE h_mail.
    END.

END.