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?
Mail mit MAPI versenden
-
- [ offen ]
-
HeiWoMa -
19. Oktober 2006 um 18:21 -
Geschlossen -
Erledigt
-
-
- Offizieller Beitrag
Hi,
wo wäre der Vorteil gegenüber _INetMail() ?
So long,
Mega
-
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. -
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. -
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 ;).
-
Hmmm...
da hast du auch wieder recht.
Wie könnte man es anders lösen? Eine idee? -
-
http://www.schul-office.de/clarion/clw_mapi.htm
Die EXE wäre genau das was ich brauchen könnte, dann muss ich nicht alles nachbauen und kann genau wie dort beschrieben damit arbeiten.
Ich habe aber leider keinen Kompiler um aus dem Code eine EXE zu erstellen.
Mit Google konnte ich die EXE nicht finden. -
- Offizieller Beitrag
Genau den Link hab ich auch gefunden und auch gepostet, dann aber wieder raus genommen, weil ich die Preisliste für Clarion gefunden hatte, die mir den Atem stocken ließ.
-
- Offizieller Beitrag
Sonst such dir doch ne mapi32.dll und leg sie zu deinem Programm und dann hast du eine definierte Version.
Oder ds hier: http://www.joester.de/index.php?option=com_content&task=category§ionid=4&id=15&Itemid=30
Mit dem:
http://www.joester.de/index.php?option=com_content&task=view&id=26&Itemid=30 -
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. -
Zitat
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.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()
EndIfFunc 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.
Somit ist man wohl für die meisten Fälle gerüstet, oder?
/Christian -
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.