APEX - 使用.CSV附件发送电子邮件

时间:2012-11-29 18:10:15

标签: oracle-apex

APEX版本:4.1.1

Example:

http://apex.oracle.com/pls/apex/f?p=27554:53

User name: demo
PW: demo

我使用以下博客(http://spendolini.blogspot.com/2006/04/custom-export-to-csv.html)创建.CSV文件,但如何将该.CSV文件添加为在APEX中创建/生成的电子邮件的附件?我希望有1页进程创建.CSV文件,将.CSV文件添加到APEX生成的电子邮件中,并在APEX页面上单击按钮时发送该电子邮件。

我也使用以下Oracle doc作为指导。

点击“应用更新”按钮时的当前页面流程代码: (当代码运行时,会创建.CSV文件并发送电子邮件,但电子邮件不包含.CSV文件作为附件)

declare
  l_body_html varchar2(4000);
  l_subj varchar2(200);
  l_from varchar2(200);
  l_cc_address varchar2(2000);
  l_cc varchar2(500);
  l_id NUMBER;

begin

         l_subj := '***TEST - DQ MANUAL EDIT - Daily Field Report - ***TEST';

l_body_html := '<html>
<head>
<style type="text/css">
body{font-family: Calibri, Arial, Helvetica, sans-serif;
font-size:11pt;
margin:30px;
color:#1F497D;
background-color:#ffffff;}

</style>
</head>
<body>';

       l_body_html := l_body_html || '<body><div><p><span style="font-size:12.0pt;font-family:Calibri,sans-serif;color:#1F497D;font-weight:bold;">Attached is the manual edit report for today.</b>';

    l_body_html := l_body_html;

   l_body_html := l_body_html;

   l_body_html := l_body_html || '<p>' || ' will contact you in the near future to prioritize the request and discuss an estimated completion date. Please note that many requests are received daily and it can take several days to couple of weeks on some requests.  If this request is of a high critical nature, please feel free to contact directly or reply to this email.</p>';

 l_body_html := l_body_html || '</div></body></html>';


begin
-- Set the MIME type
owa_util.mime_header( 'application/octet', FALSE );
-- Set the name of the file
htp.p('Content-Disposition: attachment; filename="Manual_Edit_Selected_Records.csv"');
-- Close the HTTP Header
owa_util.http_header_close;
-- Loop through all rows in EMP
htp.prn('Data Fields,Grouping,Channel,Month,Year,Edits' || chr(13));
for x in (select 
dq_attribute,
dq_grouping, 
case 
when DQ_CHANNEL = 'Retail' then 'Retail/CD'
when DQ_CHANNEL = 'Consumer Direct' then 'Retail/CD'
else DQ_CHANNEL 
end as dq_channel,
to_char(to_date(INSERT_DATE,'yyyy-mm'),'Month') as Month,
to_char(to_date(INSERT_DATE,'yyyy-mm'),'YYYY') as Year,
case when count(reason_for_change)=0 then 'N/A' else to_char(count(reason_for_change)) end  as Edits
from DQ_MANUAL_EDIT
where
decode(NVL(:P50_DQ_ANALYST, 'ALL'), 'ALL','ALL',DQ_ANALYST) = NVL(:P50_DQ_ANALYST, 'ALL')
and decode(NVL(:P50_DQ_FIELD, 'ALL'), 'ALL','ALL',DQ_ATTRIBUTE) = NVL(:P50_DQ_FIELD, 'ALL')
and decode(NVL(:P50_DQ_CHANNEL, 'ALL'), 'ALL','ALL',DQ_CHANNEL) = NVL(:P50_DQ_CHANNEL, 'ALL')
and decode(NVL(:P50_DQ_GROUPING, 'ALL'), 'ALL','ALL',DQ_GROUPING) = NVL(:P50_DQ_GROUPING, 'ALL')
and decode(NVL(:P50_DQ_IMS, 'ALL'), 'ALL','ALL',DQ_IMS_NUM) = NVL(:P50_DQ_IMS, 'ALL')
and NVL(to_char(to_date(:P50_EDIT_DATE_FROM,'MM/DD/YYYY'),'MM/DD/YYYY'), to_date(sysdate,'MM/DD/YYYY')) <= trunc(INSERT_DATE)
and NVL(to_char(to_date(:P50_EDIT_DATE_TO, 'MM/DD/YYYY'),'MM/DD/YYYY'), to_date(sysdate-28,'MM/DD/YYYY')) >= trunc(INSERT_DATE)
Group by 
dq_attribute, 
INSERT_DATE,
dq_grouping, 
dq_channel
order by to_char(to_date(INSERT_DATE,'yyyy-mm'),'YYYY') desc,
to_char(to_date(INSERT_DATE,'yyyy-mm'),'mm'), dq_attribute asc
)
loop
 -- Print out a portion of a row,
 -- separated by commas and ended by a CR
 htp.prn(
'"' ||x.dq_attribute||'","'|| 
x.dq_grouping ||'","'||  
x.dq_channel ||'","'||  
x.Month ||'","'||
x.Year ||'","'||  
x.Edits || '"' || chr(13));
end loop;
-- Send an error code so that the
-- rest of the HTML does not render
htmldb_application.g_unrecoverable_error := true;
end;



  l_id := APEX_MAIL.SEND(
    --P_TO        => :P53_EMAIL_TO,
    P_TO        => 'first_name.last_name@company.com',
    P_FROM      => 'IT.DEPT@company.com',
    P_BODY      => l_body_html,
    P_BODY_HTML => l_body_html,
    P_SUBJ      => l_subj);

      FOR c1 IN (SELECT filename, blob_content, mime_type 
        FROM APEX_APPLICATION_FILES
        WHERE ID IN (123,456)) LOOP

        APEX_MAIL.ADD_ATTACHMENT(
            p_mail_id    => l_id,
            p_attachment => c1.blob_content,
            p_filename   => c1.filename,
            p_mime_type  => c1.mime_type);
        END LOOP;
    COMMIT;


    wwv_flow_mail.push_queue(
   P_SMTP_HOSTNAME => 'mailhost.company.net',
   P_SMTP_PORTNO => '31'
   );
end;

1 个答案:

答案 0 :(得分:0)

在与此主题相关的Oracle论坛上找到了有用的讨论,有助于回答您的问题:https://forums.oracle.com/forums/thread.jspa?threadID=989396

讨论是电子邮件的附件不是与电子邮件本身分开的物理文件,当您首次创建物理文件然后起草电子邮件以发送它时,这可能是您的问题。当我们使用Webmail客户端或电子邮件软件应用程序发送电子邮件时,它不会像我们看到的那样工作。请参阅Bill Verreyne关于utl_mail包如何工作的说明,其中显示了如何通过修改电子邮件的MIME-BODY来添加附件。

简而言之,概念是将您的数据放在电子邮件本身的主体中,但要确定哪些部分应该被适当的mime标题视为“附件”。 UTL_MAIL看起来是管理此问题的最简单方法,但您可以通过一些耐心和反复试验来手工制作一些简单的标题,或者进一步使用APEX_MAIL包进行实验。

我复制了最重要的部分,这是一个带有“附件”的电子邮件正文示例...请注意,电子邮件中根本没有物理文件。它从头到尾读取就像一封电子邮件:

From: noreply@oracle-server.domain
To: scott@tiger.com
Subject: =?ISO-8859-1?Q?Sample=20Mail=20from=20UTL=5FMAIL?=
X-Priority: 3
Content-Type: multipart/mixed; boundary="------------4D8C24=_23F7E4A13B2357B3"
Return-Path: noreply@oracle-server.domain
Date: 19 Nov 2009 07:45:15 +0200
Mime-Version: 1.0

This is a multi-part message in MIME format.
--------------4D8C24=_23F7E4A13B2357B3
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

This is the e-mail message part that the mail reader will display.


--------------4D8C24=_23F7E4A13B2357B3
Content-Type: text/csv; name="sample.csv"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline; filename="sample.csv"

col1,col2,col3
col1,col2,col3
col1,col2,col3
--------------4D8C24=_23F7E4A13B2357B3--