Enviando e-mail com PL/SQL para múltiplos endereços
A situação mais comum é o envio de e-mail para diversos destinatários, portanto, complementando o código já postado aqui sobre o envio de e-mails utilizando PLSQL.
Uma lista de destinatários formatada normalmente assim:
Luciano <luciano@lucianosilva.com>, Grupos <grupos@lucianosilva.com>, Futebol <futebol@cfb.com.br>
Este é o nosso problema, o Oracle não irá conseguir trabalhar com a String formatada dessa maneira, e irá lançar o erro:
ORA-29279: SMTP permanent error: 501 Bad address syntax
Enfim, para conseguir solucionar o problema do envio de e-mail para multiplos destinatários, utilize a função abaixo, ela irá devolver apenas o endereço de e-mail.
FUNCTION FORMAT_ADDRESS(ADDR_LIST IN OUT VARCHAR2) RETURN VARCHAR2 IS --- ADDR VARCHAR2(256); I PLS_INTEGER; --- FUNCTION LOOKUP_UNQUOTED_CHAR(STR IN VARCHAR2, CHRS IN VARCHAR2) RETURN PLS_INTEGER AS C VARCHAR2(5); I PLS_INTEGER; LEN PLS_INTEGER; INSIDE_QUOTE BOOLEAN; --- BEGIN INSIDE_QUOTE := FALSE; I := 1; LEN := LENGTH(STR); WHILE (I <= LEN) LOOP C := SUBSTR(STR, I, 1); IF (INSIDE_QUOTE) THEN IF (C = '"') THEN INSIDE_QUOTE := FALSE; ELSIF (C = '\') THEN I := I + 1; -- Skip the quote character END IF; GOTO NEXT_CHAR; END IF; IF (C = '"') THEN INSIDE_QUOTE := TRUE; GOTO NEXT_CHAR; END IF; IF (INSTR(CHRS, C) >= 1) THEN RETURN I; END IF; <<NEXT_CHAR>> I := I + 1; END LOOP; RETURN 0; END; BEGIN ADDR_LIST := LTRIM(ADDR_LIST); I := LOOKUP_UNQUOTED_CHAR(ADDR_LIST, ',;'); IF (I >= 1) THEN ADDR := SUBSTR(ADDR_LIST, 1, I - 1); ADDR_LIST := SUBSTR(ADDR_LIST, I + 1); ELSE ADDR := ADDR_LIST; ADDR_LIST := ''; END IF; I := LOOKUP_UNQUOTED_CHAR(ADDR, '<'); IF (I >= 1) THEN ADDR := SUBSTR(ADDR, I + 1); I := INSTR(ADDR, '>'); IF (I >= 1) THEN ADDR := SUBSTR(ADDR, 1, I - 1); END IF; END IF; RETURN ADDR; END FORMAT_ADDRESS;
A mudança do código anterior não é tão drástica, já que o parâmetro é entrada/saída, você pode fazer um looping na lista de endereços para adicionar um-a-um.
UTL_SMTP.MAIL(MAIL_CONN, V_FROM ); WHILE( V_LIST_ADDRESS IS NOT NULL )LOOP UTL_SMTP.RCPT(MAIL_CONN, FORMAT_ADDRESS(V_LIST_ADDRESS) ); END LOOP;
Veja que é uma modificação simples, porém, ganha-se muito quando é necessário deixar o programa o mais abrangente possível
Enjoy!








