Ver Mensaje Individual
  #5  
Antiguo 17-09-2007
Avatar de maxvera
maxvera maxvera is offline
Miembro
 
Registrado: jun 2006
Posts: 21
Reputación: 0
maxvera Va por buen camino
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);
//        FillChar(Receip, SizeOf(TMapiRecipDesc) * DireccionesCount, #0);
        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.
__________________
El colmo del inmovilismo es el 0 absoluto.
Responder Con Cita