Outlook + MAPI

wolf83
Дата: 07.06.2011 06:59:07
Доброго времени суток.

Хочу прикрутить простенькую отправку письма из своей программки когда то написанной на Delphi 7. В языке плохо ориентируюсь. В качестве почтового клиента по умолчанию стоит Outlook Express (у клиента на одной машине стоит Outlook Express, на другой MS Outlook). Хотелось бы чтобы код не зависел от почтового клиента. Письма простые, буквально пару строк (из шаблона будут браться), никаких аттачей. Пытался через Mapi сделать, нашел несклько вариантов кода, не один не срабатывает.. такое чуство что чего то не хватает. Пример:
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, StdCtrls, Buttons, MAPI;

procedure TForm1.Button1Click(Sender: TObject);
var
MM: TMapiMessage;
MR: TMapiRecipDesc;
begin
ZeroMemory(@MR, SizeOf(MR));
with MR do
begin
ulRecipClass := MAPI_TO;
lpszName := 'Exim';
lpszAddress := 'test@mail.ru';
end;
ZeroMemory(@MM, SizeOf(MM));
with MM do
begin
lpszSubject := 'Hello';
lpszNoteText := 'blablabla';
nRecipCount := 1;
lpRecips := @MR;
end;
MapiSendMail(0, Application.Handle, MM, MAPI_DIALOG or MAPI_LOGON_UI, 0);
end;

При выполнении ничего не происходит. Что я упустил, подскажите пожалуйста!
Extender
Дата: 07.06.2011 07:16:16
Лучше конечно юзать IdSMTP, но вот моя функция, она работает:

function TReportSender.SendLetter(FileName, RecipName, Address, Subject:
  string): string;
var
  MapiMessage: TMapiMessage;
  R: array[1..20] of TMapiRecipDesc;
  emails: array[1..20] of string;
  F: TMapiFileDesc;
  c: integer;
  MError: Cardinal;
begin
  if FMailParams.CBSMTP.Checked then
    Result := SendLetterSmtp(FileName, RecipName, Address, Subject)
  else
  begin
    with MapiMessage do
    begin
      ulReserved := 0;
      lpszSubject := PChar(Subject);
      lpszNoteText :=
        'Отчет подготовлен автоматически и вложен в письмо АРМом "Отчеты"';
      lpszMessageType := nil;
      lpszDateReceived := nil;
      lpszConversationID := nil;
      flFlags := 0;
      lpOriginator := nil;
      lpRecips := @R;
      nFileCount := 1;
      lpFiles := @F;
    end;
    c := 0;
    while Address <> '' do
    begin
      inc(c);
      with R[c] do
      begin
        ulReserved := 0;
        ulRecipClass := MAPI_TO;
        lpszName := PChar(RecipName);
        emails[c] := FirstWordEx(Address, [';', ' ', ',']);
        lpszAddress := PChar(emails[c]);
        ulEIDSize := 0;
        lpEntryID := nil;
      end;
    end;
    MapiMessage.nRecipCount := c;
    with F do
    begin
      ulReserved := 0;
      flFlags := 0;
      nPosition := $FFFFFFF;
      lpszPathName := PChar(FileName);
      lpszFileName := nil;
      lpFileType := nil;
    end;
    MError := MapiSendMail(0, Application.Handle, MapiMessage, 0, 0);
    Result := iif(MError <> 0, 'Ошибка при отправке почты, код:' + inttostr(MError), 'Успешно');
  end;
end;
Anatoly Podgoretsky
Дата: 07.06.2011 08:38:35
Outlook Express поддерживает только Simple MAPI
wolf83
Дата: 07.06.2011 08:50:43
вот я и хочу через Mapi сделать... мне нужно еще чтобы клиент открыв почтарь видел в Отправленных письма. А есть где нибудь совсем простой пример по Mapi, для чайников, с одним адресом, без аттача, просто чтоб хоть понять как оно работает, а то третий день бьюсь - кучу примеров попробовал - не один не срабатывает, знаю что косячу где то, но не понимаю где.
S.G.
Дата: 07.06.2011 09:43:55
wolf83 ,
Попробуй пример отсюда.
У меня работает.
wolf83
Дата: 07.06.2011 10:27:10
пробовал уже, у меня в
 
  dwRet := MapiLogon(Handle, 
    PChar(''), 
    PChar(''), 
    MAPI_LOGON_UI or MAPI_NEW_SESSION, 
    0, @MAPI_Session); 

никогда dwRet не равен SUCCESS_SUCCESS, а если эту проверку закоментить то дальше тоже не работает(((
S.G.
Дата: 07.06.2011 11:11:13
wolf83
пробовал уже, у меня в .. skip ..
никогда dwRet не равен SUCCESS_SUCCESS, а если эту проверку закоментить то дальше тоже не работает(((
Этот код вызывает тот мейл- клиент, который *по умолчанию*.
Попробуй зайти в настройки аутлук- экспресса, и сделай его клентом по умолчанию. (или убедись, что он действительно такой). КОгда на компе два клиента, каждый из них при старте проверяет, он ли есть клиент по умолчанию, и что там нажимает юзер, неизвестно :) Еще, сам клиент должен содержать необходимые настройки в себе, то есть уметь сам по себе отправлять письма.
Еще... можно инсталлировать Thunderburd Mоzilla, и попробовать отправить с ней.
Больше йдей пока нет :)
wolf83
Дата: 07.06.2011 12:22:20
клиент один - Outlook Express 6, у него галочка стоит - Использовать как почтовый клиент по умолчанию. А насчет умеет ли он см по себе письма отправлять, я не знаю даже.
Leo Pevzner
Дата: 07.06.2011 12:38:08
wolf83,

  ErrCode := MapiLogon(Handle, nil, nil, MAPI_USE_DEFAULT, 0, @FSession);
  if  ErrCode <> SUCCESS_SUCCESS then begin
    MessageDlg('Ошибка при инициализации MAPI: '+IntToStr(ErrCode),mtWarning,[mbOK],0);
    Exit;
  end;

Кстати говоря, есть в экспрессе такая бага, что он сносит модальность у окон при вызове MapiSendMail
Anatoly Podgoretsky
Дата: 07.06.2011 13:04:19
wolf83
А насчет умеет ли он см по себе письма отправлять, я не знаю даже.

Чтобы это значило?