Чем отличается работа с Outlook в Delphi от других почтовых клиентов? - PullRequest
1 голос
/ 20 октября 2011

Я создаю сообщение mapi в своем приложении Delphi, и пользователи затем просто отправляют сообщение в свой почтовый клиент mapi по умолчанию, то есть отформатированное сообщение появляется в их почтовом клиенте, и они нажимают «отправить».

Все прекрасно работает, когда клиентом электронной почты является Thunderbird или Outlook Express, но когда Outlook (2007), все более странно. Например, основное внимание уделяется Outlook, но пользователь не может закрыть окно Outlook, иногда пользователь даже не может использовать мышь в программе - стрелка исчезает в Outlook. Я вынужден закрыть приложение из диспетчера задач.

С моей точки зрения новичка, проблема заключается в управлении формами и фокусировке больше, чем на простом или расширенном mapi; последнее кажется неуместным в этом случае.

Кто-нибудь знает, что здесь происходит? И как я должен изменить свой код для решения этой проблемы?

Это код:

MapiMail1 := TMapiMail.Create(self);
try
  MapiMail1.Recipients.Add(MainGrid.AllCells[aCol, aRow]);
  MapiMail1.Subject := '';
  MapiMail1.Body := '';
  MapiMail1.EditDialog := True;
  MapiMail1.Send;
finally
  MapiMail1.Free;
end;

1 Ответ

3 голосов
/ 18 ноября 2011

Outlook прекрасно работает, используя OLE, а не MAPI.Попробуйте это:

USES OleCtrls, ComObj;

procedure TForm1.Button1Click(Sender: TObject);
const
  olMailItem = 0;
var
  Outlook: OLEVariant;
  MailItem: Variant;
  MailInspector : Variant;
  stringlist : TStringList;
begin
  try
   Outlook:=GetActiveOleObject('Outlook.Application') ;
  except
   Outlook:=CreateOleObject('Outlook.Application') ;
  end;
  try
    Stringlist := TStringList.Create;
    MailItem := Outlook.CreateItem(olMailItem) ;
    MailItem.Subject := 'subject here';
    MailItem.Recipients.Add('someone@yahoo.com');
    MailItem.Attachments.Add('c:\boot.ini');
    Stringlist := TStringList.Create;
    StringList.Add('body here');
    MailItem.Body := StringList.text;
    MailInspector := MailItem.GetInspector;
    MailInspector.display(true); //true means modal
  finally
    Outlook := Unassigned;
    StringList.Free;
  end;
end;
...