使用oracle过程压缩电子邮件

使用oracle过程压缩电子邮件,oracle,plsql,Oracle,Plsql,我想将一个压缩的blob数据作为文件附件(file.zip)发送到我的邮件id。下面我已经编写了压缩我正在寻找的blob数据的代码。 此blob数据能否作为电子邮件附件从oracle发送 declare var1 blob; var2 blob; cursor datacur is select empdata from emptable; begin dbms_lob.createtemporary(var1,true,dbms_lob.call); db

我想将一个压缩的blob数据作为文件附件(file.zip)发送到我的邮件id。下面我已经编写了压缩我正在寻找的blob数据的代码。 此blob数据能否作为电子邮件附件从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;
试试这个(未测试):

优先级\u高常量整数:=1;
优先级\正常常量整数:=3;
优先级\低常量整数:=5;
发送邮件的过程(
VARCHAR2中的主题,
CLOB中的消息,
瓦查尔的托梅尔2号,
VARCHAR2中的FromMail,VARCHAR2中的FromName,
BLOB中的附件,VARCHAR2中的文件名,
整数中的优先级默认优先级(正常)为
MIME_边界常数VARCHAR2(50):='===多部分边界.689464861147414354===';
MIME_混合常数VARCHAR2(50):='multipart/MIXED;';
MIME_文本常量VARCHAR2(50):='TEXT/plain;';
MIME_HTML常量VARCHAR2(50):=“text/HTML;”;
MAIL_HOST常量VARCHAR2(50):='mailhost';
CONUTL_SMTP.connection;
ret UTL_SMTP.reply;
Charset-VARCHAR2(20);
页脚VARCHAR2(1000);
LobLen PLS_整数;
金额二进制_整数:=4800;
缓冲区VARCHAR2(19600);
缓冲区(4800);
偏移量PLS_整数:=1;

isHTML BOOLEAN:=REGEXP_LIKE(DBMS_LOB.SUBSTR)(消息,1000,1),'可能与Hi重复,我使用上面共享的utl smtp包发送.txt附件。可以吗。请让我知道我们应该对包进行哪些更改以发送.zip文件附件。只需将
var2
作为
attachment
传递到此过程。我可以在lotus notes中以zip文件的形式获取附件。但是当使用winrar打开它,这是一条shwng错误消息。不是有效的目录,文件下载不正确。创建一个带有
BLOB
列的表,并将此类文档插入其中。您是否可以在以后使用IDE选择并打开该文件(如TOAD或SQL Developer)?
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;