Outlook-Email

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
14 Beiträge • Seite 1 von 1
14 Beiträge Seite 1 von 1

Outlook-Email

Beitrag von BesenWesen (Specialist / 183 / 0 / 0 ) »
Hallo Zusammen,

ich bin mal wieder ratlos und suche Hilfe bei den Spezialisten hier...

ich benoetige dringend einen Klasse/Methode oder Funktionsbaustein der mir folgendes Problem loest.

ich will eine M$-Office-Outlook-Mail erzeugen und abhaengig vo System einen anderen Betreff und Text mitgeben.

Ich habe zwar die Methode CL_GUI_FRONTEND_SERVICES=>EXECUTE versucht, aber leider kann ich hier nur ein abgespeichertes Objekt oeffnen aber nicht aendern.


Vielen Dank im voraus.
Gruss
BesenWesen

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


So geht's

Beitrag von Grayhound (ForumUser / 37 / 0 / 0 ) »
Hi Besenwesen,
sieh' Dir mal dieses Beispiel an. Läuft bestens. Text in Betreffzeile, Text im Body und auch Attachments. In Anschrift kannst Du den Mailempfänger eintragen, wenn Du einen Loop machst auch Serienmails über Outlook verschicken.
Hans

Code: Alles auswählen.

*Createt by Hans Muenstermann
 create object out 'Outlook.Application'.
  call method of out 'CREATEITEM' = outmail exporting #1 = 0.
*SET PROPERTY OF OUTMAIL 'TO' = 'Mail@Adresse.de;'.
*Mailempfänger
  set property of outmail 'TO' = anschrift.
*Betreffzeile, entweder diese oder untere
*SET PROPERTY OF OUTMAIL 'SUBJECT' = <subject text>.
*Betreffzeile
  set property of outmail 'SUBJECT' =
  'Informationen von .....'.
*Textfenster entweder dies oder das untere
*SET PROPERTY OF OUTMAIL 'BODY' = <body text>.
*Textfenster
*set property of outmail 'BODY' = 'Superaffengeil'.

*Hier könnte man Attachments anhängen
*CALL METHOD OF OUTMAIL 'ATTACHMENTS' = atts.
*CALL METHOD OF ATTS 'ADD'
*EXPORTING #1 = <file-name-on-c:drive>.
*Mail anzeigen
  call method of outmail 'Display'.
*hier könnte automatisch gesendet werden
*wenn das Senden im Dunkeln passieren soll, kann man den Display
*aussternen und den send aktivieren
*call method of outmail 'SEND'.

Beitrag von BesenWesen (Specialist / 183 / 0 / 0 ) »
Bild
JUHU!!!!! Genau das hab ich gesucht!!!
Vielen Dank grayhound!!
Gruss
BesenWesen

Beitrag von BesenWesen (Specialist / 183 / 0 / 0 ) »
jetzt ist nur noch offen, wie ich einen Text mit mehreren Zeilen in den Body rein bekomme.
Kannst du mir da auch weiter helfen Grayhound?
Gruss
BesenWesen

Beitrag von Grayhound (ForumUser / 37 / 0 / 0 ) »
Hi Besenwesen,
ich hab' jetzt nicht so die Zeit zum Testen und es ist schon länger her dass ich das geschrieben habe.
Deshalb habe ich jetzt so keine Idee. Was hast Du getestet? 'Superaffengeil' kann man bestimmt durch eine Variable ersetzen, wie im Mailempfänger auch.
Und da könnte man ja Werte in einer Variablen hinterlegen.
Eine andere Möglichkeit wäre, 'set property of outmail 'BODY' = ......' mehrfach aufzurufen, denn set property of ist ja eine Zuweisung. Aber ich weiss nicht, ob es geht.
Teste mal und sag Bescheid, würde mich auch interessieren.
Viel Spass noch,
Hans

Beitrag von black_adept (Top Expert / 3946 / 105 / 886 ) »
Probier mal den Body in einen laaaaaaangen String zu verpacken. Pro neuer Zeile dann die Hex-Zeichen ( ich glaube das "0A 0D" ) für Zeilenvorschub dazwischenklemmen.

So läufts zumindest, wenn ich in PHP via sendmail was absetze...
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von BesenWesen (Specialist / 183 / 0 / 0 ) »
Hallo Hans,

ja, den Text kann ich durch eine Variable ersetzen.
Das Problem liegt aber woanders.

Bei dem SET PROPERTY weise ich der 'Variable' Body einen Wert zu.
wenn ich das mehrfach aufrufe, behaelt sich die Body nur den letzten Wert. Somit kann ich den aufruf auch nich in eine Loop-Endloop-Schleife machen.
Ich kann dem Body auch keine int. Tabelle mitgeben, da bekomme ich einen Syntaxfehler.

Einzige Moeglichkeit die ich sehe ist, den Text den ich habe
(z.B.

Code: Alles auswählen.

'Hallo'

'ich bin die zweite Zeile'
)
mit einer Art APPEND-Befehl an die Variable Body anzuhaengen. Nur da gehen mir die Ideen aus.

Ich habe auch schon versucht, wie es mit Word geht einen

Code: Alles auswählen.

  call method of h_word 'Insert'
    exporting
      #1 = text.
abzusetzten. Leider gibt es die Methode Insert bei Mail aber nicht.


Hallo black_adept
die moeglichkeit mit einem ernorm langen String habe ich auch schon in erwaegung gezogen. Ist aber bei der Laenge der eMail wohl nicht der beste Weg. Daher hoffe ich, dass es noch seitens SAP eine andere Moeglichkeit gibt.
Gruss
BesenWesen

Beitrag von black_adept (Top Expert / 3946 / 105 / 886 ) »
Hi Besenwesen,

dass der String sehr lang wird liegt doch in der Natur der Sache, da der Body einer mail ja eben auch ziemlich lang werden kann.

Vielleicht so oder ähnlich würd ich ansetzen:

Code: Alles auswählen.

data: zeilenvorschub(2) type x value '0A0D'.

LOOP AT itab INTO wa.

  CONCATENATE outputstring wa INTO outputstring SEPARATED BY zeilenvorschug.

ENDLOOP.
Und die Länge sollte kein Problem sein.
SAP schreibt in der Doku zu eingebauten Datentypen:
STRING für Zeichenfolgen
Eine Zeichenfolge ist ein zeichenartiger Typ variabler Länge. Eine Zeichenfolge kann beliebig viele alphanumerische Zeichen aufnehmen. Die Länge einer Zeichenfolge ist die Anzahl der Zeichen multipliziert mit der Länge der internen Darstellung des Zeichens.
Dass ein string tatsächlich beliebig lang werden kann glaube ich aus mehreren Gründen zwar nicht - aber wahrscheinlich reicht das, was gegeben ist für deine Zwecke aus.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von Grayhound (ForumUser / 37 / 0 / 0 ) »
Hi Besenwesen,
sieh' Dir mal folgende Struktur an:
ITEM_BODY STRUCTURE SOLI OPTIONAL
Schreib' da mal was rein und teste noch mal.
Hans

Beitrag von BesenWesen (Specialist / 183 / 0 / 0 ) »
hallo zusammen.

ihr habt mein Problem geloest. Vielen Dank!!

ich hab es ueber die Variante mit dem String geloest.

hier das Coding:
(Original von Grayhound)

Code: Alles auswählen.

REPORT  ytesmk17                                                    .
INCLUDE ole2incl.
INCLUDE docsincl.

DATA out TYPE ole2_object.
DATA outmail TYPE ole2_object.
CONSTANTS: cc TYPE string
                  VALUE ''
         , to TYPE string VALUE ''
         , x(2) TYPE x VALUE '0D0A'
         .

DATA mail TYPE tline OCCURS 0.
DATA wa_mail TYPE tline.
DATA id TYPE thead-tdid VALUE 'ST'.
DATA lan TYPE thead-tdspras VALUE 'DE'.
DATA name TYPE thead-tdname VALUE 'YTESMK_MAIL'.
DATA subject TYPE thead-tdname VALUE 'YTESMK_MAIL_SUBJECT'.
DATA string TYPE string.


*----------------------------------------------------
* Mail anlegen
CREATE OBJECT out 'Outlook.Application'.
CALL METHOD OF out 'CREATEITEM' = outmail
  EXPORTING
    #1 = 0.

*----------------------------------------------------
*Mailempfänger
SET PROPERTY OF outmail 'TO' = to.
SET PROPERTY OF outmail 'CC' = cc.

*----------------------------------------------------
*Betreffzeile
CALL FUNCTION 'READ_STDTEXT'
  EXPORTING
    id                     = id
    language               = lan
    name                   = subject
*   USE_AUX_LANGUAGE       = ' '
*   USE_THRUCLIENT         = ' '
*   LOCAL_CAT              = ' '
* IMPORTING
*   HEADER                 =
  TABLES
    lines                  = mail
 EXCEPTIONS
   id                     = 1
   language               = 2
   name                   = 3
   not_found              = 4
   reference_check        = 5
   OTHERS                 = 6
          .
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

READ TABLE mail INDEX 1 INTO wa_mail.
//geloescht
SET PROPERTY OF outmail 'SUBJECT' = wa_mail-tdline.

*----------------------------------------------------
*Textfenster

* Standardtext lesen
CALL FUNCTION 'READ_STDTEXT'
  EXPORTING
    id                     = id
    language               = lan
    name                   = name
*   USE_AUX_LANGUAGE       = ' '
*   USE_THRUCLIENT         = ' '
*   LOCAL_CAT              = ' '
* IMPORTING
*   HEADER                 =
  TABLES
    lines                  = mail
 EXCEPTIONS
   id                     = 1
   language               = 2
   name                   = 3
   not_found              = 4
   reference_check        = 5
   OTHERS                 = 6
          .
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.


READ TABLE mail INDEX 6 INTO wa_mail.
//geloescht
MODIFY mail FROM wa_mail INDEX 6.

LOOP AT mail INTO wa_mail.

  CONCATENATE string wa_mail-tdline INTO string
  SEPARATED BY x.

ENDLOOP.

SHIFT string LEFT BY 2 PLACES.

SET PROPERTY OF outmail 'BODY' = string.

*Hier könnte man Attachments anhängen
*CALL METHOD OF OUTMAIL 'ATTACHMENTS' = atts.
*CALL METHOD OF ATTS 'ADD'
*EXPORTING #1 = <file-name-on-c:drive>.

*----------------------------------------------------
* Mail anzeigen
CALL METHOD OF outmail 'Display'.
*hier könnte automatisch gesendet werden
*wenn das Senden im Dunkeln passieren soll, kann man den Display
*aussternen und den send aktivieren
*call method of outmail 'SEND'.
Gruss
BesenWesen

Re: Outlook-Email

Beitrag von ST22 (Specialist / 274 / 40 / 40 ) »
Hallo Zusammen,
ich grabe dieses Thema noch mal aus, da er mir zum einen sehr weiter geholfen hat zum anderen ich aber noch ein ungelöstes Problem habe.

Das Mail erstellen geht wunderbar über

Code: Alles auswählen.

CREATE OBJECT lr_outlook 'Outlook.Application'.
CALL METHOD OF lr_outlook 'CREATEITEM' = lr_mail
    EXPORTING
    #1 = 0.
  SET PROPERTY OF lr_mail 'TO' = 'max.mustermann@dummy.de.
  SET PROPERTY OF lr_mail 'SUBJECT' = 'Das ist der Betreff'.
  SET PROPERTY OF lr_mail 'BODY' = lv_string. "Mailtext
  CALL METHOD OF lr_mail 'Display'.
Leider wird dabei meine Signatur, die ich standardmäßig verwende durch meine Methode

Code: Alles auswählen.

  SET PROPERTY OF lr_mail 'BODY' = lv_string.
überschrieben.

Meine Idee, über die Registry den Wert der verwendeten Signatur zu lesen und die Signaturdatei dann hochzuladen und mit in den Body einzufügen ist gescheitert, weil man anscheinend keine binären Registrywerte lesen kann.
Jetzt wäre meine Frage, ob ich irgendwie meinen Mailtext gezielt vor der Signatur einsetzen kann, ohne dass mir die Signatur überschrieben wird?
Gibt es geeignete Methoden der Mailinstanz?

Schöne Grüße
Frank

Re: Outlook-Email

Beitrag von BesenWesen (Specialist / 183 / 0 / 0 ) »
Hallo Frank,

auf anhieb faellt mir da folgende Moeglichkeit ein.

Lege dir fuer deine Signatur/en einen/mehrere Standardtext/e (SO10, Text-ID 'ST') an.
Die Texte kannst du dann wiederum in deinem Email-Programm lesen (FuBa READ_TEXT) und an deinen Mailtext anfuegen.


Gruss,
Michael
Gruss
BesenWesen

Re: Outlook-Email

Beitrag von a-dead-trousers (Top Expert / 4282 / 214 / 1141 ) »
ST22 hat geschrieben:Meine Idee, über die Registry den Wert der verwendeten Signatur zu lesen und die Signaturdatei dann hochzuladen und mit in den Body einzufügen ist gescheitert, weil man anscheinend keine binären Registrywerte lesen kann.
Die Signatur steht ja auch nicht in der Registry, sondern liegt als Datei im Benutzerverzeichnis von Outlook:
  • %APPDATA%\Roaming\Microsoft\Signatures (Win7)
  • %APPDATA%\Microsoft\Signatures (WinXP)
Hier gibt es je nach Typ der Email eine Signatur als TXT, HTML oder RTF.
ST22 hat geschrieben:Jetzt wäre meine Frage, ob ich irgendwie meinen Mailtext gezielt vor der Signatur einsetzen kann, ohne dass mir die Signatur überschrieben wird?
Gibt es geeignete Methoden der Mailinstanz?
Ich kenn mich jetzt zwar nicht so gut mit OLE aus, aber hast du schon mal

Code: Alles auswählen.

  GET PROPERTY OF lr_mail 'BODY' = lv_string.
ausprobiert um vor dem Setzen die aktuellen Daten der Email auszulesen?
BesenWesen hat geschrieben:Lege dir fuer deine Signatur/en einen/mehrere Standardtext/e (SO10, Text-ID 'ST') an.
Die Texte kannst du dann wiederum in deinem Email-Programm lesen (FuBa READ_TEXT) und an deinen Mailtext anfuegen.
Guter Vorschlag, aber man muss die SO10-Texte dann in ein Format konvertieren, dass Outlook verarbeiten kann.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Outlook-Email

Beitrag von ST22 (Specialist / 274 / 40 / 40 ) »
Guten Morgen,
danke für eure Antworten, habe das Problem gestern Abend noch gelöst bekommen :D
BesenWesen hat geschrieben:
Lege dir fuer deine Signatur/en einen/mehrere Standardtext/e (SO10, Text-ID 'ST') an.
Die Texte kannst du dann wiederum in deinem Email-Programm lesen (FuBa READ_TEXT) und an deinen Mailtext anfuegen.
Das wäre sicher gegangen, aber viele User haben viele verschiedene Signaturen, außerdem wollte ich möglichst das E-Mailformat und das Format der Signatur beibehalten, weil es bei uns Regularien für versendete E-Mails gibt.
a-dead-trousers hat geschrieben: Die Signatur steht ja auch nicht in der Registry, sondern liegt als Datei im Benutzerverzeichnis von Outlook:
  • %APPDATA%\Roaming\Microsoft\Signatures (Win7)
  • %APPDATA%\Microsoft\Signatures (WinXP)
Hier gibt es je nach Typ der Email eine Signatur als TXT, HTML oder RTF.
Das Problem ist aber, dass ein Anwender seine Signatur (personalisiert) woanders ablegen kann, und genau diesen Verweis auf den Ort der Signaturdatei wollte ich aus der Registry auslesen. Das geht (glaube ich) mit CL_GUI_FRONTEND_SERVICES=>REGISTRY_GET_(DWORD_)VALUE leider nicht, weil binary value.
a-dead-trousers hat geschrieben:Ich kenn mich jetzt zwar nicht so gut mit OLE aus, aber hast du schon mal

Code: Alles auswählen.

      GET PROPERTY OF lr_mail 'BODY' = lv_string.
ausprobiert um vor dem Setzen die aktuellen Daten der Email auszulesen?
Das ist im Prinzip der richtige Ansatz gewesen, nur muss vorher

Code: Alles auswählen.

  CALL METHOD OF lr_mail 'Display'.
  GET PROPERTY OF lr_mail 'Htmlbody' = lv_body.
aufgerufen werden, anscheinend wird die Signatur erst sehr spät eingemischt und nur, wenn man nicht selber den Body übergibt.
Danach kann man den String lv_body wunderbar bearbeiten um dann durch

Code: Alles auswählen.

  SET PROPERTY OF lr_mail 'Htmlbody' = lv_body.
  CALL METHOD OF lr_mail 'Display'.
das Outlook Fenster wieder zur Anzeige zu bringen. Der Anwender kann dann noch weiteren Text erfassen und die Mail versenden.
Ach so, das HTML Format ist zwar bei uns Standard, ich habe es zur Sicherheit aber gesetzt:

Code: Alles auswählen.

  lv_mail_format = '2'.  "HTML
  SET PROPERTY OF lr_mail 'BodyFormat' = lv_mail_format.
Gruß
Frank

Seite 1 von 1

Vergleichbare Themen

8
Antw.
3714
Views
Outlook EMail
von jensschladitz » 24.02.2014 15:30 • Verfasst in ABAP® Core
2
Antw.
2056
Views
Mehrzeiliger Body im OUTLOOK-Email
von fip » 11.07.2007 11:21 • Verfasst in ABAP® Core
1
Antw.
1103
Views
Generierte eMail (BCS) als Outlook-Datei "irgendeinname.msg" speichern
von deejey » 22.10.2020 19:31 • Verfasst in SAP - Allgemeines
0
Antw.
1364
Views
0
Antw.
1006
Views
Outlook Vorschaufenster in SAP
von Betze » 08.11.2006 09:21 • Verfasst in ABAP Objects®

Aktuelle Forenbeiträge

SELECT CHAR16 in CHAR12-Feld
vor einer Stunde von Patrick1982 gelöst 5 / 57
alv_grid aktualisieren
vor 6 Stunden von Egzon gelöst 4 / 82

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

SELECT CHAR16 in CHAR12-Feld
vor einer Stunde von Patrick1982 gelöst 5 / 57
alv_grid aktualisieren
vor 6 Stunden von Egzon gelöst 4 / 82

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Wochen von Lucyalison 1 / 134
Group Items auf einer Filterbar
vor 5 Wochen von Bright4.5 1 / 170