Gracias David por tu respuesta.
He comprobado que la función hace su trabajo incluso sin el Receip['to'], pero siempre y cuando sólo haya una dirección de e-mail.
Si hay más de una, el cliente de correo me devuelve un error al intentar enviar el mensaje (con 'to' y sin 'to'). El error dice que no puede enviar a la dirección 'direcciondecorreo1;direcciondecorreo2;...;direcciondecorreoN'.
Es decir, parece como si interpretara la cadena de direcciones como una sola.
Aunque sigo pegao con el problema, me parece entender tras un análisis (?)que la función está preparada para un solo destinatario.
Esto me ha llevado a probarme (cual ciego, dando palos) y he desarrollado este nuevo código para la función:
Código Delphi
[-] function SendMail(Handle: THandle; Mail: TStrings): Cardinal;
type
TAttachAccessArray = array [0..0] of TMapiFileDesc;
PAttachAccessArray = ^TAttachAccessArray;
TDirecAccessArray = array [0..0] of TMapiRecipDesc;
PDirecAccessArray = ^TDirecAccessArray;
var
MapiMessage: TMapiMessage;
Receip: PDirecAccessArray;
Attachments: PAttachAccessArray;
AttachCount, DireccionesCount: Integer;
i1: integer;
FileName: string;
dwRet: Cardinal;
MAPI_Session: Cardinal;
WndList: Pointer;
begin
dwRet := MapiLogon(Handle,
PChar(''),
PChar(''),
MAPI_LOGON_UI or MAPI_NEW_SESSION,
0, @MAPI_Session);
if (dwRet <> 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;
Receip := nil;
DireccionesCount := 0;
for i1 := 0 to MaxInt do begin
if Mail.Values['bcc' + IntToStr(i1)] = ''
then Break;
Inc(DireccionesCount);
end;
if DireccionesCount > 0 then
begin
GetMem(Receip, SizeOf(TMapiRecipDesc) * DireccionesCount);
for i1 := 0 to DireccionesCount - 1 do begin
Receip[i1].ulReserved := 0;
Receip[i1].ulRecipClass := MAPI_BCC;
Receip[i1].lpszName := StrNew(PChar(Mail.Values['bcc' + IntToStr(i1)]));
Receip[i1].lpszAddress := StrNew(PChar('SMTP:' +
Mail.Values['bcc' + IntToStr(i1)]));
Receip[i1].ulEIDSize := 0;
end;
MapiMessage.nRecipCount := DireccionesCount;
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(PChar(FileName));
Attachments[i1].lpszFileName :=
StrNew(PChar(ExtractFileName(FileName)));
Attachments[i1].lpFileType := nil;
end;
MapiMessage.nFileCount := AttachCount;
MapiMessage.lpFiles := @Attachments^;
end;
if Mail.Values['subject'] <> ''
then MapiMessage.lpszSubject := StrNew(PChar(Mail.Values['subject']));
if Mail.Values['body'] <> ''
then MapiMessage.lpszNoteText := StrNew(PChar(Mail.Values['body']));
WndList := DisableTaskWindows(0);
try
Result := MapiSendMail(MAPI_Session, Handle,
MapiMessage, MAPI_DIALOG, 0);
finally
EnableTaskWindows(WndList);
end;
for i1 := 0 to DireccionesCount - 1 do
begin
if Assigned(Receip[i1].lpszAddress)
then StrDispose(Receip[i1].lpszAddress);
if Assigned(Receip[i1].lpszName)
then StrDispose(Receip[i1].lpszName);
end;
for i1 := 0 to AttachCount - 1 do
begin
StrDispose(Attachments[i1].lpszPathName);
StrDispose(Attachments[i1].lpszFileName);
end;
if Assigned(MapiMessage.lpszSubject)
then StrDispose(MapiMessage.lpszSubject);
if Assigned(MapiMessage.lpszNoteText)
then StrDispose(MapiMessage.lpszNoteText);
MapiLogOff(MAPI_Session, Handle, 0, 0);
end;
end;
Con el resultado bastante previsible de que, aunque recorre el código sin error, al final no hace nada. Y digo nada. No abre ni siquiera el cliente de correo.
En cuanto a la línea que está comentada, aclarar que con ella sí que generaba un error. La cambié por la inmediatamente superior (en otro memorable palo de ciego) y el error desapareció.
Lo dicho: estoy más pegao con este tema...
A ver si eres capaz de iluminarme como sueles.
Gracias y saludos.