Mail erstellen

  • Servus

    Es gibt zwar schon etliches zum Thema EMail, aber das "Richtige" habe ich dennoch nicht gefunden.

    Das Programm soll E-Mails erstellen - und vorweg - ich hab keine Zugangsdaten für _INetSmtpMailCom (Mailserver, Passwort, etc.)

    Bis jetzt hab ich

    [autoit]

    _INetMail($sMailadr, $sBetreff, $sNachrText)

    [/autoit]

    verwendet.

    [autoit]

    $sMailadr = "mail@adresse.at" ; aus Projektdaten
    $sBetreff = "betrifft öäüß..." ; aus Projektdaten
    $sNachrText = "Nachrichtentext ... öäüß ..." ; je nach Art der Mail (Anfrage, Bestellung, Lieferung, ...

    [/autoit][autoit][/autoit][autoit]

    $sAnhang = "c:\test.txt"

    [/autoit]

    ... werden zuvor im Programm zugewiesen.

    Nachteile:
    1) Keine Signatur und kein Anhang möglich (?)
    2) kann keine Umlaute und "ß" - müssen extra korrigiert werden

    =========================================================================================

    Hab dann weitere Möglichkeiten gefunden:

    Spoiler anzeigen
    [autoit]

    ;~ keine Ahnung, was die folgenden beiden Zeilen bewirken (sollen), es funktioniert eigentlich auch ohne sie ...?
    ;~ #AutoIt3Wrapper_AU3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    ;~ #AutoIt3Wrapper_AU3Check_Stop_OnWarning=Y

    [/autoit] [autoit][/autoit] [autoit]

    #include <OutlookEX.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;~ ... Mail senden: ("entsel-0" und "entsel-1" sind in Outlook vorhandene Signaturen)

    [/autoit] [autoit][/autoit] [autoit]

    _OL_MailSignatureSet("entsel-1", "") ; gewünschte Signatur setzen
    $oOutlook = _OL_Open()
    _OL_Wrapper_SendMail($oOutlook, $sMailadr, "", "", $sBetreff, $sNachrText, $sAnhang, "", "")
    _OL_Close($oOutlook)

    [/autoit] [autoit][/autoit] [autoit]

    _OL_MailSignatureSet("entsel-0", "") ;auf Standardsignatur zurücksetzen

    [/autoit]

    1) Was muss ich ändern/ergänzen, damit die Mail nicht gleich gesendet, sondern nur erstellt und zur Kontrolle (und eventuellen weiteren Bearbeitung) geöffnet wird.
    Das Abschicken soll manuell über den Senden-Button erfolgen.

    2) Wie kann ich bewirken, dass noch eine (der bereits vorhanden Signaturen) angehängt/verwendet wird - die hier verwendete

    [autoit]

    _OL_MailSignatureSet ()

    [/autoit]

    funktioniert leider nicht.
    (ich glaube mich zu erinnern, dazu was gelesen zu haben, find's aber nicht mehr)

    =========================================================================================

    Dritte Möglichkeit:

    Spoiler anzeigen
    [autoit]

    #include <OutlookEX.au3>
    Global $oOutlook = _OL_Open()

    [/autoit] [autoit][/autoit] [autoit]

    _OL_MailSignatureSet("entsel-1", "")

    [/autoit] [autoit][/autoit] [autoit]

    $oItem = _OL_ItemCreate($oOutlook, $olMailItem, "", "", "Subject=Betreff öäüß")
    $oItem.BodyFormat = $olFormatHTML
    $oItem.GetInspector
    $sBody = $oItem.HTMLBody
    $oItem.HTMLBody = "Nachricht öäü?..." & $sBody
    $oItem.Display

    [/autoit] [autoit][/autoit] [autoit]

    _OL_MailSignatureSet("entsel-0", "entsel-0")

    [/autoit]

    Funktioniert mit Signatur, aber wie könnte ich da noch die EMail-Adresse und den Anhang einbauen.


    Bitte um Eure Hilfe
    SG, entsel

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

    3 Mal editiert, zuletzt von entsel (31. Januar 2013 um 17:20)

  • Zu Deiner Version mit OutlookEX:

    • _OL_Open gehört ganz an den Anfang des Skripts, noch vor _OL_MailSignatureSet
    • Ersetze _OL_Wrapper_SendMail durch die einzelnen Funktionsaufrufe die in dieser Funktion "gewrapped" sind und lasse _OL_ItemSend am Ende weg. $oItem.Display reicht dann für die Anzeige
    • Da eine Signatur gleich bei der Erstellung der Mail angehängt wird, zerstörst Du mit der Zuweisung des Mailtextes die Signatur wieder. Im Wiki findest Du beschreiben, wie man das umgeht.
  • Hallo H2O

    Danke für Deine Antwort.

    Die zweite Möglichkeit mit der

    [autoit]

    _OL_Wrapper_SendMail

    [/autoit]

    aus OutlookEX.au3 kann ich also vergessen.

    Leider bin ich noch nicht so weit um das Wiki zu verstehen (nicht mal, wenn's auf Deutsch wäre).
    Aber meine 3.Möglichkeit schaut dem HMTL-Beispiel schon sehr ähnlich (könnte glatt von dort sein ;) ).
    Ich hab auch versucht, in der OutlookEX.au3 irgendwelche Hinweise (Zusammenhänge) zu finden um auch noch die Adresse und eventuell einen Anhang einzubauen - leider vergeblich. Ich kam nicht dahinter, welche Werte sich in den diversen Variabeln verbergen bzw. wo sie zugewiesen werden.

    Am ehesten hätte ich noch vermutet, dass folgende Zeile ergänzt gehört:

    [autoit]

    $oItem = _OL_ItemCreate($oOutlook, $olMailItem, "", "", "Subject=Betreff öäüß", "Adresse=mail@adresse.at", "Anhang=c:\text.txt")

    [/autoit]

    ...funktioniert so natürlich nicht ...

    und hier steht ja auch nix von Adresse bzw. Anhang - aber auch nix vom Betreff (und der funktioniert dennoch):
    ;) Syntax.........: _OL_ItemCreate($oOL, $iItemType, $vFolder = ""[, $sTemplate = ""[,$sP1 = ""[, $sP2 = ""[, $sP3 = ""[, $sP4 = ""[, $sP5 = ""[, $sP6 = ""[, $sP7 = ""[, $sP8 = ""[, $sP9 = ""[, $sP10 = ""]]]]]]]]]]])

    ... vielleicht ist es ja die Bezeichnung "Subject" ? ... aber was gehört statt Adresse bzw. Anhang hin ? ... Reihenfolge ? ...


    [autoit]

    $oItem.HTMLBody = "Nachricht öäü?..." & $sBody

    [/autoit]

    Da wird dem Body wohl der Nachrichtentext mit der Signatur zugewiesen (das hab sogar ich geschnallt),
    aber gibts auch sowas, wie

    [autoit]

    $oItem.Adresse

    [/autoit]

    natürlich nicht mit der Zeichenfolge "Adresse", sondern der richtigen Bezeichnung?

    Fragen über Fragen ...

    Bitte um noch etwas Aufklärung, vor allem was das Hinzufügen von Adresse und Anhang betrifft.

    Schöne Grüße von A zu A
    entsel

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Meine letzte Antwort scheint durch den DB-Crash verloren gegangen zu sein.

    Zitat

    Bitte um noch etwas Aufklärung, vor allem was das Hinzufügen von Adresse und Anhang betrifft.

    Adressen: _OL_ItemRecipientAdd
    Anhang: _OL_ItemAttachmentAdd

  • Danke

    Werd mal das Web durchsuchen, ob ich irgendwo Anleitungen finde, wo und wie die beiden Begriffe zu verwenden sind.
    Zur Not bleiben ja noch Try & Error

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Wieso Web? Schau in die HTML-Help-Files rein, in die Beispielscripte die für jede Funktion mitkommen oder zur Not ins wiki.
    Das sollte reichen.

  • hier mal ein Schema zur Mailerzeugung iVm. OutlookEx.au3.
    Einzelne Werte sind namentlich benannt.
    Zum Hinzufügen weiterer Empfänger kannst Du auch direkt im _OL_ItemCreate vornehmen.

    Spoiler anzeigen
    [autoit]


    ; --------- include
    #include <OutlookEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; --------- Outlook aufrufen COM
    $oOutlook = _OL_Open()

    [/autoit] [autoit][/autoit] [autoit]

    ;---------- EMail erzeugen und im Entwurfordner speichern inkl. Signatur lt. Outlookeinstellungen + $emsend_oft ist ein Outlookformular, ansonsten "" einsetzen
    $vOL_Result = _OL_ItemCreate($oOutlook, $olMailItem, "", $emsend_oft, "Subject=Hier steht der Betreff", "To=empfaenger@xy.de", "CC=empfaengercc@xy.de")
    If @error Then
    MsgBox(16,"fehler",@error&@crlf&@extended )
    EndIf
    $sbody = "Body<br><b>fett</b> normal. Hier also Deinen E-Mailtext bestimmen im HTML Format"
    $vOL_Result.BodyFormat = $olFormatHTML
    $vOL_Result.GetInspector
    $sBody = $vOL_Result.HTMLBody
    $vOL_Result.HTMLBody = $eline & $sBody

    [/autoit] [autoit][/autoit] [autoit]

    ;---------- Attachments hinzufügen (hier die Datei Text.txt)
    _OL_ItemAttachmentAdd($oOutlook, $vOL_Result, Default, @scriptDir&"\test.txt")

    [/autoit] [autoit][/autoit] [autoit]

    ; -------- Outlookverbindung beenden
    _OL_Close($oOutlook)

    [/autoit]

    Einmal editiert, zuletzt von qwert23 (27. Januar 2013 um 20:25)

  • wie ich bereits sagte:

    Zitat

    Leider bin ich noch nicht so weit um das Wiki zu verstehen (nicht mal, wenn's auf Deutsch wäre).

    Zitat

    Ich hab auch versucht, in der OutlookEX.au3 irgendwelche Hinweise
    (Zusammenhänge) zu finden um auch noch die Adresse und eventuell einen
    Anhang einzubauen - leider vergeblich. Ich kam nicht dahinter, welche
    Werte sich in den diversen Variabeln verbergen bzw. wo sie zugewiesen
    werden.

    Ich bin leider kein "Profi" (wie Du?!) sonder noch Anfänger was Autoit betrifft - zweitens ist mein Schul-Englisch seit 40 Jahren Geschichte - Entschuldigung.
    Und um was zu lernen braucht man eben "sicheres Wissen" - die englischen Unterlagen reichen bei mir eben nur für bessere Vermutungen.
    (Drum hab ich mich ja auch auf autoit.de angemeldet und nicht auf autoitscript.com ;) - in der Meinung, hier auch deutschsprachige Infos zu erhalten)

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Zum Hinzufügen weiterer Empfänger kannst Du auch direkt im _OL_ItemCreate vornehmen.

    Würde ich nicht mit _OL_ItemCreate sondern mit _OL_ItemRecipientAdd machen. Das hat den Vorteil, dass es prüft, ob es den Benutzer auch gibt und bei Fehler @error setzt.

  • Hallo water,
    die Prüfung bezieht sich ausschließlich auf Adressen im Adressbuch / Kontakten, stimmts?
    Bei externen Adressen wäre doch selbiges Ergebnis erreicht, nicht wahr?

  • Hallo qwert23

    Die obige Antwort galt water, Deinen Beitrag habe ich erst danach gesehen.
    Keine Polemik - sollte nur meinen Status Quo in Erinnerung rufen bzw. ergänzen.

    Danke für Dein Beispiel, werds morgen (im Büro) ausprobieren (hab zu Hause Thunderbird)

    Ein paar Fragen hätte ich auch dazu (falls Du die eine oder andere beantworten magst):

    [autoit]

    $oOutlook = $oOutlook = _OL_Open()

    [/autoit]


    ...diese doppelte Zuweisung hat einen bestimmten Zweck? (oder ist ein Versehen?)

    $olMailItem und $emsend:
    Da habe ich vergeblich gesucht, wo denen ein Wert zugewiesen wird - um zu verstehen, was sie genau beinhalten (die Beschreibung der Parameter hilft mir nicht recht weiter).
    (hab die Zeichenkette "$emsend_oft =" und "$olMailItem =" weder hier noch in der OutlookEx.au3 gefunden)

    ... $emsend_oft ist ein Outlookformular ...
    Wurde der schon (anderweitig) ein Wert zugeordnet? Ich nehme an, "", erzeugt eine Mail ohne (bzw. Standard-)Formular - richtig?

    Und zu

    [autoit]

    $vOL_Result.GetInspector

    [/autoit]


    fand ich auch keine Infos, weder in der Autoit-Hilfe noch in der OutlookEx.au3.
    (mit "$" beginnen doch normal Variablennamen, aber das ... ?( )

    Was die Empfänger betrifft - das _OL_ItemRecipientAdd wird wohl genauso funktionieren wie Dein _OL_ItemAttachmentAdd.
    Sind meistens 2 externe (aus *.ini) - "name1@mail.at; name2@mail.at" würde wohl "@scriptDir&"\test.txt"" ersetzen.

    Danke

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • [autoit]

    $oOutlook = $oOutlook = _OL_Open()

    [/autoit]


    ...diese doppelte Zuweisung hat einen bestimmten Zweck? (oder ist ein Versehen?)
    ==> Ist auf jeden Fall ein Versehen: Muss $oOutlook = _OL_Open() lauten

    $olMailItem und $emsend:
    ==> $olMailItem ist eine Konstante die angibt, dass das Objekt das angelegt werden soll eine Mail ist. Sie ist in der Include-Datei OutlookExConstants.au3 definiert

    ... $emsend_oft ist ein Outlookformular ...
    Wurde der schon (anderweitig) ein Wert zugeordnet? Ich nehme an, "", erzeugt eine Mail ohne (bzw. Standard-)Formular - richtig?
    ==> Richtig. Wenn Du für die Mail keine Vorlage verwenden willst, dann musst Du den Parameter einfach leer lassen.

    Und zu

    [autoit]

    $vOL_Result.GetInspector

    [/autoit]


    fand ich auch keine Infos, weder in der Autoit-Hilfe noch in der OutlookEx.au3.
    (mit "$" beginnen doch normal Variablennamen, aber das ... ?( )
    ==> Kommt direkt aus dem Objectmodel von Outlook. $vOL_Result enthält ein Objekt, für das die Methode GetInspector aufgerufen wird.

    Was die Empfänger betrifft - das _OL_ItemRecipientAdd wird wohl genauso funktionieren wie Dein _OL_ItemAttachmentAdd.
    Sind meistens 2 externe (aus *.ini) - "name1@mail.at; name2@mail.at" würde wohl "@scriptDir&"\test.txt"" ersetzen.
    ==> _OL_ItemRecipientAdd($oOutlook, $vOL_Result, Default, $olTo, "name1@mail.at", "name2@mail.at")
    Mit $olTo gibst Du an, ob der Empfänger ein direkter Empfänger, ein CC oder BCC ist. $olTo ist eine Konstante die ebenfalls in der Include-Datei OutlookExConstants.au3 definiert ist.

  • Sorry - Fehler beim Kopieren. So ist es korrekt:

    [autoit]

    $oOutlook = _OL_Open()

    [/autoit]

    Zu $olMailItem und $emsend
    Schaue bitte mal in die Hilfedatei _OL_ItemCreate.htm. Im Beispiel 4 und 5 siehst Du, dass $olMailItem der allgemeinen Anweisung _OL_ItemCreate anzeigt, dass eine E-Mail erzeugt werden soll. Andere Anweisungen sind für Kontakte, Termine etc. in der Hilfedatei dokumentiert.

    $emsend ist einfach eine eigene Variable, die den Pfad und Dateinamen der .oft Datei beinhaltet. Beispiel 5 zeigt Dir das exakt auf.
    Beispiel: Du möchtest die E-Mail mit Abstimmungsbutton versenden. Ein Weg dahin ist, dass Du eine E-Mail in Deinem Outlook öffnest, die Abstimmungsbutton anwählst und dann diese "leere" E-Mail als .oft (Outlookformular) speicherst. Pfad und Dateinamen weißtDu dann z.Bsp. der Variablen $emsend zu. Es kann auch jede andere sein. Alternativ setze hier "" ein, wenn Du kein Formular verwendest. Deshalb ist Deine Annahme dazu korrekt.

    $vOL_Result.GetInspector ist eine COM Anweisung. Anweisungen und Inhalt findest Du in der MSDN von Microsoft, wie hier http://msdn.microsoft.com/en-us/library/…office.12).aspx
    Das kannst Du verstehen, musst das aber nicht... Dazu haben sich ja bereits andere ausreichend Gedanken gemacht. So wie water, denn ohne water hätten wir diese tolle UDF nicht. water: Danke!!!

    _OL_ItemRecipientAdd ist auch in der Hilfedatei beschrieben und funktioniert vom Grundsatz her genau so.
    Für die beiden E-Mailadressen würde ich diese aus vereinfachungsgründen in die _OL_ItemCreate Anweisung mit angeben (TO=...;...). Adressen werden wie in Outlook mit ; getrennt. Verbessern kannst Du das später immer noch.

    Dann melde doch bitte mal zurück, wie Du nun weiter vorangekommen bist.

  • Hallo water,
    die Prüfung bezieht sich ausschließlich auf Adressen im Adressbuch / Kontakten, stimmts?
    Bei externen Adressen wäre doch selbiges Ergebnis erreicht, nicht wahr?


    Vermute ich auch. Bei SMTP Adressen ist (vermutlich) kein Unterschied.

  • Besten Dank Euch beiden - mit diesen Infos kann auch ich was anfangen. Und @ water - Danke auch von mir für die UDF.

    Über das Objectmodel von Outlook ($vOL_Result.GetInspector) werde ich
    mir wirklich nicht den Kopf zerbrechen - wäre vergeudete Energie. (Aber immerhin weiß ich jetzt, wo's herkommt).

    Ich konnte mich heute zwar nicht so viel damit beschäftigen, wie ich wollte, hab aber schon einige erfolgreiche Testläufe geschafft.
    Nächster Schritt - Einbau ins Programm und Test mit richtigen Daten.
    Werd's dann posten, wenn's läuft.

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Noch ein Hinweis:
    Für stabile Programme solltest Du nach jedem Aufruf einer Funktion das Makro @error abfragen. Wenn ungleich 0, dann ist ein Fehler aufgetreten. Makro @extended enthält dann den COM Fehlercode.
    Dein Skript muss dann entscheiden, wie es weitermachen will. Die Erklärung was der Wert in @error bedeutet, findest Du in der Hilfe-Datei für die jeweilige Funktion.

  • So, wie angekündigt, meine Umsetzung.

    Wie schon erwähnt werden die Adressen, Betreff, Anhang und Nachrichtentext anderweitig zusammengestellt - würde hier zu weit führen - deshalb die Dummys.
    Ich hab eine Funktion gebastelt, der ich jeweils die entsprechenden Daten übergebe.
    Die Lösungen für Adressen und Anhänge habe ich gewählt, weil das flexibler ist (ein oder mehrere)

    Spoiler anzeigen
    [autoit]

    #include <OutlookEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $sAdresse = "name1@mail.at;name2@mail.at"
    Global $sBetreff = "Subject=" & "Lieferung - Projekt Nr 123456..."
    Global $sAnhang = "c:\test.dwg;c:\test.pdf"
    Global $sNachrText = "<basefont face=Arial>" & "<basefont size=3>" & "Sehr geehrte Damen und Herren" & "<br>" & "<br>" ; Schriftart, Schriftgröße, 1.Textzeile, 2x Zeilenumbruch
    $sNachrText &= "Dies ist die Nachricht ..."

    [/autoit] [autoit][/autoit] [autoit]

    sendemail($sAdresse, $sBetreff, $sNachrText, $sAnhang)

    [/autoit] [autoit][/autoit] [autoit]

    ;---------------------------------------------
    Func sendemail($sAdresse, $sBetreff, $sNachrText, $sAnhang)
    Global $oOutlook = _OL_Open()
    _OL_MailSignatureSet("entsel-2", "") ; in Outlook vorhandene Signatur
    $oItem = _OL_ItemCreate($oOutlook, $olMailItem, "", "", $sBetreff)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aRecipients ;empfänger
    If $sAdresse <> "" Then
    $aRecipients = StringSplit($sAdresse, ";", 2)
    _OL_ItemRecipientAdd($oOutlook, $oItem, Default, $olTo, $aRecipients)
    EndIf
    Local $aAttachments ;anhang
    If $sAnhang <> "" Then
    $aAttachments = StringSplit($sAnhang, ";", 2)
    _OL_ItemAttachmentAdd($oOutlook, $oItem, Default, $aAttachments)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $oItem.BodyFormat = $olFormatHTML
    $oItem.GetInspector
    $sBody = $oItem.HTMLBody
    $oItem.HTMLBody = $sNachrText & $sBody
    $oItem.Display

    [/autoit] [autoit][/autoit] [autoit]

    _OL_MailSignatureSet("entsel-1", "entsel-1") ; zurückstellen auf Standard-Signatur
    EndFunc ;==>sendmailma31

    [/autoit]


    Danke water, für den Tipp mit @error - das werde ich mir noch zu Gemüte führen.

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Klingt schon mal gut - weiterhin viel Erfolg!