*---------------------------------------------------------------------*
*                        Z _ B J H _ E M A I L                        *
*                                                                     *
*                  Autor: Bernd Haase (BJH Software)                  *
*---------------------------------------------------------------------*
* Beispielprogramm für das Versenden von Emails aus SAP heraus und    *
* einer Datei im Anhang. Emailempfänger, Text, Anhang und Inhalt sind *
* von außen auffüllbar. Unterprogramm kann auch als Funktionsbaustein *
* umgebaut werden, bei gleicher Variablenübergabe.                    *
*---------------------------------------------------------------------*
* (E) 'SO_NEW_DOCUMENT_ATT_SEND_API1'                                 *
*---------------------------------------------------------------------*
* 11.05.2004 BHaa: Programm erstellt                                  *
*---------------------------------------------------------------------*
REPORT  z_bjh_email                .

* Struktur
TABLES:
 listzeile.

***********************************
*  Konstanten für Fehlerhinweise  *
***********************************
DATA:
 f_txt(60) TYPE c.
CONSTANTS:
 f_000 LIKE f_txt VALUE 'Email wurde versendet an',
 f_002 LIKE f_txt VALUE 'Dokument wurde nicht gesendet an.',
 f_004 LIKE f_txt VALUE 'hat keine Berechtigung zum Versenden.',
 f_999 LIKE f_txt VALUE 'Fehler beim Versenden der Email.'.

* Variablendeklaration für Zeilen und Inhalten
DATA:
* Einzelne Zeile für den Emailtext oder die Anhangsdatei
 wa_text LIKE listzeile,

* interne Tabelle für die Emailadressen der Empfänger
 itab_adressen LIKE TABLE OF listzeile,
* interne Tabelle für den Emailtext
 itab_text LIKE TABLE OF listzeile,
* interne Tabelle für die Anhangsdatei
 itab_anhang LIKE TABLE OF listzeile.

*---------------------------------------------------------------------*
*                                                                     *
*                 A u s w a h l b i l d s c h i r m                   *
*                                                                     *
*---------------------------------------------------------------------*
* Der Einfachheit halber: Alle Daten wie Empfänger und Empfänger in   *
* Kopie, Betreffzeile, Anhangsdateiname, -typ und Inhalt über         *
* Parametereingabe.                                                   *
*---------------------------------------------------------------------*
* Emailadressdaten und weitere Angaben zum Emailversand
SELECTION-SCREEN: BEGIN OF BLOCK a1 WITH FRAME TITLE text-901.
PARAMETERS:
pmadr1(50)   TYPE c DEFAULT 'bjh@bmksound.de',
pmadr2(50)   TYPE c DEFAULT 'webmaster@bmksound.de',
pmtitel(50)  TYPE c,
pmanhang(20) TYPE c DEFAULT 'daten',
pmanhtyp(3)  TYPE c DEFAULT 'RAW',
pmtext(50)   TYPE c.
SELECTION-SCREEN: END OF BLOCK a1.


INITIALIZATION.
* interne Tabelle initialisieren
 CLEAR: itab_adressen, itab_text, itab_anhang.

***********************************************************************
*                                                                     *
*                     P R O G R A M M S T A R T                       *
*                                                                     *
***********************************************************************
START-OF-SELECTION.
* 1-zeilige Testzeile. Diese als Emailtext sowie auch als Inhalt der
* Anhangsdatei nutzen. Natürlich können in Echtprogrammen die Inhalte
* komplett differieren, es ist nur darauf zu achten, daß die Zeilen-
* länge nicht die Länge der Struktur (256 Zeichen) überschreitet
 MOVE pmtext TO wa_text.
 APPEND wa_text TO itab_text.

 APPEND wa_text TO itab_anhang.

* Emailadresse(n) auf Kleinbuchstaben wandeln (wegen Routenfindung)
* und in interne Tabelle übertragen
 TRANSLATE pmadr1 TO LOWER CASE.
 APPEND pmadr1 TO itab_adressen.

 TRANSLATE pmadr2 TO LOWER CASE.
 APPEND pmadr2 TO itab_adressen.

* Aufruf der Upros, in echter Umgebung ... Funktionsbaustein ???
 PERFORM upro-email_versenden
      TABLES itab_adressen
             itab_text
             itab_anhang
      USING  pmtitel
             pmanhang
             pmanhtyp.

* Status der Verarbeitung anzeigen (Auswahl, nicht alle mit voll
* qualifiziertem Text hinterlegt).
 CASE sy-subrc.
* Email erfolgreich versendet (nur der 1. Empfänger wird angezeigt)
   WHEN 0.
     CONCATENATE f_000 pmadr1 INTO f_txt SEPARATED BY ' '.
     MESSAGE ID 'ZM' TYPE 'I' NUMBER 000 WITH f_txt.
* Das Dokument wurde nicht versendet
   WHEN 2.
     CONCATENATE f_002 pmadr1 INTO f_txt SEPARATED BY ' '.
     MESSAGE ID 'ZM' TYPE 'E' NUMBER 000 WITH f_txt.
* Keine Berechtigung zum Senden / Anlegen
   WHEN 4.
     CONCATENATE sy-uname f_004 INTO f_txt SEPARATED BY ' '.
     MESSAGE ID 'ZM' TYPE 'E' NUMBER 000 WITH f_txt.
* sonstige Fehler, nicht genauer beschrieben
   WHEN OTHERS.
     MOVE f_999 TO f_txt.
     MESSAGE ID 'ZM' TYPE 'E' NUMBER 000 WITH f_txt.
 ENDCASE.

END-OF-SELECTION.
 EXIT.

*---------------------------------------------------------------------*
*                             E M A I L                               *
*---------------------------------------------------------------------*
* Upro oder Funktionsbaustein für Daten- und Variablenaufbereitung    *
* im systemtechnischen teil von SAP für die Emailversendung.          *
*---------------------------------------------------------------------*
FORM upro-email_versenden
    TABLES itab_adressen
           itab_text
           itab_anhang
    USING  p_email_betreff
           p_email_anhang_name
           p_email_anhang_typ.

 DATA:
   objpack       LIKE sopcklsti1 OCCURS 2 WITH HEADER LINE,
   objhead       LIKE solisti1   OCCURS 1 WITH HEADER LINE,
   empfaengertab LIKE somlreci1  OCCURS 5 WITH HEADER LINE,
   email         LIKE sodocchgi1,
   anzahl_zeilen LIKE sy-tabix,

   empfaenger    LIKE LINE OF empfaengertab.

*= = = = = = = = = = = = =

* Aufbau der zu versendenden Email. Betreffzeile generieren und die
* Gesamtgröße wieviel Zeichen (nur Text, Inhalt) transferiert werden,
* errechnen.
 email-obj_name  = 'OBJ_NAME'.
 email-obj_descr = p_email_betreff.
 DESCRIBE TABLE itab_text LINES anzahl_zeilen.
 READ TABLE itab_text INDEX anzahl_zeilen.
 email-doc_size = ( anzahl_zeilen - 1 ) * 256 + STRLEN( itab_text ).

* Textzeilen der Email. Interne Tabelle für die Textübergabe aufbauen.
 CLEAR objpack-transf_bin.
 objpack-head_start = 1.
 objpack-head_num = 0.
 objpack-body_start = 1.
 objpack-body_num = anzahl_zeilen.
 objpack-doc_type = 'RAW'.
 APPEND objpack.

* Dateianhang. Interne Tabelle mit den Dateinamen
 objhead = p_email_anhang_name.
 APPEND objhead.

* Textzeilen für den Dateianhang. Gleiches Spiel wie bei normalen
* Textzeilen.
 DESCRIBE TABLE itab_anhang LINES anzahl_zeilen.
 READ TABLE itab_anhang INDEX anzahl_zeilen.

 objpack-transf_bin = 'X'.
 objpack-head_start = 1.
 objpack-head_num   = 1.
 objpack-body_start = 1.
 objpack-body_num   = anzahl_zeilen.
 objpack-doc_type   = p_email_anhang_typ.
 objpack-obj_name   = 'ANLAGE'.
 objpack-obj_descr  = p_email_betreff.
 objpack-doc_size   = anzahl_zeilen * 256.
 APPEND objpack.

* Empfängerliste aufbauen. Im Beispiel ist sind 2 Empfänger in der
* Parameterleiste vorgesehen. Nur die in die interne tabelle für den
* Emailversand übernehmen, welche auch gefüllt sind. Für alle Adressen
* sind die gleichen äußeren Parameter zusetzen, nur die Adresse selbst
* wird abgetauscht
 CLEAR:   empfaengertab, empfaenger.
 REFRESH: empfaengertab.

 empfaenger-rec_type = 'U'.
 LOOP AT itab_adressen INTO listzeile.
   IF NOT listzeile-zeile IS INITIAL.
     MOVE listzeile-zeile TO empfaenger-receiver.
     APPEND empfaenger TO empfaengertab.
   ENDIF.
 ENDLOOP.

* Versenden des Dokumentes und der Anhangsdatei an den Knoten "INT"
 CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
      EXPORTING
           document_data              = email
           put_in_outbox              = 'X'
      TABLES
           packing_list               = objpack
           object_header              = objhead
           contents_bin               = itab_anhang
           contents_txt               = itab_text
           receivers                  = empfaengertab
      EXCEPTIONS
           too_many_receivers         = 1
           document_not_sent          = 2
           document_type_not_exist    = 3
           operation_no_authorization = 4
           parameter_error            = 5
           x_error                    = 6
           enqueue_error              = 7
           OTHERS                     = 8.

* Raise nur aktivieren, wenn Funktionsbaustein
*  CASE sy-subrc.
*    WHEN 0.
*    WHEN 1.
*      RAISE too_many_recievers.
*    WHEN 2.
*      RAISE document_not_send.
*    WHEN 3.
*      RAISE document_type_not_exist.
*    WHEN 4.
*      RAISE operation_no_authorization.
*    WHEN 5.
*      RAISE parameter_error.
*    WHEN 6.
*      RAISE x_error.
*    WHEN 7.
*      RAISE enqueue_error.
*    WHEN OTHERS.
*      RAISE others.
*  ENDCASE.
*
ENDFORM.

***** Ende *****
* Copyright BJH Software, Datei überarbeitet am: 21.5.2005