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
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...