如何在不使用 Java 的情况下压缩 .csv 文件并在电子邮件中附加 Oracle plsql
Posted
技术标签:
【中文标题】如何在不使用 Java 的情况下压缩 .csv 文件并在电子邮件中附加 Oracle plsql【英文标题】:How to zip .csv file and attach in email Oracle plsql without using Java 【发布时间】:2013-12-26 20:53:28 【问题描述】:我使用的是 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;
【问题讨论】:
这可能有助于如何在 PL/SQL 中压缩:community.oracle.com/thread/2192274 你为什么不想使用Java?并且可以使用utl_compress
,还是需要是不支持的格式? (This question 可能相关,但不完全重复)。
【参考方案1】:
在您传输 .csv 文件的消息部分中,您已将 MIME Content-Type 设置为“text/plain”。当您将文件名更改为 Report.zip 时,您需要将 Content-Type 更改为“application/zip”。希望这会为您解决问题。
分享和享受。
【讨论】:
以上是关于如何在不使用 Java 的情况下压缩 .csv 文件并在电子邮件中附加 Oracle plsql的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用外部库(例如 Numpy、Pandas)的情况下读取 CSV 文件?
如何在不创建架构的情况下将 CSV 文件加载到 BigQuery
BigQuery - 如何在不使用列名作为值的情况下导入 CSV?