Wysyłanie maila z wieloma załącznikami

0

Cześć.
Mam problem z wysyłaniem maila z wieloma załącznikami.
Jak wysyłam dwa załączniki - jeden pdf i ejden jpg, to nie ma problemu.
Ogólnie chcę wysyłać zawsze jednego pdfa i wiele jpgów (różną ilość).
Korzystam z biblioteki MAPI i mam następujący problem - faktycznie do poczty dodaje mi dobrą liczbę załączników, ale wszystkie jpgi są te same ;/
Używam Delphi XE2 i MS Outlook 6 do wysyłania.
Sprawdzałem to wysyłanie na wielu rozwiązaniach i na wszystkich mam to samo:
http://www.swissdelphicenter.ch/torry/showcode.php?id=1246
Jak wysłać maila z załącznikiem za pomocą MAPI
http://stackoverflow.com/questions/2683079/how-sendmailmapi-is-adjusted-to-support-multiple-file-attachments
http://stackoverflow.com/questions/1962765/how-can-a-delphi-program-send-an-email-with-attachments-via-the-default-e-mail-c/1962841#1962841
Wszystkie są do siebie podobne i każde dodaje mi ostatni z jpgów wielokrotnie ;/ A zmienna z nazwami ścieżek przekazywana do metody na pewno jest dobra.

0

Ja z MAPI nie mam doświadczenia. Jeżeli interesuje Ciebie rozwiązanie pod Synapse to mogę dać stary gotowy kod, który wysyłal e-maile z załacznikiem. Nie problem jest dodać kolejny. A jeżeli jednak wolisz koniecznie MAPI to być może ktoś inny doradzi Tobie tutaj coś co rozwiąże problem.

0

Niekoniecznie to musi być MAPI ;) Po prostu takie rozwiązanie znalazłem na necie i wydawało się najprostsze :P

2

Poprawione funkcja SendEMail teraz powinno działać:

function SendEMail(Handle: THandle; Mail: TStrings): Cardinal;
type
  TAttachAccessArray = array [0..0] of TMapiFileDesc;
  PAttachAccessArray = ^TAttachAccessArray;
var
  MapiMessage: TMapiMessage;

  Receip: TMapiRecipDesc;
  Attachments: PAttachAccessArray;
  AttachCount: Integer;
  i1: integer;
  FileName: string;
  MAPI_Session: Cardinal;
  WndList: Pointer;
begin
  result:= MapiLogon(Handle,
    PAnsiChar(''),
    PAnsiChar(''),
    MAPI_LOGON_UI or MAPI_NEW_SESSION,
    0, @MAPI_Session);

  if (result <> SUCCESS_SUCCESS) then
  begin
    MessageBox(Handle,
      PChar('Error while trying to send email'),
      PChar('Error'),
      MB_ICONERROR or MB_OK);
  end
  else
  begin
    FillChar(MapiMessage, SizeOf(MapiMessage), #0);
    Attachments := nil;
    FillChar(Receip, SizeOf(Receip), #0);

    if Mail.Values['to'] <> '' then
    begin
      Receip.ulReserved := 0;
      Receip.ulRecipClass := MAPI_TO;
      Receip.lpszName := PAnsiChar(AnsiString(Mail.Values['to']));
      Receip.lpszAddress := PAnsiChar(AnsiString('SMTP:' + Mail.Values['to']));
      Receip.ulEIDSize := 0;
      MapiMessage.nRecipCount := 1;
      MapiMessage.lpRecips := @Receip;
    end;

    AttachCount := 0;

    for i1 := 0 to MaxInt do
    begin
      if Mail.Values['attachment' + IntToStr(i1)] = '' then
        break;
      Inc(AttachCount);
    end;

    if AttachCount > 0 then
    begin
      GetMem(Attachments, SizeOf(TMapiFileDesc) * AttachCount);

      for i1 := 0 to AttachCount - 1 do
      begin
        FileName := Mail.Values['attachment' + IntToStr(i1)];
        Attachments[i1].ulReserved := 0;
        Attachments[i1].flFlags := 0;
        Attachments[i1].nPosition := ULONG($FFFFFFFF);
        Attachments[i1].lpszPathName := StrNew(PAnsiChar(AnsiString(FileName)));
        Attachments[i1].lpszFileName :=
          StrNew(PAnsiChar(AnsiString(ExtractFileName(FileName))));
        Attachments[i1].lpFileType := nil;
      end;

      MapiMessage.nFileCount := AttachCount;
      MapiMessage.lpFiles := PMapiFileDesc(Attachments);
    end;

    if Mail.Values['subject'] <> '' then
      MapiMessage.lpszSubject := PAnsiChar(AnsiString(Mail.Values['subject']));
    if Mail.Values['body'] <> '' then
      MapiMessage.lpszNoteText:= PAnsiChar(AnsiString(Mail.Values['body']));

    WndList := DisableTaskWindows(0);
    try
    Result := MapiSendMail(MAPI_Session, Handle,
      MapiMessage, MAPI_DIALOG, 0);
    finally
      EnableTaskWindows( WndList );
    end;

    for i1:= 0 to AttachCount - 1 do
    begin
      StrDispose(Attachments[i1].lpszPathName);
      StrDispose(Attachments[i1].lpszFileName);
    end;

    if Assigned(Attachments) then
      FreeMem(Attachments);

    MapiLogOff(MAPI_Session, Handle, 0, 0);
  end;
end;
0

Dzięki :D
Chodziło o to użycie metody StrNew :/ Bezsens...

1 użytkowników online, w tym zalogowanych: 0, gości: 1