declare
l_recipient varchar2(100); -- fill in whatever you want here
l_sender varchar2(100); -- fill in whatever you want here
l_subject varchar2(100); -- fill in whatever you want here
l_plaintext varchar2(100); -- fill in whatever you want here
l_html varchar2(100);
l_host varchar2(100) := 'mymailhost.com';
as
l_conn utl_smtp.connection;
l_boundary varchar2(50) := '----=*#pqowieuryt019283#*=';
begin
l_html := [your plsql routine to build all the html]
l_conn := utl_smtp.open_connection(l_host, 25); -- typical smtp port
utl_smtp.helo(l_conn, l_host);
utl_smtp.mail(l_conn, l_sender);
utl_smtp.rcpt(l_conn, l_recipient);
utl_smtp.open_data(l_conn);
utl_smtp.write_data(l_conn, 'To: ' || l_recipient || utl_tcp.crlf);
utl_smtp.write_data(l_conn, 'From: ' || l_sender || utl_tcp.crlf);
utl_smtp.write_data(l_conn, 'Subject: ' || l_subject || utl_tcp.crlf);
utl_smtp.write_data(l_conn, 'Reply-To: ' || l_sender || utl_tcp.crlf);
utl_smtp.write_data(l_conn, 'MIME-Version: 1.0' || utl_tcp.crlf);
utl_smtp.write_data(l_conn, 'Content-Type: multipart/alternative; boundary="' || l_boundary || '"' || utl_tcp.crlf || utl_tcp.crlf);
if l_plaintext is not null then
utl_smtp.write_data(l_conn, '--' || l_boundary || utl_tcp.crlf);
utl_smtp.write_data(l_conn, 'content-type: text/plain; charset="iso-8859-1"' || utl_tcp.crlf || utl_tcp.crlf);
utl_smtp.write_data(l_conn, l_plaintext);
utl_smtp.write_data(l_conn, utl_tcp.crlf || utl_tcp.crlf);
end if;
if l_html is not null then
utl_smtp.write_data(l_conn, '--' || l_boundary || utl_tcp.crlf);
utl_smtp.write_data(l_conn, 'content-type: text/html; charset="iso-8859-1"' || utl_tcp.crlf || utl_tcp.crlf);
utl_smtp.write_data(l_conn, l_html);
utl_smtp.write_data(l_conn, utl_tcp.crlf || utl_tcp.crlf);
end if;
utl_smtp.write_data(l_conn, '--' || l_boundary || '--' || utl_tcp.crlf);
utl_smtp.close_data(l_conn);
utl_smtp.quit(l_conn);
end;
/