Stored procedures 使用Oracle存储过程发送电子邮件并通过应用服务器获取附件

Stored procedures 使用Oracle存储过程发送电子邮件并通过应用服务器获取附件,stored-procedures,sendmail,Stored Procedures,Sendmail,我需要通过使用存储过程发送带有PDF文件附件的电子邮件。 但PDF文件位于应用程序服务器上,而不是数据库服务器上。 我已经编写了一个存储过程,可以完全发送带有附件的电子邮件,但PDF文件位于数据库服务器上 create or replace PROCEDURE TestEmail AS p_recipient VARCHAR2(500) := '<rubbycg@gmail.com>'; p_subject VARCHAR2(500) := 'Test attachement';

我需要通过使用存储过程发送带有PDF文件附件的电子邮件。 但PDF文件位于应用程序服务器上,而不是数据库服务器上。 我已经编写了一个存储过程,可以完全发送带有附件的电子邮件,但PDF文件位于数据库服务器上

create or replace PROCEDURE TestEmail AS

p_recipient VARCHAR2(500) := '<rubbycg@gmail.com>';
p_subject VARCHAR2(500) := 'Test attachement';
p_message VARCHAR2(500) := 'This is email body';
p_filename VARCHAR2(500) := '123.pdf';
--
-- Make sure directory object is valid and your PDF file is in it.
--
p_directory VARCHAR2(100) := 'TESTPDF';

v_msg VARCHAR2(32000);
src_file bfile;
i integer := 1;
v_raw raw(57);
v_length integer := 0;
v_buffer_size integer := 57;
v_mailconn utl_smtp.connection;
gc_crlf VARCHAR2(4) := chr(13) || chr(10);
gc_lf VARCHAR2(4) := chr(10);
gc_mailhost varchar2(30) := '10.200.1.1' ;
BOUNDARY CONSTANT VARCHAR2(256) := '7D81B75CCC90D2974F7A1CBD';
FIRST_BOUNDARY CONSTANT VARCHAR2(256) := '--' || BOUNDARY || utl_tcp.CRLF;
LAST_BOUNDARY CONSTANT VARCHAR2(256) := '--' || BOUNDARY || '--' ||
utl_tcp.CRLF;
MULTIPART_MIME_TYPE CONSTANT VARCHAR2(256) := 'multipart/mixed; boundary="'||BOUNDARY ||'"';

BEGIN

v_mailconn := utl_smtp.open_connection(gc_mailhost,25);
utl_smtp.helo(v_mailconn,gc_mailhost);
utl_smtp.mail(v_mailconn,'apps_notification@toray.com.my');
utl_smtp.rcpt(v_mailconn,p_recipient);
utl_smtp.open_data (v_mailconn);
utl_smtp.write_data (v_mailconn, 'From: ' || p_recipient || utl_tcp.crlf );
utl_smtp.write_data (v_mailconn, 'To: ' || p_recipient || utl_tcp.crlf );
utl_smtp.write_data (v_mailconn, 'Subject: ' || p_subject || utl_tcp.crlf );


utl_smtp.write_data (v_mailconn, 'MIME-Version: 1.0' || utl_tcp.CRLF);
utl_smtp.write_data (v_mailconn, 'Content-Type: multipart/mixed; boundary="'|| BOUNDARY || '"' || utl_tcp.CRLF);
utl_smtp.write_data (v_mailconn, utl_tcp.crlf );

utl_smtp.write_data (v_mailconn, FIRST_BOUNDARY);
utl_smtp.write_data (v_mailconn, 'Content-Type: text/plain;'|| utl_tcp.CRLF);
utl_smtp.write_data (v_mailconn, ' charset=US-ASCII'|| utl_tcp.CRLF);
utl_smtp.write_data (v_mailconn, utl_tcp.crlf );   
utl_smtp.write_data (v_mailconn, 'This is email body' || utl_tcp.CRLF);   


utl_smtp.write_data (v_mailconn, FIRST_BOUNDARY);
utl_smtp.write_data (v_mailconn, 'Content-Type' || ': ' || 'application/pdf' || utl_tcp.crlf);
utl_smtp.write_data (v_mailconn, 'Content-Disposition: attachment; ' || utl_tcp.crlf);
utl_smtp.write_data (v_mailconn, ' filename="' || p_filename || '"' || utl_tcp.crlf);


utl_smtp.write_data (v_mailconn, 'Content-Transfer-Encoding: base64' || utl_tcp.crlf );
utl_smtp.write_data (v_mailconn, utl_tcp.crlf );

src_file := bfilename(p_directory, p_filename);
dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
v_length := dbms_lob.getlength(src_file);



while i < v_length loop

   dbms_lob.read( src_file, v_buffer_size, i, v_raw );
   utl_smtp.write_raw_data( v_mailconn, utl_encode.base64_encode(v_raw) );
   i := i + v_buffer_size;

end loop;

utl_smtp.write_data( v_mailconn, utl_tcp.crlf );
utl_smtp.write_data (v_mailconn, LAST_BOUNDARY);
utl_smtp.write_data (v_mailconn, utl_tcp.crlf );
dbms_lob.fileclose(src_file);
utl_smtp.close_data (v_mailconn);
utl_smtp.quit(v_mailconn);

EXCEPTION

   WHEN OTHERS THEN
      utl_smtp.quit(v_mailconn);
  RAISE;

END;
现在我想知道如何从应用服务器获取PDF文件。 有什么建议吗

下面是我用来发送电子邮件和获取数据库服务器上的PDF文件的存储过程

create or replace PROCEDURE TestEmail AS

p_recipient VARCHAR2(500) := '<rubbycg@gmail.com>';
p_subject VARCHAR2(500) := 'Test attachement';
p_message VARCHAR2(500) := 'This is email body';
p_filename VARCHAR2(500) := '123.pdf';
--
-- Make sure directory object is valid and your PDF file is in it.
--
p_directory VARCHAR2(100) := 'TESTPDF';

v_msg VARCHAR2(32000);
src_file bfile;
i integer := 1;
v_raw raw(57);
v_length integer := 0;
v_buffer_size integer := 57;
v_mailconn utl_smtp.connection;
gc_crlf VARCHAR2(4) := chr(13) || chr(10);
gc_lf VARCHAR2(4) := chr(10);
gc_mailhost varchar2(30) := '10.200.1.1' ;
BOUNDARY CONSTANT VARCHAR2(256) := '7D81B75CCC90D2974F7A1CBD';
FIRST_BOUNDARY CONSTANT VARCHAR2(256) := '--' || BOUNDARY || utl_tcp.CRLF;
LAST_BOUNDARY CONSTANT VARCHAR2(256) := '--' || BOUNDARY || '--' ||
utl_tcp.CRLF;
MULTIPART_MIME_TYPE CONSTANT VARCHAR2(256) := 'multipart/mixed; boundary="'||BOUNDARY ||'"';

BEGIN

v_mailconn := utl_smtp.open_connection(gc_mailhost,25);
utl_smtp.helo(v_mailconn,gc_mailhost);
utl_smtp.mail(v_mailconn,'apps_notification@toray.com.my');
utl_smtp.rcpt(v_mailconn,p_recipient);
utl_smtp.open_data (v_mailconn);
utl_smtp.write_data (v_mailconn, 'From: ' || p_recipient || utl_tcp.crlf );
utl_smtp.write_data (v_mailconn, 'To: ' || p_recipient || utl_tcp.crlf );
utl_smtp.write_data (v_mailconn, 'Subject: ' || p_subject || utl_tcp.crlf );


utl_smtp.write_data (v_mailconn, 'MIME-Version: 1.0' || utl_tcp.CRLF);
utl_smtp.write_data (v_mailconn, 'Content-Type: multipart/mixed; boundary="'|| BOUNDARY || '"' || utl_tcp.CRLF);
utl_smtp.write_data (v_mailconn, utl_tcp.crlf );

utl_smtp.write_data (v_mailconn, FIRST_BOUNDARY);
utl_smtp.write_data (v_mailconn, 'Content-Type: text/plain;'|| utl_tcp.CRLF);
utl_smtp.write_data (v_mailconn, ' charset=US-ASCII'|| utl_tcp.CRLF);
utl_smtp.write_data (v_mailconn, utl_tcp.crlf );   
utl_smtp.write_data (v_mailconn, 'This is email body' || utl_tcp.CRLF);   


utl_smtp.write_data (v_mailconn, FIRST_BOUNDARY);
utl_smtp.write_data (v_mailconn, 'Content-Type' || ': ' || 'application/pdf' || utl_tcp.crlf);
utl_smtp.write_data (v_mailconn, 'Content-Disposition: attachment; ' || utl_tcp.crlf);
utl_smtp.write_data (v_mailconn, ' filename="' || p_filename || '"' || utl_tcp.crlf);


utl_smtp.write_data (v_mailconn, 'Content-Transfer-Encoding: base64' || utl_tcp.crlf );
utl_smtp.write_data (v_mailconn, utl_tcp.crlf );

src_file := bfilename(p_directory, p_filename);
dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
v_length := dbms_lob.getlength(src_file);



while i < v_length loop

   dbms_lob.read( src_file, v_buffer_size, i, v_raw );
   utl_smtp.write_raw_data( v_mailconn, utl_encode.base64_encode(v_raw) );
   i := i + v_buffer_size;

end loop;

utl_smtp.write_data( v_mailconn, utl_tcp.crlf );
utl_smtp.write_data (v_mailconn, LAST_BOUNDARY);
utl_smtp.write_data (v_mailconn, utl_tcp.crlf );
dbms_lob.fileclose(src_file);
utl_smtp.close_data (v_mailconn);
utl_smtp.quit(v_mailconn);

EXCEPTION

   WHEN OTHERS THEN
      utl_smtp.quit(v_mailconn);
  RAISE;

END;
创建或替换过程TestEmail AS
p_收件人VARCHAR2(500):='';
p_受试者VARCHAR2(500):=“测试附件”;
p_message VARCHAR2(500):=“这是电子邮件正文”;
文件名VARCHAR2(500):=“123.pdf”;
--
--确保目录对象有效且PDF文件在其中。
--
p_目录VARCHAR2(100):=“TESTPDF”;
v_msg VARCHAR2(32000);
src_文件b文件;
i整数:=1;
v_生(57);
v_长度整数:=0;
v_缓冲区大小整数:=57;
v_mailconn utl_smtp.connection;
gc|crlf VARCHAR2(4):=chr(13)| chr(10);
gc_lf VARCHAR2(4):=chr(10);
gc_mailhost varchar2(30):=“10.200.1.1”;
边界常数VARCHAR2(256):=“7D81B75CCC90D2974F7A1CBD”;
第一个_边界常数VARCHAR2(256):='--'| |边界| | utl_tcp.CRLF;
最后一个边界常数VARCHAR2(256):='--'||边界| |'--'||
utl_tcp.CRLF;
多部分MIME类型常量VARCHAR2(256):='多部分/混合;boundary=“'| | boundary |'”;
开始
v_mailconn:=utl_smtp.open_连接(gc_mailhost,25);
utl_smtp.helo(v_mailconn,gc_mailhost);
utl_smtp.mail(v_mailconn,'apps_notification@toray.com.my');
utl_smtp.rcpt(v_mailconn,p_收件人);
utl_smtp.open_数据(v_mailconn);
utl_smtp.write_数据(v_mailconn,'From:'| | p| u recipient | | utl_tcp.crlf);
utl_smtp.write_数据(v_mailconn,'To:'| | p| u收件人| | utl_tcp.crlf);
utl_smtp.write_数据(v_mailconn,'Subject:'| | p| u Subject | | utl_tcp.crlf);
utl_smtp.write_数据(v_mailconn,“MIME版本:1.0”| | utl_tcp.CRLF);
utl|U smtp.write|U数据(v|u mailconn,“内容类型:多部分/混合;边界=“”|边界| | |“””| utl|U tcp.CRLF);
utl_smtp.write_数据(v_mailconn,utl_tcp.crlf);
utl_smtp.write_数据(v_mailconn,第一个_边界);
utl_smtp.write_数据(v_mailconn,'内容类型:text/plain;'| utl_tcp.CRLF);
utl_smtp.write_数据(v_mailconn,'charset=US-ASCII'| | utl_tcp.CRLF);
utl_smtp.write_数据(v_mailconn,utl_tcp.crlf);
utl_smtp.write_数据(v_mailconn,“这是电子邮件正文”| | utl_tcp.CRLF);
utl_smtp.write_数据(v_mailconn,第一个_边界);
utl|u smtp.write|u数据(v_mailconn,'内容类型'| |':'| |'应用程序/pdf'| | utl|u tcp.crlf);
utl_smtp.write_数据(v_mailconn,'Content Disposition:attachment;'| | utl_tcp.crlf);
utl|u smtp.write_数据(v|u mailconn,'filename=“'| p|u filename | |'”'| utl|u tcp.crlf);
utl_smtp.write_数据(v_mailconn,“内容传输编码:base64”| utl_tcp.crlf);
utl_smtp.write_数据(v_mailconn,utl_tcp.crlf);
src_file:=bfilename(p_目录,p_文件名);
dbms_lob.fileopen(src_文件,dbms_lob.file_只读);
v_length:=dbms_lob.getlength(src_文件);
而i