通过Outlook和OLE稳健地发送电子邮件

Mic*_*ent 2 delphi outlook ole

我正在使用OLE通过Outlook发送电子邮件.我使用的代码是:

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('mike@example.com');
    vMailItem.Subject := 'What a wonderful test email';
    vMailItem.Body := 'This is a test --> how amazing';
    vMailItem.Send;
  end;

  VarClear(Outlook);
end;
Run Code Online (Sandbox Code Playgroud)

从几个不同的SO问题中得到了毫不掩饰的感谢 - 感谢所有人.

我在代码中遇到的问题是在PC上安装Outlook时,但是已关闭.当Outlook打开时,我收到一个消息框,说"Outlook是varDispatch",并发送和接收邮件消息.当Outlook关闭时,我得到相同的消息框"Outlook is varDispatch",但随后"应用程序中发生错误",我的应用程序突然关闭.

所以有两个问题:

1)如何检测Outlook是否正在运行?OKToUse设置为true的事实似乎不是正确的方法.

2)如果Outlook未运行,如何启动Outlook并在发送电子邮件后将其关闭?

我正在使用Delphi 10.1 Berlin并尝试连接到Outlook 2007.

Dmi*_*nko 6

在调用CreateItem之前添加以下内容

vNS := Outlook.GetNamespace('MAPI');
vNS.Logon;
Run Code Online (Sandbox Code Playgroud)