Senden von Outlook-E-Mails mit Delphi

Oct 05 2020

Ich kann erfolgreich eine E-Mail von OLE zwischen Delphi 10.4 und Outlook 365 senden.

try
  Outlook:=GetActiveOleObject('Outlook.Application');
except
  Outlook:=CreateOleObject('Outlook.Application');
end;

try
  MailItem:= Outlook.CreateItem(olMailItem) ;

  SubjectLine:= 'Whatver';
  MailItem.Subject:= SubjectLine;

  EmailTo:= '[email protected]';
  MailItem.Recipients.Add(EmailTo);

  MailItem.BodyFormat := olFormatPlain;
  MailItem.GetInspector;

  Attachment:= 'C:\File.doc';
  MailItem.Attachments.Add(Attachment);

  MessageBodyStr:= 'Dear Friend';
  MailItem.Body:= MessageBodyStr;

  MailItem.Display(False);

finally
  Outlook := Unassigned;
end;

Das funktioniert gut. Ich würde es jedoch vorziehen, die E-Mail direkt zu senden, ohne den E-Mail-Editor anzuzeigen

Wenn ich das benutze

MailItem.Send;

Ich verstehe das

EOleSysError: The parameter is incorrect

Was ist los ? Wie kann ich den Editor überspringen und einfach die E-Mail senden? Irgendein Vorschlag ?

Vielen Dank

Antworten

2 fiveloop Oct 15 2020 at 19:26

Heute könnte dein Glückstag sein, Bob!

Ich verwalte eine Anwendung, die das Outlook-Objektmodell zum Senden von E-Mails verwendet. Der Code zum Senden der E-Mail ist seit mehreren Jahren unverändert, und Tausende von Benutzern haben ihn erfolgreich verwendet.

In den letzten Wochen haben einige dieser Benutzer ein Upgrade auf die neuesten Versionen von Office 365 durchgeführt und beim Aufruf von MailItem.Send genau den gleichen Fehler "Der Parameter ist falsch" festgestellt. Alle diese Benutzer hatten die gleichen Gemeinsamkeiten:

  1. Sie haben unsere Anwendung NICHT aktualisiert (sie verwenden immer noch dieselbe Version, die jahrelang einwandfrei funktioniert hat).
  2. Sie DID Office 365 aktualisieren.

Angesichts dieser beiden oben genannten Punkte muss kein Raketenwissenschaftler zu dem Schluss kommen, dass Microsoft in den neuesten Versionen von Office 365 etwas geändert haben muss und dass diese Änderung diesen Fehler verursacht.

Ich habe einen Fall mit dem Office 365-Supportteam von Microsoft eröffnet, und wie zu erwarten war, ging der Fall in Kreisen umher, ohne dass Microsoft irgendeine Lösung bereitstellte.

Das Dumme an der Fehlermeldung "Der Parameter ist falsch" ist, dass MailItem.Send keine Parameter akzeptiert!

Wie auch immer, ich habe das Office 365-Support-Team von Microsoft aufgegeben und angefangen, an dem Code herumzuspielen, der seit vielen Jahren nicht mehr geändert wurde.

Nach langem Basteln stellte ich fest, dass der Aufruf von MailItem.GetInspector aus einem unbekannten und nicht dokumentierten Grund den nachfolgenden Aufruf von MailItem.Send zu verursachen scheint, um den Fehler auszulösen. Als ich MailItem.GetInspector auskommentierte, funktionierte MailItem.Send einwandfrei und löste den Fehler nicht aus.

Das Auskommentieren von MailItem.GetInspector ist für mich jedoch keine langfristige Option, da ich den Inspector verwende, um mehrere Manipulationen am E-Mail-Text durchzuführen.

Also habe ich die Dokumente für das Inspector-Objekt gelesen und die Methode Close gefunden. Ich habe Inspector.Close nach den Manipulationen des E-Mail-Körpers und vor dem Aufruf von MailItem.Send einen Anruf hinzugefügt. Bingo! Das hat den Fehler behoben !!!!

Hier ist ein VBA-Beispielcode, der funktioniert. Ich habe es in Excel getestet.

Sub TestSendEmail()
    Dim app As Outlook.Application
    Dim nameSpace As Outlook.nameSpace
    Dim folder As Outlook.MAPIFolder
    Dim mailItem As Outlook.mailItem
    Dim insp As Outlook.Inspector
    Dim wordDocumentEditor As Word.Document
    
    On Error GoTo errorHandler
    Set app = New Outlook.Application
    Set nameSpace = app.GetNameSpace("MAPI")
    Set folder = nameSpace.GetDefaultFolder(Outlook.olFolderOutbox)
    Set mailItem = app.CreateItem(Outlook.olMailItem)
    mailItem.Subject = "Test Subject"
    mailItem.To = "[email protected]"
    Set insp = mailItem.GetInspector
    Set wordDocumentEditor = insp.WordEditor
    wordDocumentEditor.Range(0, 0).InsertBefore ("Test Body")
    insp.Close (olSave)
    MsgBox "Calling Send"
    mailItem.Send
    MsgBox "Send Complete"
Done:
    Exit Sub
errorHandler:
    MsgBox "The following error occurred: " & Err.Number & ": " & Err.Description
End Sub

Bob, bitte antworten Sie mir, um mich wissen zu lassen, ob Inspector.Close den Fehler für Sie behoben hat.