как SendMailMAPI корректируется для поддержки нескольких файловых вложений

У меня есть этот код, который отправляет всего одно вложение ко времени, как я могу скорректировать этот код для отправки 1-2 вложений?

function SendMailMAPI(const Subject, Body, FileName, SenderName, SenderEMail,
                  RecepientName, RecepientEMail: String) : Integer;
var
  message: TMapiMessage;
  lpSender,
  lpRecepient: TMapiRecipDesc;
  FileAttach: TMapiFileDesc;
  SM: TFNMapiSendMail;
  MAPIModule: HModule;
begin
  FillChar(message, SizeOf(message), 0);
  with message do
  begin
    if (Subject<>'') then
    begin
      lpszSubject := PChar(Subject)
    end;
    if (Body<>'') then
    begin
      lpszNoteText := PChar(Body)
    end;
    if (SenderEMail<>'') then
    begin
      lpSender.ulRecipClass := MAPI_ORIG;
      if (SenderName='') then
      begin
        lpSender.lpszName := PChar(SenderEMail)
      end
      else
      begin
        lpSender.lpszName := PChar(SenderName)
      end;
      lpSender.lpszAddress := PChar('SMTP:'+SenderEMail);
      lpSender.ulReserved := 0;
      lpSender.ulEIDSize := 0;
      lpSender.lpEntryID := nil;
      lpOriginator := @lpSender;
    end;
    if (RecepientEMail<>'') then
    begin
      lpRecepient.ulRecipClass := MAPI_TO;
      if (RecepientName='') then
      begin
        lpRecepient.lpszName := PChar(RecepientEMail)
      end
      else
      begin
        lpRecepient.lpszName := PChar(RecepientName)
      end;
      lpRecepient.lpszAddress := PChar('SMTP:'+RecepientEMail);
      lpRecepient.ulReserved := 0;
      lpRecepient.ulEIDSize := 0;
      lpRecepient.lpEntryID := nil;
      nRecipCount := 1;
      lpRecips := @lpRecepient;
    end
    else
    begin
      lpRecips := nil
    end;
    if (FileName='') then
    begin
      nFileCount := 0;
      lpFiles := nil;
    end
    else
    begin
      FillChar(FileAttach, SizeOf(FileAttach), 0);
      FileAttach.nPosition := Cardinal($FFFFFFFF);
      FileAttach.lpszPathName := PChar(FileName);
      nFileCount := 1;
      lpFiles := @FileAttach;
    end;
  end;
  MAPIModule := LoadLibrary(PChar(MAPIDLL));
  if MAPIModule=0 then
  begin
    Result := -1
  end
  else
  begin
    try
      @SM := GetProcAddress(MAPIModule, 'MAPISendMail');
      if @SM<>nil then
      begin
        Result := SM(0, Application.Handle, message, MAPI_DIALOG or
                     MAPI_LOGON_UI, 0);
      end
      else
      begin
        Result := 1
      end;

    finally
      FreeLibrary(MAPIModule);
    end;
  end;
  if Result<>0 then
  begin
    MessageDlg('Error sending mail ('+IntToStr(Result)+').', mtError, [mbOk],
               0)
  end;
end;
1
задан Tom 21 April 2010 в 13:04
поделиться

2 ответа

Вы можете настроить свой код для передачи имен файлов в качестве параметра открытого массива и аналогичным образом создать массив «MapiFileDesc» для передачи в MAPISendMail.

//function SendMailMAPI(const Subject, Body, FileName, SenderName, SenderEMail,
//                  RecepientName, RecepientEMail: String) : Integer;
function SendMailMAPI(const Subject, Body, SenderName, SenderEMail,
    RecepientName, RecepientEMail: String; FileNames: array of string) : Integer;
var
  ...
//  FileAttach: TMapiFileDesc;
  FileAttachments: array of TMapiFileDesc;
  FileAttach: PMapiFileDesc;
  i: Integer;
  ...
begin
  ...
  ...
    begin
      lpRecips := nil
    end;
//    if (FileName='') then
//    begin
//  ...
//  ...
//      lpFiles := @FileAttach;
//    end;
    nFileCount := High(FileNames) + 1;
    SetLength(FileAttachments, nFileCount);
    if nFileCount > 0 then
      lpFiles := @FileAttachments[0];
    for i := 0 to High(FileNames) do
    begin
      FileAttach := @FileAttachments[i];
      FillChar(FileAttach^, SizeOf(FileAttach^), 0);
      FileAttach.nPosition := $FFFFFFFF;
      FileAttach.lpszPathName := PChar(FileNames[i]);
    end;
  end;
  ...
  ...
1
ответ дан 3 September 2019 в 01:08
поделиться

Брайан Фрост объяснил здесь

1
ответ дан 3 September 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: