Send email with bcc from Oracle SP  [ 1505 views ]

There is a general problem to send an invisible copy of email from oracle stored procedure.
Let’s start with a simple mailer propcedure and add a new recipient (second one) to the connection – that will be BCC!
This second one recipient is missing from the header “To:” section and will be invisible.

  ...
  c := UTL_SMTP.OPEN_CONNECTION(p_mailserv); -- 1. open a server connection
  UTL_SMTP.HELO(c, p_mailserv);              -- 2. say hello
  UTL_SMTP.MAIL(c, p_mailsender);            -- 3. say want to send email
  UTL_SMTP.RCPT(c, p_recipient_email);       -- 4. put the recipient (visible one)
                                             --    I will put into the header 
                                             --    "To" section as well
                                             --    that's why will be visible
  IF p_bcc <> ' ' THEN
    UTL_SMTP.RCPT(c, p_bcc);                 -- 5. put a new recipient (bcc)
  END IF;
  ...
  UTL_SMTP.OPEN_DATA(c);

and here is a working sample from and oracle8i webdb environment:

PROCEDURE Html_Email(
  p_from_email IN VARCHAR2,
  p_from_alias IN VARCHAR2,
  p_recipient_email IN VARCHAR2,
  p_recipient_alias IN VARCHAR2,
  p_subj IN VARCHAR2 DEFAULT ' ',
  p_body IN VARCHAR2 DEFAULT ' ',
  p_bcc in varchar2 default ' '
) IS

/*
 this procedure is to send html based email
*/

p_mailserv VARCHAR2(100) := '** the mailer server **'; -- mail server
p_mailsender VARCHAR2(100) := '** sender account **';  -- account to send email
c UTL_SMTP.CONNECTION; 

PROCEDURE send_header(NAME IN VARCHAR2, HEADER IN VARCHAR2) AS
BEGIN
  UTL_SMTP.WRITE_DATA(c, NAME || ': ' || HEADER || UTL_TCP.CRLF);
END; 

PROCEDURE send_data(l_body_html VARCHAR2) AS
l_offset NUMBER;
l_ammount NUMBER;
BEGIN
  l_offset  := 1;
  l_ammount := 1900;
  WHILE l_offset < LENGTH(l_body_html) LOOP
    UTL_SMTP.WRITE_DATA(c,SUBSTR(l_body_html, l_offset, l_ammount));
    l_offset := l_offset + l_ammount ;
    l_ammount := LEAST(1900, LENGTH(l_body_html) - l_ammount);
  END LOOP;
END; 

BEGIN
    
  -- open connection and prepare the sending
  c := UTL_SMTP.OPEN_CONNECTION(p_mailserv);
  UTL_SMTP.HELO(c, p_mailserv);
  UTL_SMTP.MAIL(c, p_mailsender);
  UTL_SMTP.RCPT(c, p_recipient_email);

  -- put the bcc if we need
  IF p_bcc <> ' ' THEN
    UTL_SMTP.RCPT(c, p_bcc);
  END IF;
    
  -- header
  UTL_SMTP.OPEN_DATA(c);
  send_header('From', '"' || p_from_alias || '" <' || p_from_email || '>');
  send_header('To', '"' || p_recipient_alias || '" <' || p_recipient_email || '>'); 
  send_header('Subject', p_subj); 
  send_header('Content-Type', 'text/html;charset=windows-1251');
    
  -- body
  send_data(p_body);

  -- close the connection
  UTL_SMTP.CLOSE_DATA(c);
  UTL_SMTP.QUIT(c);

  -- error catching
  EXCEPTION
    WHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THEN
      BEGIN
        UTL_SMTP.QUIT(c);
      EXCEPTION
        WHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THEN
          NULL;
      END;
      htp.p('Failed to send mail due to the following error: ' || SQLERRM); 

END;
#sidebar a { color:#fff; } #sidebar ul ul li { color: #DEF585; } #sidebar h2 { color: #fff; } #sidebar ul p, #sidebar ul select { color: #BEDDBE; } #backfly { background: url(images/golfBallWallPaper.jpg) left bottom fixed repeat-x #65a51d; }