ошибка delphi MS Office Outlook

#delphi #outlook #ole

#delphi #outlook #ole

Вопрос:

Я пытаюсь отправить почту через мое приложение, разработанное в BDS 2006, через MS Office Outlook. Это работает абсолютно нормально при запущенном моем Outlook, но происходит сбой в try блоке, если Outlook закрыт.

Отображается ошибка EOlesystem error : Operation unavailable и не переходит в Except блокировку

мой код

  procedure TMyform.BTN_mailClick(Sender: TObject);
 const
    olMailItem =0;
 var
    Outlook: OleVariant;
    vMailItem: variant;
 begin
  try
   Outlook := GetActiveOleObject('Outlook.Application');
  except
   Outlook := CreateOleObject('Outlook.Application');
  end;
  vMailItem := Outlook.CreateItem(olMailItem);
  vMailItem.Recipients.Add(mailaddress);
  vMailItem.Subject := 'mymail';
  vMailItem.Body := 'Dear '
  vMailItem.Attachments.Add(path);
  vMailItem.Send;
  VarClear(Outlook);
 end;
  

Как я могу это преодолеть?

Спасибо

Ответ №1:

Она должна перейти в блок except. Вы установили там точку останова для проверки?

Но, тем не менее, вы можете предотвратить возникновение исключения:

 var
  Outlook: OleVariant;
  ClassID: TCLSID;
  Unknown: IUnknown;
begin
  if Succeeded(GetActiveObject(ClassID, nil, Unknown)) then
    OleCheck(Unknown.QueryInterface(IDispatch, Outlook)) else
    Outlook := CreateOleObject('Outlook.Application');
{ ... }
  

Комментарии:

1. безуспешно, та же ошибка в vMailItem.Recipients.Add(mailaddress); except блоке это происходит только после того, как я нажимаю break на ту же ошибку, сгенерированную в try во время отладки, но снова завершается неудачей vMailItem.Recipients.Add(mailaddress); . Но при использовании приложения ошибка генерируется в try блоке и дальше не идет.

Ответ №2:

У меня была та же проблема. Но недавно я нашел обходной путь. Вместо добавления нескольких адресов электронной почты с использованием «vMailItem.Recipients.Добавить (почтовый адрес);«, я использовал «vMailItem.Кому:= ‘mailID’;«. Я надеюсь, что это поможет вам.

Вот пример:

 procedure TForm1.SendMailClick(Sender: TObject);
const olMailItem = $00000000;
Var
  Outlook: OleVariant;
  Mail: Variant;
begin
  try
    try
      Outlook := GetActiveOleObject('Outlook.Application');
    except
      Outlook := CreateOleObject('Outlook.Application');
    end;
    Mail := Outlook.CreateItem(olMailItem);

    Mail.To := 'receiver1@xyz.com'   ';'   'receiver2@xyz.com';

    Mail.Subject := 'your subject';

    Mail.Display; //Mail.Send; if you want to send directly

  Except
    on E : Exception do
      ShowMessage(E.ClassName ' error raised, with message : ' E.Message);
  End;
end;