PDA

Ver la Versión Completa : Guardar un correo electronio en disco con MAPI


adebonis
11-06-2007, 20:31:57
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
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:

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.


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
...DE heco lo que me interesaba es guardar en disco la estructura del mensaje...

Osea que ya no lo necesitas?????

...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
SendEMailMAPI(handle,'ingeniero_abraham@hotmail.com',true)
que viene en handle

cHackAll
17-08-2007, 01:57:06
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 (http://www.clubdelphi.com/foros/guiaestilo.php). 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
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í (http://www.elists.org/pipermail/delphi/2004-April/025381.html) (de la llamada claro).

Saludos.