Автоматизация отправки электронных писем через Outlook: решение на Delphi 2006 BDS
Вопрос пользователя связан с автоматизацией отправки электронных писем через Outlook в приложении на Delphi 2006 BDS. Пользователь пытается определить, было ли письмо отправлено, и если да, то получить доступ к телу письма. В процессе была попытка использовать свойство Sent объекта письма, что привело к ошибке, поскольку письмо перемещается в папку "Отправленные".
Решение проблемы
Для решения проблемы необходимо использовать событие Send объекта письма. Это требует использования ранней связи (early binding), для чего нужно добавить один из файлов outlook*.pas в папку ..\OCX\Servers RAD Studio и использовать в разделе uses соответствующий модуль.
Пример кода с использованием ранней связи:
uses
..., outlook2000;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
OutlookApplication: TOutlookApplication;
procedure OnMailSend(Sender: TObject; var Cancel: WordBool);
end;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
OutlookApplication := TOutlookApplication.Create(Self);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
MailItem: _MailItem;
Mail: TMailItem;
begin
MailItem := OutlookApplication.CreateItem(olMailItem) as _MailItem;
...
Mail := TMailItem.Create(nil);
try
Mail.ConnectTo(MailItem);
Mail.OnSend := OnMailSend;
...
finally
Mail.Free;
end;
end;
procedure TForm1.OnMailSend(Sender: TObject; var Cancel: WordBool);
begin
ShowMessage((Sender as TMailItem).Body);
end;
Если использовать позднюю связь (late binding), то потребуется выполнить дополнительную работу, которую обычно выполняет импортированный обертка. Пример кода с поздней связью:
uses
comobj;
...
type
TForm1 = class(TForm, IDispatch)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FCookie: Integer;
FMailItem: OleVariant;
procedure MailSent;
...
end;
...
procedure TForm1.Button1Click(Sender: TObject);
var
Outlook: OleVariant;
...
begin
Outlook := CreateOleObject('Outlook.Application');
FMailItem := Outlook.CreateItem(olMailItem);
...
if Supports(FMailItem, IConnectionPointContainer, CPContainer) then begin
CPContainer.FindConnectionPoint(DIID_ItemEvents, ConnectionPoint);
if Assigned(ConnectionPoint) then
ConnectionPoint.Advise(Self, FCookie);
end;
...
FMailItem.Display(True);
...
if Assigned(ConnectionPoint) then begin
ConnectionPoint.Unadvise(FCookie);
ConnectionPoint := nil;
end;
...
end;
procedure TForm1.MailSent;
begin
ShowMessage(FMailItem.Body);
end;
Альтернативное решение
Пользователь также предложил альтернативное решение на VBA, которое использует обработку ошибок для определения, было ли письмо отправлено:
Public Sub SendEmail()
On Error GoTo ErrorHandler
...
Do
...
If .Saved Then
MsgBox "Your email was saved, but not sent."
Else
MsgBox "Your email was not sent."
End If
Loop While Not objMailItem.Sent
...
Exit Sub
ErrorHandler:
Select Case Err.DESCRIPTION
Case "The item has been moved or deleted.":
' Email was sent, clean up and exit.
Case Else
Err.Raise Err.Number, Err.Source, Err.DESCRIPTION, Err.HelpFile, Err.HelpContext
End Select
End Sub
Подведение итогов
Для автоматизации отправки электронных писем через Outlook в приложении на Delphi 2006 BDS необходимо использовать событие Send объекта письма. Это можно реализовать как с помощью ранней связи, так и с помощью поздней связи, но в случае с поздней связью потребуется больше кода для установки и обработки события. Альтернативное решение на VBA также может быть полезным, но оно предполагает взаимодействие с пользователем и ожидание его действий.
Вопрос пользователя касается автоматизации процесса отправки электронных писем через Outlook в приложении, написанном на Delphi 2006 BDS, с использованием ранней или поздней связи для определения факта отправки письма и доступа к его тексту.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.