Vor einiger Zeit habe ich mal erklärt, wie man eine VCS-Datei erzeugt. Dies möchte ich nun um die Funktion erweitern, diese VCS-Datei direkt aus APEX zu versenden. Ich verwende das in meiner Anwendung, um vom System erzeugte Termin gleich an die entsprechenden Kollegen zu versenden.
declare
l_body_html varchar2(4000);
l_subject varchar2(100);
v_titel varchar2(100);
v_begin date;
v_begin_c varchar2(50);
v_ende date;
v_ende_c varchar2(50);
v_ort varchar2(255);
v_description varchar2(4000);
l_blob clob;
l_id number;
begin
SELECT titel, zeit_begin, zeit_ende, ort, description
INTO v_titel, v_begin, v_ende, v_ort, v_description
FROM my_table;
v_description := replace(v_description,chr(13),'=0D=0A');
v_description := replace(v_description,chr(10));
v_begin_c := to_char(v_begin, 'YYYYMMDD');
v_ende_c := to_char(v_ende, 'YYYYMMDD');
v_begin_c := v_begin_c || 'T' || to_char(v_begin, 'HH24MI') || '00';
v_ende_c := v_ende_c || 'T' || to_char(v_end, 'HH24MI') || '00';
-- jetzt bauen wir das Attachment zusammen
l_blob := 'BEGIN:VCALENDAR' || chr(13) || CHR(10);
l_blob := l_blob || 'PRODID;ENCODING=QUOTED-PRINTABLE:Termin' || chr(13) || CHR(10);
l_blob := l_blob || 'VERSION:1.0' || chr(13) || CHR(10);
l_blob := l_blob || 'BEGIN:VEVENT' || chr(13) || CHR(10);
l_blob := l_blob || 'TZ:-1' || chr(13) || CHR(10);
l_blob := l_blob || 'DTSTART:' || v_begin_c || chr(13) || CHR(10);
l_blob := l_blob || 'DTEND:' || v_ende_c || chr(13) || CHR(10);
l_blob := l_blob || 'LOCATION;ENCODING=QUOTED-PRINTABLE:' || v_ort || chr(13) || CHR(10);
l_blob := l_blob || 'DESCRIPTION;ENCODING=QUOTED-PRINTABLE:' || v_description || chr(13) || CHR(10);
l_blob := l_blob || 'SUMMARY:' || v_titel || chr(13) || CHR(10);
l_blob := l_blob || 'END:VEVENT' || chr(13) || CHR(10);
l_blob := l_blob || 'END:VCALENDER' || chr(13) || CHR(10);
l_subject := 'Ein Termin fuer Sie';
l_body_html := '<html><body>';
l_body_html := l_body_html || '<b>Mailtext</b><br><br>';
l_body_html := l_body_html || '</body></html>';
-- jetzt die Mail absenden
l_id := APEX_MAIL.SEND(p_to => 'mail@andich.de',
p_from => 'mail@vonmir.de',
p_subj => l_subject,
p_body => 'Bitte beachten Sie den Mailanhang',
p_body_html => l_body_html);
APEX_MAIL.ADD_ATTACHMENT(p_mail_id => l_id,
p_attachment => clob2blob(l_blob),
p_filename => 'termin.vcs',
p_mime_type => 'application/hbs-vcs');
end;
Und hier noch die Funktion „clob2blob“, die oben aufgerufen wird:
create or replace
function clob2blob (p_clob in clob )
return blob
is
v_blob blob;
v_offset integer := 1;
v_length integer;
v_amount binary_integer;
v_buffer varchar2(32767);
v_rawbuffer raw(32767);
c_read_chunksize constant binary_integer := 10000;
begin
dbms_lob.createtemporary(v_blob,true);
v_length := dbms_lob.getlength(p_clob);
v_offset := 1;
while (v_offset < v_length) loop
v_amount := c_read_chunksize;
dbms_lob.read( p_clob, v_amount, v_offset, v_buffer );
v_rawbuffer := utl_raw.cast_to_raw( v_buffer );
dbms_lob.write( v_blob, v_amount, v_offset, v_rawbuffer );
v_offset := v_offset + c_read_chunksize;
end loop;
return v_blob;
end;
Ich habe den Code jetzt für das Blog soweit angepasst, dass es verständlich ist. In meinem produktiven Code wird der Mailempfänger dynamisch aus einer Tabelle geholt.
Dankeschoen, das war ein sehr gut verfasster Beitrag. Bin auf diesen Blog hier durch Yahoo gestossen und habe euch auch gleich in meinen Feedreader aufgenommen. Freue mich schon bald wieder hier lesen zu duerfen! Viele gruesse