通过PL / SQL发送邮件时,邮件正在打印在附件文件中

时间:2014-11-28 06:34:24

标签: oracle email plsql

我的要求是通过邮件将来自oracle表格的数据作为excel表格附件发送给客户。我能够获得附件,但无论我写的是邮件正文,它都会进入excel表。

代码:

CREATE OR REPLACE PROCEDURE trackekr(cursor1 IN OUT SYS_REFCURSOR)
AS
    v_connection  UTL_SMTP.connection;
     v_smtp           VARCHAR2(255):='mail.bbc.com';
    v_clob        CLOB := EMPTY_CLOB();
    v_len         INTEGER;
    v_index       INTEGER;
 c_mime_boundary CONSTANT VARCHAR2(256) := 'the boundary can be almost anything';
 headerLines                 CLOB := EMPTY_CLOB();



BEGIN
    OPEN cursor1 FOR
        SELECT COUNTRY_ID, START_DATE
   FROM Table WHERE OBJECT_NAME = 'XYZ';

   DBMS_LOB.CreateTemporary( v_clob, true );

   headerLines := 'COUNTRY_ID,START_DATE'|| UTL_TCP.crlf; --// create CSV header line
  DBMS_LOB.WriteAppend( v_clob, length(headerLines),  headerLines ); --// write it to CLOB
    --// start loop to add data lines to CSV

 FOR cursor1 in
        ( SELECT COUNTRY_ID, START_DATE
   FROM Table WHERE OBJECT_NAME = 'XYZ')

LOOP
v_clob :=
               v_clob
            || cursor1.COUNTRY_ID
            || ','
            || cursor1.START_DATE
            || UTL_TCP.crlf;
END LOOP;

    -- UTL

    v_connection := UTL_SMTP.open_connection(v_smtp, 25);  

    UTL_SMTP.helo(v_connection, v_smtp);
    UTL_SMTP.mail(v_connection, 'abc.singh@yahoo.in');
    UTL_SMTP.rcpt(v_connection, 'abc.singh@wbc.com'); 
    UTL_SMTP.open_data(v_connection);

    UTL_SMTP.write_data(v_connection, 'From: ' || 'abc.singh@yahoo.in' || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'To: ' || 'abc.singh@wbc.com' || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'Subject: test subject' || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'MIME-Version: 1.0' || UTL_TCP.crlf);


    UTL_SMTP.write_data(
        v_connection,
        'Content-Type: multipart/mixed; boundary="' || c_mime_boundary || '"' || UTL_TCP.crlf
    );
    UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);
    UTL_SMTP.write_data(
        v_connection,
        'This is a multi-part message in MIME format.' || UTL_TCP.crlf
    );

    UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'Content-Type: text/plain' || UTL_TCP.crlf);

    -- Set up attachment header
    UTL_SMTP.write_data(
        v_connection,
        'Content-Disposition: attachment; filename="' || 'FIRSTFILE.csv' || '"' || UTL_TCP.crlf
    );
    UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);

    -- Write attachment contents

    v_len := DBMS_LOB.getlength(v_clob);
    v_index := 1;

    WHILE v_index <= v_len
    LOOP
        UTL_SMTP.write_data(v_connection, DBMS_LOB.SUBSTR(v_clob, 32000, v_index));
        v_index := v_index + 32000;
    END LOOP;

    -- End attachment
    UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || '--' || UTL_TCP.crlf);

if DBMS_LOB.IsOpen( v_clob ) = 1 then
                DBMS_LOB.FreeTemporary( v_clob );
        end if;
    UTL_SMTP.close_data(v_connection);
    UTL_SMTP.quit(v_connection);
END; 

1 个答案:

答案 0 :(得分:1)

在多部分MIME消息中,body本身就是一个“部分”,需要它自己的边界。

在原始代码中,您可以找到以下行:

UTL_SMTP.write_data(
    v_connection,
    'This is a multi-part message in MIME format.' || UTL_TCP.crlf
);

在这些行之后,你添加了这段代码:

-- Body >>>
UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || UTL_TCP.crlf);
UTL_SMTP.write_data(v_connection, 'Content-Type: text/plain' || UTL_TCP.crlf);
UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);
UTL_SMTP.write_data(v_connection, 'Hello, this is the body.'||UTL_TCP.crlf);
UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);
-- <<< Body

请勿从原始代码中删除任何内容。

这样,正文就在它自己的边界部分内,就像csv文件一样,但没有Content-Disposition: attachment标题。