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