4

BLOBとして保存されたファイルを含むテーブルがあります

これらのファイルを添付ファイルとして電子メールで送信するコードを作成します。

これまでのところすべて正常に動作しますが、ファイル(EXCEL、PDFなど)はプログラムで読み取ることができず、テキストファイルとExcelのみが開きますが、エラーメッセージが表示された後、PDFがまったく開かれません。

これが問題のコードの一部です!

utl_smtp.write_data( l_connection, '--'|| l_boundary || utl_tcp.crlf);
utl_smtp.write_data( l_connection, 'Content-Type: application/octet-stream' || utl_tcp.crlf);
utl_smtp.write_data( l_connection, 'Content-Disposition: attachment; filename="' || V_NAME || '"' || utl_tcp.crlf);
utl_smtp.write_data( l_connection, 'Content-Transfer-Encoding: base64' || utl_tcp.crlf );
utl_smtp.write_data( l_connection, utl_tcp.crlf );   

v_length := dbms_lob.getlength(V_BLOB_CONTENT);     

while v_offset < v_length loop
       dbms_lob.read( V(i).BLOB_CONTENT, v_buffer_size, v_offset, v_raw );
       utl_smtp.write_raw_data( l_connection, utl_encode.base64_encode(v_raw) );
       utl_smtp.write_data( l_connection, utl_tcp.crlf );
       v_offset := v_offset + v_buffer_size;
end loop while_loop;     

utl_smtp.write_data( l_connection, utl_tcp.crlf );

助言がありますか?

4

2 に答える 2

7

これがまさにそれを行うために私が使用する手順です

  PROCEDURE StreamAttachmentToConn( p_conn       IN OUT utl_smtp.connection
                                   ,p_boundary   IN raw
                                   ,p_FileName   IN VARCHAR2
                                   ,p_FileData   IN BLOB) PARALLEL_ENABLE
  AS
      l_len       integer := 0 ;
      l_idx       integer := 1 ;
      l_buff_size integer := 57 ;
      l_raw       raw(57) ;
  BEGIN

              -- Attachment
            utl_smtp.write_data( p_conn, '--' || p_boundary || utl_tcp.crlf );
            utl_smtp.write_data( p_conn, 'Content-Type: application/octet-stream' || utl_tcp.crlf );
            utl_smtp.write_data( p_conn, 'Content-Disposition: attachment; ' || utl_tcp.crlf );
            utl_smtp.write_data( p_conn, ' filename="' || p_FileName || '"' || utl_tcp.crlf );
            utl_smtp.write_data( p_conn, 'Content-Transfer-Encoding: base64' || utl_tcp.crlf );
            utl_smtp.write_data( p_conn, utl_tcp.crlf );
            -- Loop through the blob
            -- chuck it up into 57-byte pieces
            -- and base64 encode it and write it into the mail buffer
            l_len := dbms_lob.getlength(p_FileData);

            -- force reinit on this may change
            l_buff_size := 57 ;
            l_idx := 1;

            while l_idx < l_len loop
              dbms_lob.read( p_FileData , l_buff_size, l_idx, l_raw );

              utl_smtp.write_raw_data( p_conn, utl_encode.base64_encode(l_raw) );

              utl_smtp.write_data( p_conn, utl_tcp.crlf );

              l_idx := l_idx + l_buff_size;
            end loop;
  END StreamAttachmentToConn;

これを使用して、1つのメールに複数の添付ファイルを追加します。私にとってはチャンピオンのように機能します。

1つは、p_boundaryが次のように渡されることです。

l_boundary raw(32):= sys_guid();

あなたはすでにl_boundaryを持っているので、それを使用する必要があります。

これは、 http://christopherbeck.wordpress.com/category/plsql/およびhttp://www.oracle-base.com/articles/misc/EmailFromOraclePLSQL.php#attachmentに基づいています 。

次に、コードで、SMTP接続、l_boundary(つまり、RAW sys_guidまたは使用しているもの、ファイルの名前(電子メールの添付ファイルに表示される)、およびBLOB)を渡すだけです。


*編集->追加情報*


私たちのものは、次の仮定と同じです:

->v_offsetが1-で始まると仮定します->v_buffer_sizeは57と仮定します

しかし、私はそれを機能させるためにあなたが従わなければならない順序があることに気づきました(特に、ボディの後にENDの隣にアタッチメントを置いてください!!!

  1. LOGICを接続する
  2. すべての受信者を追加します
  3. ヘッダーロジック: "FROM"、件名
  4. 本文ロジック(本文など)
  5. 添付ファイル
  6. 次に、添付ファイルの後で電子メールを閉じます(これは特に添付ファイルの後にあるものです:

utl_smtp.write_data( l_conn, utl_tcp.crlf );

-- Close Email
utl_smtp.write_data( l_conn, '--' || l_boundary || '--' || utl_tcp.crlf );
utl_smtp.write_data( l_conn, utl_tcp.crlf || '.' || utl_tcp.crlf );
utl_smtp.close_data( l_conn );
utl_smtp.quit( l_conn );
于 2011-10-13T12:53:29.463 に答える