Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Guardar un correo electronio en disco con MAPI (https://www.clubdelphi.com/foros/showthread.php?t=44633)

adebonis 11-06-2007 20:31:57

Guardar un correo electronio en disco con MAPI
 
Hola.

Estoy utilizando MAPI para enviar correos electrónicos sin ningún problema. Lo que ahora necesito es guardar el correo electrónico en disco (con la extensión .msg).

¿Se sabe cómo se puede realizar esto?

Saludos
Adolfo Bonis
Barcelona

cHackAll 16-06-2007 21:59:21

Mmmm....
 
mapi? que componente especificamente? o simplemente un "uses Mapi;" y si es así, me imagino que envias usando primero la API MAPILogon, y luego con la MAPISendMail... en tal caso tienes la estructura TMapiMessage que apunta al lpszNoteText a un texto que es el cuerpo que envías...

En tal caso puedes hacer lo siguiente (con APIs), al enviarse exitosamente:
Código Delphi [-]
var hFile, Dummy: Cardinal;
...
 hFile := CreateFile('sent007.msg', GENERIC_WRITE, 0, nil, CREATE_NEW, 0, 0);
 WriteFile(hFile, TMapiMessage.lpszNoteText^, StrLen(TMapiMessage.lpszNoteText), dummy, nil);
 CloseHandle(hFile);
...

Claro que TMapiMessage será el nombre de la estructura que utilices...

Espero sea lo que buscas, si no peganos un poco del código previo al evío del mail.
Un saludo!

adebonis 18-06-2007 17:50:33

Hola.

Correcto, no utilizo ningún componente, sólo coloco en el uses el MAPI. DE heco lo que me interesaba es guardar en disco la estructura del mensaje. Lo mismo que hacen los clientes de correo al utilizar la opción del menú "Guardar como..." (outlook lo guarda con extensión .msg, Outollok Express con extensión .eml, etc.). Pero me parece que no existe ninguna función en MAPI que realice esto.

Estoy utilizando esta función.

Código Delphi [-]
function SendEMailMAPI(Handle: THandle; Mail: TStrings; Ver: Boolean): Cardinal;
type
  TAttachAccessArray = array [0..0] of TMapiFileDesc;
  PAttachAccessArray = ^TAttachAccessArray;
var
  MapiMessage: TMapiMessage;
  Receip: TMapiRecipDesc;
  Attachments: PAttachAccessArray;
  AttachCount: 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 Al intentar mandar el 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 := StrNew(PChar(Mail.Values['to']));
      Receip.lpszAddress := StrNew(PChar('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(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
    if Ver then
      Result := MapiSendMail(Mapi_Session, Handle, MapiMessage, MAPI_DIALOG, 0)
    else
      Result := MapiSendMail(Mapi_Session, Handle, MapiMessage, 0, 0);
    finally
      EnableTaskWindows( WndList );
    end;
    if Result <> 0 then 
      Mensaje('Error al enviar el Correo ('+IntToStr(Result)+').')
    else
      if Ver = False then
        Mensaje('Correo enviado correctamente.');

    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);
    if Assigned(Receip.lpszAddress) then
      StrDispose(Receip.lpszAddress);
    if Assigned(Receip.lpszName) then
      StrDispose(Receip.lpszName);
    MapiLogOff(MAPI_Session, Handle, 0, 0);
  end;
end;

Gracias y Saludos
Adolfo Bonis
Barcelona

cHackAll 18-06-2007 21:36:13

Lindo!
 
Cita:

Empezado por adebonis
...DE heco lo que me interesaba es guardar en disco la estructura del mensaje...

Osea que ya no lo necesitas?????

Cita:

Empezado por adebonis
...Lo mismo que hacen los clientes de correo al utilizar la opción del menú "Guardar como..." (outlook lo guarda con extensión .msg, Outollok Express con extensión .eml, etc.)...

En definitiva, lo que hacen estos programas lo "codificaron" ellos mismos como debieses hacerlo tu, mientras bajemos mas en nuestro nivel de programacion (APIs), ganamos más control y conocimientos pero a veces resulta que debemos realizar mas código.

Te aconsejo que hagas un "Mail.SaveToFile(''sent007.msg'')" al enviar exitosamente el mail.

Saludos.

ingabraham 17-08-2007 00:55:11

ayuda
 
SendEMailMAPI(handle,'ingeniero_abraham@hotmail.com',true)
que viene en handle

cHackAll 17-08-2007 01:57:06

Cita:

Empezado por ingabraham (Mensaje 223924)
SendEMailMAPI(handle,'ingeniero_abraham@hotmail.com',true)
que viene en handle

Procura no utilizar mayusculas o negritas en tus posts ingabraham, es una falta a la Guia de estilo. Con respecto al Handle, es el manejador de la ventana, por ejemplo en el OnClick de un boton simplemente copias el código y estará tomando el manejador de tu ventana.

ingabraham 17-08-2007 16:07:47

Disculpa mi inquetud, Necesito un poq de Ayuda
 
procedure TForm1.Button1Click(Sender: TObject);
begin
SendEMailMAPI(handle,edit1.text,true);
end;



function SendEMailMAPI(Handle: THandle; Mail: TStrings; Ver: Boolean): Cardinal;

es una funcion, q tipo de dato devuelve a que se lo asigno, es una funcion que se llama pero no se como se llama.

Ayudame por favor, Te lo agradezco

cHackAll 17-08-2007 23:47:01

Bueno, el ejemplo que el señor adebonis dejo en éste hilo esta en muchos lugares del internet; desconozco la fuente inicial pero te puedo dejar un ejemplo muy bueno aquí (de la llamada claro).

Saludos.


La franja horaria es GMT +2. Ahora son las 00:17:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi