2017-01-01 24 views
0

1つの圧縮Blobデータをファイル添付ファイル(file.zip)として自分のメールIDに送信します。以下は、私が探しているBLOBデータを圧縮するコードを書いたものです。 このblobデータをoracleから電子メールの添付ファイルとして送信できますか。電子メールで圧縮してoracleプロシージャを使用する

declare 
    var1 blob; 
    var2 blob; 
    cursor datacur is 
    select empdata from emptable; 
begin 
    dbms_lob.createtemporary(var1,true,dbms_lob.call); 
    dbms_lob.open(var1,dbms_lob.lob_readwrite); 
    for curvar in datacur 
     loop   
     dbms_lob.writeappend(var1,utl_raw.length(utl_raw.cast_to_raw(curvar.empdata)),ut l_raw.cast_to_raw(curvar.empdata)); 
     end loop; 
     dbms_lob.createtemporary(var2,true,dbms_lob.call); 
     dbms_lob.open(var2,dbms_lob.lob_readwrite); 
     utl_compress.lz_compress(var1,var2,6); 
     dbms_lob.close(var1); 
     dbms_lob.freetemporary(var1); 
     dbms_lob.freetemporary(var2); 
exception 
    when others then 
     dbms_output.put_line('error '||sqlcode||sqlerrm); 
end; 
+0

の可能性のある重複した[.CSVファイルを圧縮し、Javaを使用せずに、メールのOracle PLSQLに接続する方法](http://stackoverflow.com/質問/ 20791101/how-to-zip-csv-file-and-attach-email-oracle-plsql-without-using-java) – OldProgrammer

答えて

0

(テストされていない)、この方法を試してください。

PRIORITY_HIGH   CONSTANT INTEGER := 1; 
PRIORITY_NORMAL   CONSTANT INTEGER := 3; 
PRIORITY_LOW   CONSTANT INTEGER := 5; 


PROCEDURE SendMail(
    Subject IN VARCHAR2, 
    Message IN CLOB, 
    ToMail IN VARCHAR2, 
    FromMail IN VARCHAR2, FromName IN VARCHAR2, 
    Attachment IN BLOB, FileName IN VARCHAR2, 
    Priority IN INTEGER DEFAULT PRIORITY_NORMAL) IS 

    MIME_BOUNDARY CONSTANT VARCHAR2(50) := '====Multipart.Boundary.689464861147414354===='; 
    MIME_MIXED  CONSTANT VARCHAR2(50) := 'multipart/mixed;'; 
    MIME_TEXT  CONSTANT VARCHAR2(50) := 'text/plain;'; 
    MIME_HTML  CONSTANT VARCHAR2(50) := 'text/html;'; 
    MAIL_HOST  CONSTANT VARCHAR2(50) := 'mailhost'; 

    con UTL_SMTP.connection; 
    ret UTL_SMTP.reply; 
    Charset VARCHAR2(20); 
    Footer VARCHAR2(1000); 

    LobLen PLS_INTEGER; 
    amount BINARY_INTEGER := 4800; 
    buffer VARCHAR2(19600); 
    buffer_raw RAW(4800); 
    offset PLS_INTEGER := 1; 
    isHTML BOOLEAN := REGEXP_LIKE(DBMS_LOB.SUBSTR(Message, 1000, 1), '<(html)|(body)', 'i'); 

BEGIN 

    SELECT UTL_I18N.MAP_CHARSET(VALUE) 
    INTO Charset 
    FROM V$NLS_PARAMETERS 
    WHERE PARAMETER = 'NLS_CHARACTERSET'; 

    -- setup mail header 
    con := UTL_SMTP.OPEN_CONNECTION(MAIL_HOST, 25); 
    ret := UTL_SMTP.helo(con, SYS_CONTEXT('USERENV', 'DB_DOMAIN')); -- assuming your database is in the same domain as your mail server 
    ret := UTL_SMTP.Mail(con, FromMail); 
    ret := UTL_SMTP.rcpt(con, ToMail); 
    -- simply call "UTL_SMTP.rcpt(con, ...);" again in order to add further recipient 
    ret := UTL_SMTP.open_data(con); 

    IF FromName IS NOT NULL THEN 
     UTL_SMTP.write_data(con, 'From: "'||FromName||'" <'||FromMail||'>'||Utl_Tcp.CRLF); 
    ELSE 
     UTL_SMTP.write_data(con, 'From: <'||FromMail||'>'||Utl_Tcp.CRLF); 
    END IF; 
    UTL_SMTP.write_data(con, 'To: <'||ToMail||'>'||Utl_Tcp.CRLF); 
    -- UTL_SMTP.write_data(con, 'Cc: <'||CcMail||'>'||Utl_Tcp.CRLF);  
    UTL_SMTP.write_data(con, 'Subject: '||Subject||Utl_Tcp.CRLF); 
    UTL_SMTP.write_data(con, 'X-Priority: '||Priority||Utl_Tcp.CRLF); 

    IF Attachment IS NOT NULL AND FileName IS NOT NULL THEN 
     UTL_SMTP.write_data(con, 'Mime-Version: 1.0' || Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, 'Content-Type: '||MIME_MIXED||' boundary="'||MIME_BOUNDARY||'"' || Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, 'This is a multipart message in MIME format.' || Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, '--'||MIME_BOUNDARY || Utl_Tcp.CRLF); 
    END IF; 

    Footer := 'Message from '||SYS_CONTEXT('USERENV', 'DB_NAME')||' sent at '||TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss'); 
    IF isHTML THEN 
     UTL_SMTP.write_data(con, 'Content-type: '||MIME_HTML||' charset='||Charset || Utl_Tcp.CRLF); 
     Message := REPLACE(message, '</body>', '<p>'||Footer||'</p></body>'); 
    ELSE 
     UTL_SMTP.write_data(con, 'Content-type: '||MIME_TEXT||' charset='||Charset || Utl_Tcp.CRLF); 
    END IF; 

    -- Mail Body 
    UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 
    LobLen := DBMS_LOB.GETLENGTH(Message); 
    LOOP 
     EXIT WHEN offset > ClobLen; 
     DBMS_LOB.READ(Message, amount, offset, BUFFER); 
     UTL_SMTP.write_raw_data(con, UTL_RAW.cast_to_raw(BUFFER)); 
     offset := offset + amount; 
    END LOOP; 
    UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 
    IF NOT isHTML THEN 
     UTL_SMTP.write_data(con, Utl_Tcp.CRLF || Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, Footer); 
     UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 
    END IF; 

    IF Attachment IS NOT NULL AND FileName IS NOT NULL THEN 
     -- Mail Attachment 
     UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, '--'||MIME_BOUNDARY || Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, 'Content-Type: '||MIME_TEXT||' name="'||Filename||'"'|| Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, 'Content-Transfer-Encoding: base64' || Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, 'Content-Disposition: attachment; filename="'||Filename||'"'|| Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 

     offset := 1; 
     LobLen := DBMS_LOB.GETLENGTH(Attachment); 
     LOOP 
      EXIT WHEN offset > LobLen; 
      DBMS_LOB.READ(Attachment, amount, offset, buffer_raw); 
      UTL_SMTP.write_raw_data(con, utl_encode.base64_encode(buffer_raw)); 
      offset := offset + amount; 
     END LOOP; 
     UTL_SMTP.write_data(con, Utl_Tcp.CRLF); 
     UTL_SMTP.write_data(con, '--'||MIME_BOUNDARY||'--' || Utl_Tcp.CRLF); 
    END IF; 

    -- finish mail 
    ret := UTL_SMTP.close_data(con); 
    ret := UTL_SMTP.quit(con); 

EXCEPTION 
    WHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THEN 
     UTL_SMTP.quit(con); 
     RAISE; 
END SendMail; 
+0

こんにちは、上記の共有のutl smtpパッケージを使用して.txt添付ファイルを送信しています。あなたは、パッケージが.zipファイルの添付ファイルを送信するためにどのような変更を加えるべきかを教えてください。 – Nanu

+0

'var2'を' attachment 'としてこのプロシージャに渡すだけです。 –

+0

私はLotus Notesで添付ファイルをzipファイルとして入手できました。しかし、winrarを使用してそれを開くと、それはshwngエラーメッセージです。有効なディレクトリではなく、ファイルが正しくダウンロードされません。 – Nanu

関連する問題