Aus Abfrage eine Email mit Excel Anhang

chla1234

Benutzer
Beiträge
11
Hallo zusammen,

ich bin neu hier und habe mich angemeldet, weil ich an einem Oracle Datenbankproblem nicht mehr weiterkomme:

Ich habe eine Tabelle a. Und hierfür eine Abfrage:

SELECT * FROM a WHERE a.spalte = 'Y'

Ziel ist es nun, das Ergebnis dieser Abfrage als Excel Datei per Email an eine Person zu verschicken.
Ich bin neu in der Datenbankprogrammierung und habe deswegen mein Problem allgemein formuliert - möchte ja was lernen und nicht nur Copy & Paste ;-)

Doie englischsprachigen Dokumentationen, Blogs und Foren sind alle sehr ähnlich und helfen mir leider nicht weiter. Was ich schon mitbekommen habe ist, dass es von Oracle ein UTL_SMTP Packgage geben muss, das Emailversand mit Anhang erlaubt. Doch hier verstehe ich nur Bahnhof.

Kann mir bitte jemand eine geeignete Vorgehensweiße für mein Problem nennen und die einzelnen Schritte erklären, die ich machen sollte? Oder vielleicht sogar ein geeignetes Beispiel mit Erklärungen geben?

Besten Dank!

Viele Grüße,
chla 1234
 
Werbung:
Dabei könnte dir MIME (Multipurpose Internet Mail Extensions) helfen.
Funktioniert auch mit dem utl_smtp Package.

Hier mal eine Prozedur die ich dafür aufgesetzt habe :)
(Kann sämtliche Plaintext-Datentypen.... Als csv, txt, ini, xml, etc.)
Code:
Procedure send_mail
   (
      recipient Varchar2,
      subject   Varchar2,
      message   Varchar2,
      filename  Varchar2 Default Null,
      filetype  Varchar2 Default Null,
      data      Clob Default Null
   ) Is
      v_con         utl_smtp.connection;
      v_index       Number;
      v_clob_length Number;
 
      c_host          Constant Varchar2(15) := '10.1.10.45';
      c_domain        Constant Varchar2(15) := '10.1.10.45';
      c_sender        Constant Varchar2(100) := 'xxx@email.com';
      c_mime_boundary Constant Varchar2(20) := 'CONTENT-BLOCK';
      c_ending        Constant Varchar2(20) := 'MfG' || utl_tcp.crlf || 'ihre IT';
   Begin
      /* Instanzieren und Initialisieren der Verbindung + E-Mail */
      v_con := utl_smtp.open_connection(c_host);
      utl_smtp.helo(v_con, c_domain);
      utl_smtp.mail(v_con, c_sender);
      utl_smtp.rcpt(v_con, recipient);
      utl_smtp.open_data(v_con);
 
      /* Initialisieren des E-Mail Body */
      utl_smtp.write_data(v_con, 'From: ' || c_sender || utl_tcp.crlf);
      utl_smtp.write_data(v_con, 'To: ' || recipient || utl_tcp.crlf);
      utl_smtp.write_data(v_con, 'Subject: ' || subject || utl_tcp.crlf);
      utl_smtp.write_data(v_con, 'MIME-Version: 1.0' || utl_tcp.crlf);
      utl_smtp.write_data(v_con, 'Content-Type: multipart/mixed; boundary="' || c_mime_boundary || '"');
 
      utl_smtp.write_data(v_con, utl_tcp.crlf);
 
      /* Übertragen des E-Mail Body */
      -- Neuer Block: message
      utl_smtp.write_data(v_con, '--' || c_mime_boundary || utl_tcp.crlf);
      utl_smtp.write_data(v_con, 'Content-Type: text/plain' || utl_tcp.crlf);
 
      utl_smtp.write_data(v_con, message || utl_tcp.crlf);
 
      utl_smtp.write_data(v_con, utl_tcp.crlf);
      utl_smtp.write_data(v_con, utl_tcp.crlf);
 
      -- Neuer Block: attachment
      If filename Is Not Null And
         filetype Is Not Null And
         data Is Not Null
      Then
         utl_smtp.write_data(v_con, '--' || c_mime_boundary || utl_tcp.crlf);
         utl_smtp.write_data(v_con, 'Content-Type: text/plain' || utl_tcp.crlf);
         utl_smtp.write_data(v_con, 'Content-Disposition: attachment; filename="' || filename || '.' || filetype || '"' || utl_tcp.crlf);
    
         v_clob_length := dbms_lob.getlength(data);
         v_index       := 1;
    
         While v_index <= v_clob_length
         Loop
            utl_smtp.write_data(v_con, dbms_lob.substr(data, 32000, v_index));
            v_index := v_index + 32000;
         End Loop;
      End If;
 
      -- Neuer Block: ending (Grußformel)
      utl_smtp.write_data(v_con, '--' || c_mime_boundary || utl_tcp.crlf);
      utl_smtp.write_data(v_con, 'Content-Type: text/plain' || utl_tcp.crlf);
 
      utl_smtp.write_data(v_con, utl_tcp.crlf);
      utl_smtp.write_data(v_con, utl_tcp.crlf);
      utl_smtp.write_data(v_con, utl_tcp.crlf);
      utl_smtp.write_data(v_con, utl_tcp.crlf);
 
      utl_smtp.write_data(v_con, c_ending);
 
      /* Ende der Übertragung */
      utl_smtp.write_data(v_con, '--' || c_mime_boundary || '--');
 
      /* Ende der E-Mail + Verbindung */
      utl_smtp.close_data(v_con);
      utl_smtp.quit(v_con);
   End;
 
Zuletzt bearbeitet von einem Moderator:
Hallo Distrilec,

danke für deine Antwort. Leider verstehe ich deinen geposteten Code nicht vollständig. Wo kann ich in dem für das Attachment relevanten Code - Abschnitt

Code:
-- Neuer Block: attachment
      If filename Is Not Null And
         filetype Is Not Null And
         data Is Not Null
      Then
         utl_smtp.write_data(v_con, '--' || c_mime_boundary || utl_tcp.crlf);
         utl_smtp.write_data(v_con, 'Content-Type: text/plain' || utl_tcp.crlf);
         utl_smtp.write_data(v_con, 'Content-Disposition: attachment; filename="' || filename || '.' || filetype || '"' || utl_tcp.crlf);
    
         v_clob_length := dbms_lob.getlength(data);
         v_index       := 1;
    
         While v_index <= v_clob_length
         Loop
            utl_smtp.write_data(v_con, dbms_lob.substr(data, 32000, v_index));
            v_index := v_index + 32000;
         End Loop;
      End If;

sagen, dass er das Ergebnis einer Abfrage als .csv beifügen soll?
 
Das sagst du hier:
Code:
utl_smtp.write_data(v_con, 'Content-Disposition: attachment; filename="' || filename || '.' || filetype || '"' || utl_tcp.crlf);
Du sagst Die Content-Disposition ist attachment (Ein Anhang), der Dateiname is gleich der Variable "filename" plus ein Punkt plus die Variable "filetype".
"filetype" ist in diesem Fall dann der Dateityp.

Wie gesagt das funktioniert (mit meiner Prozedur) nur mit plaintext Datentypen wie z.B. csv (diese können dann mit Excel geöffnet werden).
 
Okay, das habe ich verstanden!
Aber wo soll ich nun den Inhalt meines Anhangs definieren? Also der Anhang ist ja nicht jedes Mal derselbe, sondern das Ergebnis einer Abfrage aus einer völlig anderen Tabelle....?
 
Weshalb gibt es wohl den Parameter "data" der als Clob deklariert wurde ? :)
Code:
declare
  Cursor dein_cursor is
     SELECT * FROM a WHERE a.spalte = 'Y';

  deine_csv_daten Clob;
begin
   For rec_ In dein_cursor Loop
      deine_csv_daten := deine_csv_Daten || rec_.spalte1 || ';' || rec_.spalte2 || ';' || rec_.spalte3 || utl_tcp.crlf;
   End;
   dein_package.send_mail('dein_empfänger@muster.de', 'Dein Betreff', 'Das hier ist ein Test', 'datei_name', 'csv', deine_csv_daten);
end;
 
Werbung:
Zurück
Oben