2011-02-02 2 views
3

Некоторые из наших приложений, которые отлично работают с различными способами интеграции электронной почты, используя mailto:, simulated "Send To..." и SMTP в средах Windows 2000 и 2003, теперь перейдут на новую систему Windows 2008 с клиентами Exchange 2010 и Outlook 2010.Самый простой способ составить почту Outlook 2010 из Delphi?

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

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

+0

Есть причина, почему вы не делаете хотите, чтобы приложение обрабатывало редактирование пользователем перед отправкой сообщения с помощью SMTP? Если вам не нужны все причудливые вещи, которые Outlook предоставляет при редактировании сообщения, вероятно, это было бы очень симплеерное решение? –

+0

Требуются возможности редактирования почтового клиента Outlook, например, добавление адресов электронной почты из адресной книги. Мы еще не используем интеграцию LDAP/AD. – mjn

ответ

7

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

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

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

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

+1

Это выглядит великолепно, это было бы моим любимым решением. Благодаря! и +1 – mjn

+0

Я пробовал его с текущим выпуском JCL и получал ошибки, описанные выше. – mjn

+0

Хм. Не знаю. Хорошо работает для нас в обычных клиентских сценариях и выглядит нормально на удаленном рабочем столе сервера 2003 года. Никто не сообщил, что он не работает, но я подозреваю, что он не используется массово. Сообщение об ошибке, которое вы указали, упоминает dhcpsvc.dll - возможно, существует какая-то проблема с разрешением имен. В стороне - мой код имеет вызов jcl, завернутый в try ... кроме того, что ничего не делает (!) С комментарием, говорящим, что JCL обычно вызывает собственный диалог ошибок. Таким образом, кажется, что исключения должны обрабатываться нормально. Возможно, это проблема с разрешениями для TS. – shunty

0

Может быть this can be useful for you. Но я не могу проверить это, потому что я являюсь пользователем Thunderbird.

+0

У меня уже был этот фрагмент кода и уже пробовал этот код в системе разработки Windows 7 с установленным Outlook 2010. Он провалился с сообщением об ошибке, которое я опубликую здесь позже.В любом случае спасибо за ссылку, это может помочь другим (и я также попробую его в системе Windows 2003) – mjn

+0

Хм, в этом случае это не может быть полезно, если есть хотя бы одно исключение. –

+0

Как я могу видеть из кода, он отправляет сообщение - нам нужен способ сначала отобразить редактор сообщений, чтобы пользователь мог сначала изменить тело, получателей и т. Д. Перед отправкой. ... mabe Метод Save является обходным путем, но пользователю нужно открыть Outlook и вручную перейти к папке проекта. – mjn

0

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

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

Другим хорошим источником информации о автоматизации Office являются страницы Деборы Pate в: 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('[email protected]'); 
       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; 
1

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

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

Из кода я не вижу, отправляет ли он или показывает черновик в Outlook? ... И для чего предназначена единица UArtLibrary? – mjn

-1

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

System("mailto:[email protected]?Subject=Hello%20again&body=your%20textBody%20here") 
+0

Это не файл вложений, как требуется в вопросе: * ", добавляет одно или несколько вложений ..." * – mjn

+0

Самый простой способ не может решить все проблемы – rodolfoprado

Смежные вопросы