1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
   | procedure mail_files ( from_name varchar2,
                                         to_name varchar2,
                                         subject varchar2,
                                         message varchar2,
                                         max_size number DEFAULT 9999999999,
                                         filename1 varchar2 DEFAULT NULL,
                                         filename2 varchar2 DEFAULT NULL,
                                         filename3 varchar2 DEFAULT NULL,
                                         debug number DEFAULT 0 ) IS
 
  v_smtp_server      varchar2(100) := 'serveurmail';
  v_smtp_server_port number  := 25;
 
  v_directory_name   varchar2(100);
  v_file_name        varchar2(100);
 
  v_line             varchar2(1000);
 
  crlf               varchar2(2):= chr(13) || chr(10);
 
  mesg               varchar2(32767);
 
  conn               UTL_SMTP.CONNECTION;
 
  type varchar2_table IS TABLE of varchar2(2000) INDEX BY binary_integer;
 
  file_array         varchar2_table;
  i                  binary_integer;
  pos_sep            Number;
  Fichiers_joints    Varchar2(1000);
 
  v_file_handle      utl_file.file_type;
  v_slash_pos        number;
 
  mesg_len           number;
 
  mesg_too_long      exception;
  invalid_path       exception;
 
  mesg_length_exceeded BOOLEAN := false;
 
begin
 
   -- first load the three filenames into an array for easier handling later ...
 
   file_array(1) := filename1;
   file_array(2) := filename2;
   file_array(3) := filename3;
 
   -- Open the SMTP connection ...
   -- ------------------------
 
   conn:= utl_smtp.open_connection( v_smtp_server, v_smtp_server_port );
 
   -- Initial handshaking ...
   -- -------------------
 
   utl_smtp.helo( conn, v_smtp_server );
   utl_smtp.mail( conn, from_name );
   utl_smtp.rcpt( conn, to_name );
 
   utl_smtp.open_data ( conn );
 
   -- build the start of the mail message ...
   -- -----------------------------------
 
   mesg:= 'Date: ' || TO_CHAR( SYSDATE, 'dd Mon yy hh24:mi:ss' ) || crlf ||
          'From: ' || from_name || crlf ||
          'Subject: ' || subject || crlf ||
          'To: ' || to_name || crlf ||
          'Mime-Version: 1.0' || crlf ||
          'Content-Type: multipart/mixed; boundary="DMW.Boundary.605592468"' || crlf ||
          'Content-Transfer-Encoding: 7bit' || crlf ||
		  'X-Confirm-Reading-To:'||from_name||crlf||
		  'Disposition-Notification-To:'||from_name||crlf||
          'This is a Mime message, which your current mail reader may not' || crlf ||
          'understand. Parts of the message will appear as text. If the remainder' || crlf ||
          'appears as random characters in the message body, instead of as' || crlf ||
          'attachments, then you''ll have to extract these parts and decode them' || crlf ||
          'manually.' || crlf ||
          '' || crlf ||
          '--DMW.Boundary.605592468' || crlf ||
		  '' || crlf ||
          message|| crlf ;
 
   mesg_len := length(mesg);
 
   IF mesg_len > max_size then
      mesg_length_exceeded := true;
   end IF;
 
   utl_smtp.write_data ( conn, mesg );
 
   -- Append the files ...
   -- ----------------
   i:=1;
   pos_sep:=1;
   Fichiers_joints:=filename1;
   IF filename1 IS NOT NULL then
   	 While pos_sep>0 Loop
	   Pos_sep:=instr(fichiers_joints,';',1);
	   IF pos_sep>0 Then
	   	  File_array(1):=substr(fichiers_joints,1,pos_sep-1);
	   Else
	      File_array(1):=fichiers_joints;
	   End IF;
       -- Exit if message length already exceeded ...
 
       exit when mesg_length_exceeded;
 
       -- If the filename has been supplied ...
 
       IF file_array(i) IS NOT NULL then
 
          begin
 
             -- locate the final '/' or '\' in the pathname ...
 
             v_slash_pos := instr(file_array(i), '/', -1 );
 
             IF v_slash_pos = 0 then
                v_slash_pos := instr(file_array(i), '\', -1 );
             end if;
 
             -- separate the filename from the directory name ...
 
             v_directory_name := substr(file_array(i), 1, v_slash_pos - 1 );
             v_file_name      := substr(file_array(i), v_slash_pos + 1 );
 
             -- open the file ...
 
             v_file_handle := utl_file.fopen(v_directory_name, v_file_name, 'r' );
 
             -- generate the MIME boundary line ...
 
             mesg := crlf || '--DMW.Boundary.605592468' || crlf ||
             'Content-Type: application/pdf; name="' || v_file_name || '"' || crlf ||
             'Content-Disposition: attachment; filename="' || v_file_name || '"' || crlf ||
             'Content-Transfer-Encoding: 7bit' || crlf || crlf ;
 
             mesg_len := mesg_len + length(mesg);
 
             utl_smtp.write_data ( conn, mesg );
 
             -- and append the file contents to the end of the message ...
 
             loop
 
                 utl_file.get_line(v_file_handle, v_line);
 
                 IF mesg_len + length(v_line) > max_size then
 
                    mesg := '*** truncated ***' || crlf;
 
                    utl_smtp.write_data ( conn, mesg );
 
                    mesg_length_exceeded := true;
 
                    raise mesg_too_long;
 
                 end IF;
 
                 mesg := v_line || crlf;
 
                 utl_smtp.write_data ( conn, mesg );
 
                 mesg_len := mesg_len + length(mesg);
 
             end loop;
 
          exception
 
             when utl_file.invalid_path then
                 IF debug > 0 then
                    dbms_output.put_line('Error in opening attachment '||
                                          file_array(i) );
                 end IF;
 
             -- All other exceptions are ignored ....
 
             when others then
                 NULL;
 
          end;
 
          mesg := crlf;
 
          utl_smtp.write_data ( conn, mesg );
 
          -- close the file ...
 
          utl_file.fclose(v_file_handle);
 
        end IF;
		IF pos_sep>0 Then
		   fichiers_joints:=substr(fichiers_joints,pos_sep+1);
		End IF;
   end loop;
   End IF;
   -- append the final boundary line ...
 
   mesg := crlf || '--DMW.Boundary.605592468--' || crlf;
 
   utl_smtp.write_data ( conn, mesg );
 
   -- and close the SMTP connection  ...
 
   utl_smtp.close_data( conn );
 
   utl_smtp.quit( conn );
 
 
end; | 
Partager