Самый простой способ составить почту Outlook 2010 из Delphi? - PullRequest
3 голосов
/ 02 февраля 2011

Некоторые из наших приложений, которые отлично работают с различными способами интеграции электронной почты, с использованием mailto:, имитированных «Отправить в ...» и SMTP в средах Windows 2000 и 2003, теперь переходят на новая система Windows 2008 с клиентами Exchange 2010 и Outlook 2010.

У нас есть один случай использования, когда приложение создает новую почту, устанавливает получателя (ей) и тему, добавляет одно или несколько вложений, а затем открывает его в почтовом клиенте по умолчанию, чтобы пользователь мог отредактировать его перед отправкой.

Знаете ли вы решение, которое работает в новой среде? Должны ли мы использовать стороннюю библиотеку? Или есть некоторый код автоматизации OLE, который, как известно, работает с использованием Outlook.Application?

Ответы [ 5 ]

7 голосов
/ 02 февраля 2011

Мы используем JclSimpleBringUpSendMailDialog из модуля jclMapi в библиотеке Jedi JCL .

Однажды у меня было приложение, в котором мы встроили пользовательскую опцию, чтобы указать, хотят ли они использовать SMTP или MAPI, а затем всевозможные настройки почтового сервера, но вызов библиотеки Jedi делает жизнь намного проще. Если конечные пользователи столкнулись с проблемой настройки всех своих настроек в клиенте MAPI, то почему они хотели бы снова настроить их в моем / нашем программном обеспечении.

Проблема с mailto: // заключается в том, что он часто недостаточно конфигурируем, или почтовый клиент не обрабатывает параметры одинаково / стандартным образом - тогда пользователи думают, что ваша программная ерунда, а не полагает, что у них есть хитрость почтовый клиент.

Итак, мы просто используем интерфейс MAPI. Легко.

1 голос
/ 02 февраля 2011

Я использую это устройство - это заслуга Брайана Давным-давно ...

unit UArtMAPI;


interface



procedure ArtMAPISendMail(
            const Subject, MessageText, MailFromName, MailFromAddress,
                  MailToName, MailToAddress: String;
            const AttachmentFileNames: array of String);


implementation



uses
  SysUtils,
  Windows,
  UArtLibrary,
  Dialogs,
  Forms,
  MAPI;

procedure ArtMAPISendMail(
            const Subject, MessageText, MailFromName, MailFromAddress,
                  MailToName, MailToAddress: String;
            const AttachmentFileNames: array of String);
//Originally by Brian Long: The Delphi Magazine issue 60 - Delphi And Email
var
  MAPIError: DWord;
  MapiMessage: TMapiMessage;
  Originator, Recipient: TMapiRecipDesc;
  Files, FilesTmp: PMapiFileDesc;
  FilesCount: Integer;
begin
   FillChar(MapiMessage, Sizeof(TMapiMessage), 0);

   MapiMessage.lpszSubject := PAnsiChar(AnsiString(Subject));
   MapiMessage.lpszNoteText := PAnsiChar(AnsiString(MessageText));

   FillChar(Originator, Sizeof(TMapiRecipDesc), 0);

   Originator.lpszName := PAnsiChar(AnsiString(MailFromName));
   Originator.lpszAddress := PAnsiChar(AnsiString(MailFromAddress));
//   MapiMessage.lpOriginator := @Originator;
   MapiMessage.lpOriginator := nil;


   MapiMessage.nRecipCount := 1;
   FillChar(Recipient, Sizeof(TMapiRecipDesc), 0);
   Recipient.ulRecipClass := MAPI_TO;
   Recipient.lpszName := PAnsiChar(AnsiString(MailToName));
   Recipient.lpszAddress := PAnsiChar(AnsiString(MailToAddress));
   MapiMessage.lpRecips := @Recipient;

   MapiMessage.nFileCount := High(AttachmentFileNames) - Low(AttachmentFileNames) + 1;
   Files := AllocMem(SizeOf(TMapiFileDesc) * MapiMessage.nFileCount);
   MapiMessage.lpFiles := Files;
   FilesTmp := Files;
   for FilesCount := Low(AttachmentFileNames) to High(AttachmentFileNames) do
   begin
     FilesTmp.nPosition := $FFFFFFFF;
     FilesTmp.lpszPathName := PAnsiChar(AnsiString(AttachmentFileNames[FilesCount]));
     Inc(FilesTmp)
   end;

   try
     MAPIError := MapiSendMail(
       0,
       Application.MainForm.Handle,
       MapiMessage,
       MAPI_LOGON_UI {or MAPI_NEW_SESSION},
       0);
   finally
     FreeMem(Files)
   end;

   case MAPIError of
     MAPI_E_AMBIGUOUS_RECIPIENT:
      Showmessage('A recipient matched more than one of the recipient descriptor structures and MAPI_DIALOG was not set. No message was sent.');
     MAPI_E_ATTACHMENT_NOT_FOUND:
      Showmessage('The specified attachment was not found; no message was sent.');
     MAPI_E_ATTACHMENT_OPEN_FAILURE:
      Showmessage('The specified attachment could not be opened; no message was sent.');
     MAPI_E_BAD_RECIPTYPE:
      Showmessage('The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC. No message was sent.');
     MAPI_E_FAILURE:
      Showmessage('One or more unspecified errors occurred; no message was sent.');
     MAPI_E_INSUFFICIENT_MEMORY:
      Showmessage('There was insufficient memory to proceed. No message was sent.');
     MAPI_E_LOGIN_FAILURE:
      Showmessage('There was no default logon, and the user failed to log on successfully when the logon dialog box was displayed. No message was sent.');
     MAPI_E_TEXT_TOO_LARGE:
      Showmessage('The text in the message was too large to sent; the message was not sent.');
     MAPI_E_TOO_MANY_FILES:
      Showmessage('There were too many file attachments; no message was sent.');
     MAPI_E_TOO_MANY_RECIPIENTS:
      Showmessage('There were too many recipients; no message was sent.');
     MAPI_E_UNKNOWN_RECIPIENT:
       Showmessage('A recipient did not appear in the address list; no message was sent.');
     MAPI_E_USER_ABORT:
       Showmessage('The user canceled the process; no message was sent.');
     SUCCESS_SUCCESS:
       Showmessage('MAPISendMail successfully sent the message.');
   else
     Showmessage('MAPISendMail failed with an unknown error code.');
   end;
end;




end.
0 голосов
/ 14 августа 2013

Может быть, это самый простой способ открыть окно электронной почты

System("mailto:someone@example.com?Subject=Hello%20again&body=your%20textBody%20here")
0 голосов
/ 02 февраля 2011

Я выкопал этот пример. Это с 2002 года, поэтому использует более старую версию Outlook, но идея должна быть такой же. Он использовался в приложении для отправки новым зарегистрированным пользователям их идентификатора пользователя и пароля (не начинайте с этого, это был просто способ ограничить доступ к сайту, ничего деликатного там нет). Сообщения сохраняются в папке «Исходящие», не открываются, но если вы перебираете OleServer и Outlook8 (число будет больше), вы должны найти способы открыть почту для внимания пользователя, а не сохранять ее прямо в папке «Исходящие». 1001 *

Вся объектная модель Outlook может быть найдена в msdn: http://msdn.microsoft.com/en-us/library/aa221870%28v=office.11%29.aspx

Другим хорошим источником информации об автоматизации Office являются страницы Деборы Пэйт: http://www.djpate.freeserve.co.uk/Automation.htm

function TStapWerkt_data.GenerateMailsOutlook(SendDBF: boolean): boolean;
var
  Outlook: TOutlookApplication;
  olNameSpace: NameSpace;
  MailIt: TMailItem;
  AttachedFile: OleVariant;
  i: integer;
  emailaddress: string;
begin
  Result := true;
  Outlook := TOutlookApplication.Create( nil );
  try
    Outlook.ConnectKind := ckNewInstance;
    try
      Outlook.Connect;
      try
        olNameSpace := Outlook.GetNamespace('MAPI');
        olNameSpace.Logon('', '', False, False);
        try

          if SendDBF then begin
            MailIt := TMailItem.Create( nil );
            MailIt.ConnectTo( Outlook.CreateItem( olMailItem ) as MailItem );
            try
              MailIt.Recipients.Add( 'info@bjmsoftware.com' );
              MailIt.Subject := 'StapWerk.dbf';
              MailIt.Body := 'Stap'#13#10;
              AttachedFile := IncludeTrailingBackslash( ExtractFilePath(
                  Stap_db.Stap_Database.DatabaseName ) ) + 'stapwerk.dbf';
              MailIt.Attachments.Add( AttachedFile, EmptyParam, EmptyParam, EmptyParam );
              MailIt.Save;
            finally
              MailIt.Free;
            end;
          end;

          for i := 0 to FNewUsers.Count - 1 do begin
            MailIt := TMailItem.Create( nil );
            MailIt.ConnectTo( Outlook.CreateItem( olMailItem ) as MailItem );
            try
              emailaddress := TStapper( FNewUsers.Items[i] ).Email;
              if emailaddress = '' then begin
                emailaddress := C_MailUnknownAddress;
              end;
              MailIt.Recipients.Add( emailaddress );
              MailIt.Subject := C_MailSubject;
              MailIt.Body := Format( C_MailBody,
                  [TStapper( FNewUsers.Items[i] ).UserId,
                  TStapper( FNewUsers.Items[i] ).Password] );
              MailIt.Save;
            finally
              MailIt.Free;
            end;
          end;

        finally
          olNameSpace.Logoff;
        end;
      finally
        Outlook.Disconnect;
        // We kunnen ondanks ckNewInstance quit niet gebruiken
        // Outlook lijkt de connectkind te negeren en hoe dan ook te koppelen
        // naar een bestaande instantie. En die gooi je dan dus ook dicht met quit.
//        Outlook.quit;
      end;
    finally
      Outlook.free;
    end;
  except
    on E: Exception do begin
      Result := false;
    end;
  end;
end;
0 голосов
/ 02 февраля 2011

Может быть это может быть полезно для вас. Но я не могу это проверить, потому что я пользователь Thunderbird.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...