Mail mit MAPI versenden

  • Hallo,
    ich möchte ein Mail erstellen und mit der MAPI-Funktion in Windows versenden.
    Die MAPI wird von diversen Programmen genutzt. Leider habe ich keine Idee wie ich das machen kann um die MAPI-Schnittstelle mit AutoIt anzusprechen. Ich glaube dafür ist die MAPI32.dll zuständig aber ich habe nirgends gefunden wie ich Funktionen aus der DLL nutzen kann.
    Eine Idee, einen Ansatzpunkt wo ich anfangen kann um die MAPI anzusprechen?

    Viele Grüsse
    HeiWoMa

    Einmal editiert, zuletzt von HeiWoMa (19. Oktober 2006 um 18:21)

  • Hallo,
    eigentlich wäre das ideal.
    ABER: Auf diversen Rechnern (in der Firma und bei Kunden) tritt der Fall auf, das sie mit Outlook arbeiten. Aber wenn man mailto auführt kommt es zu einem Fehler nicht genügend Rechte bla bla und das wars.
    Nach einigem Suchen habe ich dann folgendes herausgefunden:
    Der Fehler liegt in der Registry und zwar ist in:
    HKLM\SOFTWARE\Clients\Mail
    und in:
    HKCR\mailto\shell\open\command
    Outlook Express als Defaultmail-Programm eingetragen.
    In:
    HKCR\msgFile\shell\open\command
    ist Outlook als Mailprogramm eingetragen.
    wenn ich aber auf einem Rechner mit diesem Problem ein Programm ausführe das die MAPI zum Erstellen eines Mails benutzt dann funktioniert es, d.h. das Mail wird in Outlook und nicht in OutlookExpress erstellt. Also genau das was ich benötige. Da ich aber kein Programmierer bin und nur AutoIt halbwegs behersche finde ich keine Möglichkeit über die MAPI zu mailen.
    _INetMail() liest das Mailprogramm aus dem Schlüssel:
    HKCR\mailto\shell\open\command
    und da steht OutlookExpress darin. Ich habe es schon mit Blat und sendEmail versucht, aber bei allen muss ich den SMTP-Server eingeben. Da die Mailfunktion aber bei Kunden eingesetzt werden soll um Daten an den Support zu mailen, kann ich es vergessen, die wenigsten Anwender wissen ihren SMTP-Server, da der eingstellt ist und sie noch nie damit zu tun hatten.
    Wenn jemand einen Vorschlag hat wie man es mit einem externen Tool lösen kann gerne, ich bin für jeden Tipp dankbar.

    Viele Grüsse
    HeiWoMa

  • hi,

    ich selber habe (noch) nicht viel mit Outlook zu tun, weil wir ein anderes Mailsystem einsetzen. Aber ich bin mir sicher das Outlook COM-Klassen bereitstellt um auf Outlookfunktionen zuzugreifen. Du könntest versuchen darüber die Mails zu verschicken.

  • Hallo,
    leider setzen nicht alle Kunden Outlook ein. Was ist wenn sie Thunderbird oder Eudora oder sonst ein Programm einsetzen.
    Ich hoffe das alle über die MAPI ansprechbar sind, wenn nicht dann muss ich mir was anderes einfallen lassen. Bei einem Webmailer muss der Kunde es ohnehin manuell machen. Das mail erstellen und die Anhänge einfügen.

    Viele Grüsse
    HeiWoMa

  • ja, schon klar das nicht alle Outlook einsetzen (wäre ja noch schöner :hammer:) Allerdings kannst Du auch nicht davon ausgehen, das Du immer die gleiche MAPI vorfindest ;).

    Einmal editiert, zuletzt von jonk (19. Oktober 2006 um 22:44)

  • Zitat

    Sonst such dir doch ne mapi32.dll und leg sie zu deinem Programm und dann hast du eine definierte Version.


    Das wollte ich auch machen.
    Aber wie kann ich in AutoIt die Funktionen in der DLL ansprechen.
    Welche Funktionen muss ich ansprechen. Ich hab es noch nie gemacht mit einer DLL in AutoIt zu arbeiten.
    Ich muss ein Mail erstellen an einen Empfänger und Text im Body sowie mehrere ZIP-Dateien anhängen.

    Viele Grüsse
    HeiWoMa

  • HeiWoMa

    Eine der besten Lösungen zu diesem Thema wäre doch, dass das Skript "erkennt" ob es sich um ein System mit OE (oder einem anderen Standard E-Mail-Client) handelt oder mit Outlook angesteuert werden kann.
    HeiWoMa, deine oben beschriebene Entdeckung hat mich zu einer möglichen Lösung geführt.
    Hier der dazugehörige Code:

    Spoiler anzeigen


    #include <INet.au3> ;Konstante, wird für die Funktion _INetMail benötigt
    ;Hier kommt die Registry Abfrage nach dem Schlüssel den HeiWoMa entdeckt hat. Gibt es den Schlüssel nicht ($Outlookexist =""), dann ist auch kein ;Outlook auf dem System installiert.
    $Outlookexist = RegRead("HKEY_CLASSES_ROOT\msgfile\shell\open\command", "command")

    ;Hier sieht man das die Variabe leer zurückgekommen ist, also kein Outlook installiert.
    ;E-Mail wird über den Standard E-Mail client z.B.OE versendet.
    If $Outlookexist = "" Then
    $address = "Test@nowhere.xy"
    $subject = "Send by Standard E-Mail Client"
    $Body = "Götterfunke - Dies ist der Body der E-Mail"
    _INetMail($address, $subject, $Body)
    ;Sollte der Schlüssel exisieren und nicht leer zurückkommen, tritt die Funktion CreateMailItem in Kraft, die die e-mail in Outlook öffnet.
    Else
    CreateMailItem()
    EndIf

    Func CreateMailItem()
    Local $olMailItem = 0
    Local $olFormatRichText = 3
    Local $olImportanceNormal = 1

    $oOApp = ObjCreate("Outlook.Application")
    $oOMail = $oOApp.CreateItem($olMailItem)

    With $oOMail
    .To = ("Test@nowhere.xy")
    .Subject = "Send by Outlook E-Mail Client"
    .Body = "Götterfunke - Dies ist der Body der E-Mail"
    ;.BodyFormat = $olFormatRichText ;Diese Funktion geht ab Outlook 2003, auskommentiert für die Outlook 2000 Kompabilität
    .Importance = $olImportanceNormal
    .Display
    ; .Send ;Die Send Funktion ist wegen den Outlook Sicherheitsrichtlinien ausgeschaltet.
    EndWith
    EndFunc


    Danke an JOS aus dem amerikanischen Autoit Forum für die CreateMailItem Funktion.
    8) Somit ist man wohl für die meisten Fälle gerüstet, oder?
    /Christian

    4 Mal editiert, zuletzt von freet (3. April 2008 um 08:44)

  • Hallo,
    mitlerweile habe ich es anders gelöst.
    Ich benutze blat.exe (Kommando-Zeilenmailer). Das funktioniert sehr gut. Da ich die Funktion für Supportzwecke benutze habe ich unseren SMTP-Server fest eingetragen.
    Wenn man jetzt den SMTP-Server manuell eintragen kann, dann kann zum Beispiel der Nutzer des Tools seinen eigenen SMTP-Server eintragen. Dann funktioniert es sehr gut und ist sehr universell. Mit blat.exe ist es zudem möglich über eine simple BAT-Datei zu mailen oder aber es mit AutoIt und mit mehr Komfort zu machen.
    Zur Info wie der Ablauf jetzt gemacht wurde:
    - Tool fragt Daten ab wie Nutzername, email, Telefon, Fehlerbeschreibung usw. usw.
    - Tool erstellt ein Systemlog mit Daten die vom Support benötigt werden (Dienste, Treiber, Variablen usw. usw.)
    - Tool erstellt ZIP-Datei mit den Dateien die vom Support benötigt werden
    - Tool erstellt ein Mail und versendet es mit der blat.exe
    Da es aber sehr speziell auf unsere Software zugeschnitten ist, bringt das posten des Codes nicht sehr viel. Lediglich kleine Teile davon wären/sind von anderen nutzbar.

    Viele Grüsse
    HeiWoMa