2017-01-01 52 views
0

我想將一個壓縮的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文件和電子郵件的Oracle PLSQL連接,而無需使用的Java(的可能的複製http://stackoverflow.com/問題/ 20791101 /如何使用zip-csv-file-and-attach-in-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

我能夠獲得蓮花筆記作爲一個zip文件的附件。但當打開它使用winrar時,它是shwng錯誤消息..不是一個有效的目錄,文件沒有正確下載。 – Nanu

相關問題