Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Cообщение с помощью Simple MAPI, Ошибка в структуре получателей 
:(
    Опции темы
LionHeart
Дата 21.11.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 13.11.2007
Где: в Final Fantasy

Репутация: нет
Всего: нет



Приветствую.  smile 
Пытаюсь послать сообщение с помощью Simple MAPI.
Код

//Sending formed message
procedure TfrmMain.bbnSendMessageClick(Sender: TObject);
var
   senderInfo: TMAPIRecipDesc;
  mapiReceips: array of TMAPIRecipDesc;
    receipCnt: Word;
    mapiFiles: array of TMAPIFileDesc;
      fileCnt: Word;
  mapiMessage: TMAPIMessage;
  mapiSession: LongWord;
   mapiResult: LongWord;
            i: Word;

begin
  //Establishing connection
  mapiResult := MAPILogon(Application.Handle,PChar(''),PChar(''),MAPI_LOGON_UI or MAPI_NEW_SESSION,0,@mapiSession);
  if mapiResult <> SUCCESS_SUCCESS then
    raise Exception.Create('Unable to establish connection. ERROR #' + IntToStr(mapiResult));


  //Filling in the array of recepients  
  receipCnt := lbxRecepients.Count;
  if receipCnt <> 0 then
    begin
      SetLength(mapiReceips,receipCnt);
      FillChar(mapiReceips[0],receipCnt * SizeOf(TMAPIRecipDesc),#0);

      for i := 0 to (receipCnt - 1) do
        with mapiReceips[i] do
          begin
            ulRecipClass := MAPI_TO;
            lpszName     := PChar(lbxRecepients.Items.Strings[i]);
            lpszAddress  := PChar('SMTP: ' + lbxRecepients.Items.Strings[i]);
          end;
    end
  else
    raise Exception.Create('No recepients added');


  //Filling in the array of files
  fileCnt := lbxEmbeddedFiles.Count;
  if fileCnt <> 0 then
    begin
      SetLength(mapiFiles,fileCnt);
      FillChar(mapiFiles[0],fileCnt * SizeOf(TMAPIFileDesc),#0);

      for i := 0 to (fileCnt - 1) do
        with mapiFiles[i] do
          begin
            nPosition    := 1;
            lpszPathName := PChar(lbxEmbeddedFiles.Items.Objects[i]);
            lpszFileName := PChar(ExtractFileName(lpszPathName));
            lpFileType   := PChar(ExtractFileExt(lpszPathName));
          end;
    end;


  //Filling in originator structure
  FillChar(senderInfo,SizeOf(TMAPIRecipDesc),#0);
  with senderInfo do
    begin
      ulRecipClass := MAPI_ORIG;
      lpszName := PChar(edtSenderName.Text);
    end;


  //Filling in the message structure
  FillChar(MAPIMessage,SizeOf(MAPIMessage),#0);
  with MAPIMessage do
    begin
      lpOriginator := @senderInfo;
      lpszSubject  := PChar(edtSubject.Text);
      lpszNoteText := PChar(memContent.Lines.Text);
      nRecipCount  := receipCnt;
      lpRecips     := @mapiReceips;
      nFileCount   := fileCnt;
      lpFiles      := @mapiFiles;
    end;


  //Sending message
  mapiResult := MapiSendMail(mapiSession,frmMain.Handle,MAPIMessage,MAPI_LOGON_UI or MAPI_NEW_SESSION,0);
  if mapiResult <> SUCCESS_SUCCESS then
    raise Exception.Create('Unable to send mail. ERROR #' + IntToStr(mapiResult));


  //Releasing connection
  mapiResult := MAPILogoff(mapiSession,Application.Handle,0,0);
  if mapiResult <> SUCCESS_SUCCESS then
    raise Exception.Create('Unable to release connection. ERROR #' + IntToStr(mapiResult));
end;

Он мне выдает код ошибки #15,что означает:
Цитата

MAPI_E_BAD_RECIPTYPE 
The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC. No message was sent.

Я же вроде верно указал все... В чем тогда проблема?  smile 


PM   Вверх
Rennigth
Дата 21.11.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 8
Всего: 76



LionHeart, 
Лень смотреть что конкретно у тебя не так, вот просто выдрал из рабочего компонента, посмотри что не так:
Код

var
  MapiMessage: TMapiMessage;
  MError: Cardinal;
  Sender: TMapiRecipDesc;
  PRecip, Recipients: PMapiRecipDesc;
  PFiles, Attachments: PMapiFileDesc;
  i: Integer;
  AppHandle: THandle;
  lRegistry: TRegistry;
  lMailDefault : string;
begin
  { Íàì íóæíî çàðåçåðâèðîâàòü ïàìÿòü äëÿ âñåõ ïîëó÷àòåëåé }
  MapiMessage.nRecipCount := FTOAdr.Count + FCCAdr.Count + FBCCAdr.Count;
  GetMem(Recipients, MapiMessage.nRecipCount * sizeof(TMapiRecipDesc));

  try
    with MapiMessage do
    begin
      ulReserved := 0;
      { Óñòàíàâëèâàåì ïîëå Subject: }
      lpszSubject := PChar(Self.FSubject);

      { ...  Body: }
      lpszNoteText := PChar(FMailText);

      lpszMessageType := nil;
      lpszDateReceived := nil;
      lpszConversationID := nil;
      flFlags := 0;

      { è îòïðàâèòåëÿ: (MAPI_ORIG) }
      Sender.ulReserved := 0;
      Sender.ulRecipClass := MAPI_ORIG;
      Sender.lpszName := PChar(FromName);
      Sender.lpszAddress := PChar(FromAdress);
      Sender.ulEIDSize := 0;
      Sender.lpEntryID := nil;
      lpOriginator := @Sender;

      PRecip := Recipients;

      { Ó íàñ ìíîãî ïîëó÷àòåëåé ïèñüìà: (MAPI_TO)
        óñòàíîâèì äëÿ êàæäîãî: }
      if nRecipCount > 0 then
      begin
        for i := 1 to FTOAdr.Count do
        begin
          PRecip^.ulReserved := 0;
          PRecip^.ulRecipClass := MAPI_TO;
          { lpszName should carry the Name like in the
            contacts or the adress book, I will take the
            email adress to keep it short: }
          PRecip^.lpszName := PChar(FTOAdr.Strings[i - 1]);

          { Åñëè Âû èñïîëüçóåòå ýòîò êîìïîíåíò ñîâìåñòíî ñ Outlook97 èëè 2000
            (íå Express âåðñèè) , òî Âàì ïðèéä¸òñÿ äîáàâèòü
            'SMTP:' â íà÷àëî êàæäîãî (email-) àäðåñà.
          }
            lRegistry := nil;
          try
            lRegistry := TRegistry.Create(KEY_READ);
            lRegistry.RootKey := hkey_local_machine;
            lRegistry.OpenKeyReadOnly('SOFTWARE\Clients\Mail');
            lMailDefault := lRegistry.ReadString('');
            lRegistry.CloseKey;
          finally
            lRegistry.Free;
          end;

          if lMailDefault = 'Mozilla Thunderbird' then
          begin
            PRecip^.lpszAddress := PChar(FTOAdr.Strings[i - 1]);
            PRecip^.ulEIDSize := 0;
            PRecip^.lpEntryID := nil;
            Inc(PRecip);
          end else begin
            PRecip^.lpszAddress := PChar('SMTP:' + FTOAdr.Strings[i - 1]);
            PRecip^.ulEIDSize := 0;
            PRecip^.lpEntryID := nil;
            Inc(PRecip);
          end;

        end;

        { Òî æå ñàìîå ïðîäåëûâàåì ñ ïîëó÷àòåëÿìè êîïèè ïèñüìà: (CC, MAPI_CC) }
        for i := 1 to FCCAdr.Count do
        begin
          PRecip^.ulReserved := 0;
          PRecip^.ulRecipClass := MAPI_CC;
          PRecip^.lpszName := PChar(FCCAdr.Strings[i - 1]);
          PRecip^.lpszAddress := PChar('SMTP:' + FCCAdr.Strings[i - 1]);
          PRecip^.ulEIDSize := 0;
          PRecip^.lpEntryID := nil;
          Inc(PRecip);
        end;

        { ... òîæå ñàìîå äëÿ Bcc: (BCC, MAPI_BCC) }
        for i := 1 to FBCCAdr.Count do
        begin
          PRecip^.ulReserved := 0;
          PRecip^.ulRecipClass := MAPI_BCC;
          PRecip^.lpszName := PChar(FBCCAdr.Strings[i - 1]);
          PRecip^.lpszAddress := PChar('SMTP:' + FBCCAdr.Strings[i - 1]);
          PRecip^.ulEIDSize := 0;
          PRecip^.lpEntryID := nil;
          Inc(PRecip);
        end;
      end;
      lpRecips := Recipients;

      { Òåïåðü îáðàáîòàåì ïðèêðåïë¸ííûå ê ïèñüìó ôàéëû: }

      if FAttachedFileName.Count > 0 then
      begin
        nFileCount := FAttachedFileName.Count;
        GetMem(Attachments, MapiMessage.nFileCount * sizeof(TMapiFileDesc));

        PFiles := Attachments;

        { Âî ïåðâûõ óñòàíîâèì îòîáðàæàåìûå íà ýêðàíå èìåíà ôàéëîâ (áåç ïóòè): }
        FDisplayFileName.Clear;
        for i := 0 to FAttachedFileName.Count - 1 do
          FDisplayFileName.Add(ExtractFileName(FAttachedFileName[i]));

        if nFileCount > 0 then
        begin
          { Òåïåðü ñîñòàâèì ñòðóêòóðêó äëÿ ïðèêðåïë¸ííîãî ôàéëà: }
          for i := 1 to FAttachedFileName.Count do
          begin
            { Óñòàíàâëèâàåì ïîëíûé ïóòü }
            Attachments^.lpszPathName := PChar(FAttachedFileName.Strings[i - 1]);
            { ... è èìÿ, îòîáðàæàåìîå íà äèñïëåå: }
            Attachments^.lpszFileName := PChar(FDisplayFileName.Strings[i - 1]);
            Attachments^.ulReserved := 0;
            Attachments^.flFlags := 0;
            { Ïîëîæåíèå äîëæíî áûòü -1, çà ðàçüÿñíåíèÿìè îáðàùàéòåñü â WinApi Help. }
            Attachments^.nPosition := Cardinal(-1);
            Attachments^.lpFileType := nil;
            Inc(Attachments);
          end;
        end;
        lpFiles := PFiles;
      end
      else
      begin
        nFileCount := 0;
        lpFiles := nil;
      end;
    end;

    { Send the Mail, silent or verbose:
      Verbose means in Express a Mail is composed and shown as setup.
      In non-Express versions we show the Login-Dialog for a new
      session and after we have choosen the profile to use, the
      composed email is shown before sending

      Silent does currently not work for non-Express version. We have
      no Session, no Login Dialog so the system refuses to compose a
      new email. In Express Versions the email is sent in the
      background.
     }
    if FShowDialog then
      MError := MapiSendMail(0, GetForegroundWindow, MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0)
    else
      MError := MapiSendMail(0, GetForegroundWindow, MapiMessage, 0, 0);

    { Òåïåðü îáðàáîòàåì ñîîáùåíèÿ îá îøèáêàõ.  MAPI èõ ïðèñóòñòâóåò äîñòàòî÷íîå.
      êîëè÷åñòâî.  ýòîì ïðèìåðå ÿ îáðàáàòûâàþ òîëüêî äâà èç íèõ: USER_ABORT è SUCCESS,
      îòíîñÿùèåñÿ ê ñïåöèàëüíûì.

      Ñîîáùåíèÿ, íå îòíîñÿùèåñÿ ê ñïåöèàëüíûì:
      MAPI_E_AMBIGUOUS_RECIPIENT,
        MAPI_E_ATTACHMENT_NOT_FOUND,
        MAPI_E_ATTACHMENT_OPEN_FAILURE,
        MAPI_E_BAD_RECIPTYPE,
        MAPI_E_FAILURE,
        MAPI_E_INSUFFICIENT_MEMORY,
        MAPI_E_LOGIN_FAILURE,
        MAPI_E_TEXT_TOO_LARGE,
        MAPI_E_TOO_MANY_FILES,
        MAPI_E_TOO_MANY_RECIPIENTS,
        MAPI_E_UNKNOWN_RECIPIENT:
    }

    case MError of
      MAPI_E_USER_ABORT:
        begin
          if Assigned(FOnUserAbort) then
            FOnUserAbort(Self);
        end;
      SUCCESS_SUCCESS:
        begin
          if Assigned(FOnSuccess) then
            FOnSuccess(Self);
        end
    else begin
        if Assigned(FOnMapiError) then
          FOnMapiError(Self, MError);
      end;

    end;
  finally
    {  çàêëþ÷åíèå îñâîáîæäàåì ïàìÿòü }
    FreeMem(Recipients, MapiMessage.nRecipCount * sizeof(TMapiRecipDesc));
  end;




--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
LionHeart
Дата 21.11.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 13.11.2007
Где: в Final Fantasy

Репутация: нет
Всего: нет



Незнаю,не получается.
Та же ошибка...

Это сообщение отредактировал(а) LionHeart - 21.11.2007, 16:46
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.