#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;