簡體   English   中英

如何在不使用Java的情況下壓縮.csv文件並在電子郵件中附加Oracle plsql

[英]How to zip .csv file and attach in email Oracle plsql without using Java

我使用的是Oracle 11.1,我有這個plsql塊,可以發送帶有.csv附件的完美電子郵件。

但我想將其壓縮並發送。 當我將文件擴展名更改為.zip時,將電子郵件作為Report.zip很好用,但是我無法打開該zip文件,它顯示已損壞。 如何壓縮?

DECLARE
    p_email   email%ROWTYPE;
    p_subject VARCHAR2(255)  := 'Weekly Report';
    p_message CLOB;
    l_mailhost VARCHAR2(255) := 'localhost';
    l_mail_conn utl_smtp.connection;

    v_add_src  VARCHAR2(4000);
    v_addr     VARCHAR2(4000);
    slen NUMBER := 1;

    crlf VARCHAR2(2)  := chr(13)||chr(10);
    v_date VARCHAR2(15) := TO_CHAR(TRUNC(SYSDATE) -1,'MM_DD_YYYY');

/*Table header in attachment*/
v_col VARCHAR2(32000):= 'START_DATE'||CHR(166)||'END_DATE'||CHR(166)||'NAME'||crlf;

    CURSOR cur_query
    IS
    SELECT  
        START_DATE, END_DATE, NAME FROM TESTING

    BEGIN
    --SELECT TO_CHAR(TRUNC(SYSDATE) -1,'MM_DD_YYYY') INTO v_date FROM dual;
     SELECT * INTO p_email FROM email WHERE module_name = 'REPORT';
          p_message:= 
            '<html>
                 <BODY>
                 <P> <font color="black",font face ="arial",font size ="2.5">
                Hello All, <br/><br/>
                Attached weekly report <br/>
                <br/>Thank You
                 </P>
                </BODY>
            </html>';

            l_mail_conn := utl_smtp.open_connection(l_mailhost, 25);
            utl_smtp.helo(l_mail_conn, l_mailhost);
            utl_smtp.mail(l_mail_conn, p_email.sender);

            IF(INSTR(p_email.recipients,',') = 0) THEN
                utl_smtp.rcpt(l_mail_conn, p_email.recipients);
            ELSE
            v_add_src := p_email.recipients || ',';
                WHILE(INSTR(v_add_src,',',slen) > 0) LOOP
                v_addr := SUBSTR(v_add_src, slen, INSTR(SUBSTR(v_add_src, slen),',')-1);
                slen := slen+INSTR(SUBSTR(v_add_src, slen),',');
                 --Dbms_Output.put_line('rcpt ' || v_addr);
                utl_smtp.rcpt(l_mail_conn, v_addr);
                END LOOP;

            END IF; 

            utl_smtp.open_data(l_mail_conn );
            utl_smtp.write_data(l_mail_conn,
             'MIME-VERSION: 1.0' || crlf ||
             'FROM: '   || p_email.sender || crlf ||
             'Subject: '|| p_subject || crlf ||
             'TO: '     || p_email.recipients || crlf || 
             'CONTENT-TYPE: multipart/mixed;' || crlf ||
             ' boundary="---YOURBOUNDARY"' || crlf ||crlf);
   -- Email body
            utl_smtp.write_data(l_mail_conn, '-----YOURBOUNDARY'||crlf);
            utl_smtp.write_data(l_mail_conn, 'Content-Type: text/html' || crlf);
            utl_smtp.write_data(l_mail_conn, 'Content-Transfer-Encoding: 8bit' || crlf || crlf);
            utl_smtp.write_data(l_mail_conn, p_message||crlf);
    -- begin the attachment

            utl_smtp.write_data(l_mail_conn, '-----YOURBOUNDARY'||crlf);
            utl_smtp.write_data(l_mail_conn, 'Content-Type: text/plain;'||crlf); 
            utl_smtp.write_data(l_mail_conn, 'Content-Transfer-Encoding: 8bit' || crlf);
           --utl_smtp.write_data(l_mail_conn, 'Mime-Type: application/zip' || crlf);
            utl_smtp.write_data(l_mail_conn, 'Content-Disposition: attachment;'|| crlf);
            utl_smtp.write_data(l_mail_conn, ' filename="Report||.csv"'||crlf||crlf);
            utl_smtp.write_data(l_mail_conn,v_col);
          FOR rec IN cur_query
           LOOP
              utl_smtp.write_data(l_mail_conn, rec.start_date||CHR(166)||rec.end_date||CHR(166)||rec.NAME||||crlf);
           END LOOP;

        utl_smtp.close_data(l_mail_conn );
        utl_smtp.quit(l_mail_conn);

       EXCEPTION
        WHEN OTHERS THEN 
        DBMS_OUTPUT.PUT_LINE ('ERROR: '|| SQLCODE ||'Err Msg :'||SQLERRM);

     END;

在要傳輸.csv文件的消息部分,您已將MIME Con​​tent-Type設置為“文本/純文本”。 當您將文件名更改為Report.zip時,您需要將Content-Type更改為“ application / zip”。 希望這會為您解決問題。

分享並享受。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM