VCS-Datei per Apex-Mail versenden

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.

Dieser Beitrag wurde unter APEX, Oracle abgelegt und mit , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

1 Response to VCS-Datei per Apex-Mail versenden

  1. Johannes T. sagt:

    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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.