使用Delphi发送Outlook电子邮件

时间:2020-10-05 17:23:59

标签: delphi outlook

我可以在DELPHI 10.4和Outlook 365之间通过OLE成功发送电子邮件。

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

try
  MailItem:= Outlook.CreateItem(olMailItem) ;

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

  EmailTo:= 'somebody@somewhere.com';
  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;

这很好。 但我希望直接发送电子邮件而不显示电子邮件编辑器

当我使用这个

MailItem.Send;

我明白了

EOleSysError: The parameter is incorrect

怎么了? 如何跳过编辑器而只发送电子邮件? 有什么建议吗?

谢谢

1 个答案:

答案 0 :(得分:2)

今天可能是您的幸运日,鲍勃!

我维护了一个使用Outlook对象模型发送电子邮件的应用程序。发送电子邮件的代码几年来一直没有变化,成千上万的用户已成功使用它。

在过去的几周中,其中一些用户已升级到Office 365的最新版本,并在调用MailItem.Send时开始遇到完全相同的“参数不正确”错误。所有这些用户的共同点是相同的:

  1. 他们没有升级我们的应用程序(它们仍在运行可以正常使用多年的相同版本)
  2. 他们 DID 升级了Office 365。

鉴于以上两点,并不需要火箭科学家得出结论,Microsoft必须在最新版本的Office 365中进行了某些更改,并且该更改导致了此错误。

我与Microsoft的Office 365支持团队一起开了个案,并且可以预见,此案四处走动,而Microsoft没有提供任何解决方案。

关于错误消息“参数不正确”的愚蠢之处在于MailItem.Send没有任何参数!

无论如何,我放弃了Microsoft的Office 365支持团队,开始摆弄代码,多年来一直没有更改。

经过大量修改后,我发现由于某些未知和未记录的原因,对MailItem.GetInspector的调用似乎导致了对MailItem.Send的后续调用引发了错误。当我注释掉MailItem.GetInspector时,MailItem.Send正常工作,并且没有引发错误。

但是对我来说,注释掉MailItem.GetInspector并不是一个长期的选择,因为我使用Inspector对电子邮件正文进行了几种操作。

因此,我阅读了Inspector对象的文档,并找到了Close方法。在电子邮件正文操作之后和MailItem.Send调用之前,我添加了对Inspector.Close的调用。答对了!修复了错误!!!

这是一些有效的VBA示例代码。我在Excel中对其进行了测试。

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 = "joe.kelly@binarystream.com"
    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

鲍勃,请回覆告诉我Inspector。关闭为您修复了错误。