by zbra [PL/SQL] UTL_SMTP WRITE_RAW_DATA [2022.11.24 17:20:07]
커서를 이용하여 추출한 데이터에 HTML을 앞뒤로 붙여 메일로 발송하는 프로시져를 짜고있습니다.
HTML 태그가 일정 길이를 초과하면 PL/SQL: numeric or value error 가 발생됩니다.
내용을 찾아보니 RAW 타입의 최대값(32,767BYTE) 32KB가 넘어가면 발생되는 오류로 확인됩니다.
RAW타입의 최대값 단위로 끊어서 전송을 하거나 혹은 다른방법이 있을까요~?
V_HTML CLOB; C := UTL_SMTP.OPEN_CONNECTION(V_HOST, V_PORT); UTL_SMTP.HELO(C, V_HOST); UTL_SMTP.MAIL(C, V_FROM); UTL_SMTP.RCPT(C, V_EMAIL); UTL_SMTP.OPEN_DATA(C); -- 메일본문 작성 시작 UTL_SMTP.WRITE_DATA(C,'MIME-Version: 1.0' || UTL_TCP.CRLF ); -- MIME 버전 UTL_SMTP.WRITE_DATA(C,'Content-Type: text/html; charset="utf-8"' || UTL_TCP.CRLF); UTL_SMTP.WRITE_RAW_DATA(C, UTL_RAW.CAST_TO_RAW('Date:'|| TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || UTL_TCP.CRLF)); UTL_SMTP.WRITE_RAW_DATA(C, UTL_RAW.CAST_TO_RAW('From: "발신자 <"'||V_FROM||'>' || UTL_TCP.CRLF)); UTL_SMTP.WRITE_RAW_DATA(C, UTL_RAW.CAST_TO_RAW('To: "'||V_CUSTNAME||' <"'||V_EMAIL||'>' || UTL_TCP.CRLF)); UTL_SMTP.WRITE_RAW_DATA(C, UTL_RAW.CAST_TO_RAW('Subject: '||V_MONTH||'월 명세서' || UTL_TCP.CRLF)); UTL_SMTP.WRITE_DATA(C, UTL_TCP.CRLF ); UTL_SMTP.WRITE_RAW_DATA(C, UTL_RAW.CAST_TO_RAW(V_HTML || UTL_TCP.CRLF)); --메일 Contents UTL_SMTP.CLOSE_DATA(C); -- 메일 본문 작성 종료 UTL_SMTP.QUIT(C); -- 메일 세션 종료
PROCEDURE... TYPE TMailBody IS TABLE OF VARCHAR2(32767); VMailBody TMailBody; BEGIN FOR I IN 1..CURSORDATA LOOP VMAILBODY.EXTEND; VMAILBODY(I) := 'html'; END LOOP; ... FOR I IN 1..VMAILBODY.COUNT LOOP UTL_SMTP.WRITE_RAW_DATA(c, UTL_RAW.CAST_TO_RAW(VMAILBODY(I) || UTL_TCP.CRLF)); END LOOP; END;
생각보다 단순하게 조치해서 처리하였습니다