Enviando e-mail no Oracle Apex com SendGrid API

SendGrid é uma excelente alternativa para quem quiser usufruir de uma API para envio de e-mails com limite de 100 e-mails/dia grátis!

Cada e-mail possui um limite de tamanho de 20MB (incluindo anexos).

Basta criar uma nova conta e realizar os passos descrito na documentação.

Após criar a conta, configurar em novo usuário autorizado para envio ou domínio autorizado, basta configurar a API Key para a utilização da API.

Nesse exemplo, utilizamos a versão v3 da API.

Começamos criando uma tabela SENDGRID_EMAIL para armazenar o e-mail enviado, bem como o status de envio (sucesso ou falha). Fazendo isso lhe permite que possa tratar um job (ou trigger) que sempre verifique os e-mails com falha e faça um reenvio automático ou te notifique da falha.
CREATE TABLE SENDGRID_EMAIL(	
    ID NUMBER, 
	FROM_EMAIL VARCHAR2(250 BYTE), 
	FROM_NAME VARCHAR2(250 BYTE), 
	TO_EMAIL VARCHAR2(250 BYTE), 
	TO_NAME VARCHAR2(250 BYTE), 
	SUBJECT VARCHAR2(300 BYTE), 
	CONTENT_TYPE VARCHAR2(50 BYTE), 
	CONTENT CLOB, 
	STATUS_CODE VARCHAR2(5 BYTE) , 
	RESPONSE CLOB,
	SENDED_AT TIMESTAMP (6)
);
   
CREATE UNIQUE INDEX SENDGRID_EMAIL_PK ON SENDGRID_EMAIL (ID);
  
ALTER TABLE SENDGRID_EMAIL MODIFY (ID NOT NULL ENABLE);
ALTER TABLE SENDGRID_EMAIL ADD CONSTRAINT SENDGRID_EMAIL_PK PRIMARY KEY (ID);

CREATE SEQUENCE SEQ_SENDGRID_EMAIL MINVALUE 1 MAXVALUE 9999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE  NOORDER  NOCYCLE  NOKEEP  NOSCALE  GLOBAL;

Criamos agora a package PACK_SENDGRID, no qual centralizamos a configuração de autentição e envio. Cole a sua API Key no local indicado da váriavel API_KEY:
create or replace PACKAGE PACK_SENDGRID AS 

    API_KEY CONSTANT VARCHAR2(4000) := 'cole-sua-chave-API-aqui';

    PROCEDURE AUTENTICACAO;
    
    PROCEDURE ENVIAR_EMAIL(
        P_FROM_EMAIL IN VARCHAR2,
        P_FROM_NAME IN VARCHAR2,
        P_TO_EMAIL IN VARCHAR2,
        P_TO_NAME IN VARCHAR2,
        P_SUBJECT IN VARCHAR2,
        P_CONTENT_TYPE IN VARCHAR2,
        P_CONTENT IN CLOB
    );
    
END PACK_SENDGRID;

Criamos o body da package PACK_SENDGRID:
create or replace PACKAGE BODY PACK_SENDGRID AS

  PROCEDURE AUTENTICACAO AS
  BEGIN
      apex_web_service.set_request_headers(
            p_name_01        => 'Content-Type',
            p_value_01       => 'application/json',
            p_name_02        => 'Authorization',
            p_value_02       => 'Bearer '||PACK_SENDGRID.API_KEY );
  END AUTENTICACAO;

  PROCEDURE GRAVA_EMAIL(
    P_FROM_EMAIL IN VARCHAR2,
    P_FROM_NAME IN VARCHAR2,
    P_TO_EMAIL IN VARCHAR2,
    P_TO_NAME IN VARCHAR2,
    P_SUBJECT IN VARCHAR2,
    P_CONTENT_TYPE IN VARCHAR2,
    P_CONTENT IN CLOB,
    P_STATUS_CODE IN VARCHAR,
    P_RESPONSE IN CLOB
  ) 
  IS
   v_id sendgrid_email.id%type;
  
  BEGIN
    v_id := SEQ_SENDGRID_EMAIL.nextval;
  
    INSERT INTO sendgrid_email (
        id,
        from_email,
        from_name,
        to_email,
        to_name,
        subject,
        content_type,
        content,
        status_code,
        sended_at
    ) VALUES (
        v_id,
        P_FROM_EMAIL,
        P_FROM_NAME,
        P_TO_EMAIL,
        P_TO_NAME,
        P_SUBJECT,
        P_CONTENT_TYPE,
        P_CONTENT,
        P_STATUS_CODE,
        CURRENT_TIMESTAMP
    );
    
  EXCEPTION
    WHEN OTHERS THEN
      NULL;
  END;
  
  PROCEDURE ENVIAR_EMAIL(
        P_FROM_EMAIL IN VARCHAR2,
        P_FROM_NAME IN VARCHAR2,
        P_TO_EMAIL IN VARCHAR2,
        P_TO_NAME IN VARCHAR2,
        P_SUBJECT IN VARCHAR2,
        P_CONTENT_TYPE IN VARCHAR2,
        P_CONTENT IN CLOB
  ) IS
    V_RESPONSE CLOB;
  BEGIN
    PACK_SENDGRID.AUTENTICACAO;
    
    apex_json.initialize_clob_output;
    apex_json.open_object;
    apex_json.open_array('personalizations');
    apex_json.open_object;
    apex_json.open_object('from');
    apex_json.write('email', P_FROM_EMAIL);
    apex_json.write('name', P_FROM_NAME);
    apex_json.close_object();
    apex_json.open_array('to');
    apex_json.open_object;
    apex_json.write('email', P_TO_EMAIL);
    apex_json.write('name', P_TO_NAME);
    apex_json.close_object();
    apex_json.close_array(); 
    apex_json.close_object(); 
    apex_json.close_array(); 
    apex_json.open_object('from');  
    apex_json.write('email', P_FROM_EMAIL);
    apex_json.write('name', P_FROM_NAME);  
    apex_json.close_object(); 
    apex_json.write('subject', P_SUBJECT);
    apex_json.open_array('content');
    apex_json.open_object(); 
    apex_json.write('type', P_CONTENT_TYPE);
    apex_json.write('value', P_CONTENT);
    apex_json.close_object(); 
    apex_json.close_all;
    
    V_RESPONSE := APEX_WEB_SERVICE.MAKE_REST_REQUEST(
                              p_url => 'https://api.sendgrid.com/v3/mail/send',
                              p_http_method => 'POST',
                              p_body => apex_json.get_clob_output( p_free => true));
                              
    PACK_SENDGRID.GRAVA_EMAIL(
        P_FROM_EMAIL => P_FROM_EMAIL,
        P_FROM_NAME => P_FROM_NAME,
        P_TO_EMAIL => P_TO_EMAIL,
        P_TO_NAME => P_TO_NAME,
        P_SUBJECT => P_SUBJECT,
        P_CONTENT_TYPE => P_CONTENT_TYPE,
        P_CONTENT => P_CONTENT,
        P_STATUS_CODE => apex_web_service.g_status_code,
        P_RESPONSE => V_RESPONSE
    );
    
    commit;                    
    
  END;    
    

END PACK_SENDGRID;

Recomendo a criação de uma nova package, PACK_EMAIL, no qual será nossa "wrapper package" que utilizaremos em nossa aplicação para envio de e-mail, facilitando futuras manutenções de código. Você pode personalizar da maneira que preferir.
create or replace PACKAGE PACK_EMAIL AS 

    PROCEDURE ENVIAR_EMAIL(
        P_FROM_EMAIL IN VARCHAR2,
        P_FROM_NAME IN VARCHAR2,
        P_TO_EMAIL IN VARCHAR2,
        P_TO_NAME IN VARCHAR2,
        P_SUBJECT IN VARCHAR2,
        P_CONTENT_TYPE IN VARCHAR2,
        P_CONTENT IN CLOB
    );

END PACK_EMAIL;

Body PACK_EMAIL:
create or replace PACKAGE BODY PACK_EMAIL AS

    PROCEDURE ENVIAR_EMAIL(
        P_FROM_EMAIL IN VARCHAR2,
        P_FROM_NAME IN VARCHAR2,
        P_TO_EMAIL IN VARCHAR2,
        P_TO_NAME IN VARCHAR2,
        P_SUBJECT IN VARCHAR2,
        P_CONTENT_TYPE IN VARCHAR2, --text/plain ou text/html
        P_CONTENT IN CLOB
    ) AS
    BEGIN
        pack_sendgrid.enviar_email(p_from_email=>p_from_email,
            p_from_name=>p_from_name,
            p_to_email=>p_to_email,
            p_to_name=>p_to_name,
            p_subject=>p_subject,
            p_content_type=>p_content_type,
            p_content=>p_content
        );
    END ENVIAR_EMAIL;

END PACK_EMAIL;

Para testar, basta chamar o procedimento PACK_EMAIL.ENVIAR_EMAIL:
begin
	pack_email.enviar_email(p_from_email=>'email-de-envio',
		p_from_name=>'Teste',
        p_to_email=>'email-destino',
        p_to_name=>'Você',
        p_subject=>'Teste de Envio da SendGrid API',
        p_content_type=>'text/plain', --text/plain ou text/html
        p_content=> 'E-mail enviado com sucesso! :)'
    );
end;

No próximo exemplo incluirei o envio de anexos.
Por hoje é isso 😉

Comentários

  1. Thank you for sharing useful information with us. please keep sharing like this. And if you are searching a unique and Top University in India, Colleges discovery platform, which connects students or working professionals with Universities/colleges, at the same time offering information about colleges, courses, entrance exam details, admission notifications, scholarships, and all related topics. Please visit below links:

    Manav Rachna International Institute Of Research and Studies in Faridabad

    Manipal University in Jaipur

    NIMS University in Jaipur

    Nirma University in Ahmedabad

    PES University in Bangalore

    ResponderExcluir
  2. Tudo muito prático e claro. Obrigado

    ResponderExcluir

Postar um comentário