2016-08-09 61 views
1

Ich verwende OLE zum Senden von E-Mails über Outlook. Der Code Ich verwende ist:Senden von E-Mails über Outlook und OLE problemlos

procedure SendOutlookMail; 
const 
    olMailItem = 0; 
var 
    OKToUse: boolean; 
    Outlook: OleVariant; 
    vMailItem: variant; 
begin 
    OKToUse := false; 
    try 
    Outlook := GetActiveOleObject('Outlook.Application'); 
    OKToUse := true; 
    except 
    try 
     Outlook := CreateOleObject('Outlook.Application'); 
     OKToUse := true; 
    except 
     on e: exception do begin 
     ShowMessage(e.Message); 
     end; 
    end; 
    end; 

    if VarIsType(Outlook, varDispatch) then 
    ShowMessage('Outlook is varDispatch') 
    else 
    ShowMessage('Outlook is ***NOT*** varDispatch'); 

    if OKToUse then begin 
    vMailItem := Outlook.CreateItem(olMailItem); 
    vMailItem.Recipients.Add('[email protected]'); 
    vMailItem.Subject := 'What a wonderful test email'; 
    vMailItem.Body := 'This is a test --> how amazing'; 
    vMailItem.Send; 
    end; 

    VarClear(Outlook); 
end; 

die sich von ein paar verschiedenen SO Fragen schamlos geklaut wurde - Dank an alle.

Das Problem, das ich mit dem Code habe, ist, wenn Outlook auf dem PC installiert ist, aber geschlossen ist. Wenn Outlook geöffnet ist, erhalte ich ein Meldungsfeld mit der Nachricht "Outlook ist varDispatch" und eine E-Mail-Nachricht wird gesendet und empfangen. Wenn Outlook geschlossen ist, bekomme ich die gleiche Meldung "Outlook ist VarDispatch", aber dann "Ein Fehler ist in der Anwendung aufgetreten" und meine Anwendung schließt abrupt.

So zwei Fragen:

1) Wie kann ich erkennen, wenn Outlook ausgeführt wird? Die Tatsache, dass OKToUse auf wahr gesetzt wird, scheint nicht der richtige Weg zu sein.

2) Wie starte ich Outlook, wenn es nicht ausgeführt wird, und schließe es, nachdem eine E-Mail gesendet wurde?

Ich verwende Delphi 10.1 Berlin und zu versuchen, Outlook 2007

+1

Wenn 'GetActiveOleObject()' erfolgreich ist, es ist offensichtlich offen zu verbinden. Setzen Sie einen anderen 'Boolean', der dies anzeigt. Ansonsten, machen Sie es "Falsch". Wenn Sie 'CreateOleObject()' verwenden müssen, muss es geöffnet werden, und das scheint fehlzuschlagen. Müssen Sie vielleicht zuerst einige Eigenschaften festlegen, bevor Sie sie verwenden können? –

+2

Warum verwenden Sie nicht die COM-Server-Wrapper-Komponente? –

+0

Eine Down-Abstimmung? Wofür? Dieser Ort ist manchmal zu schwierig :( –

Antwort

5

Fügen Sie den folgenden vor dem Aufruf CreateItem

vNS := Outlook.GetNamespace('MAPI'); 
vNS.Logon;