Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   INDY: ¿Cómo generar un correo y luego enviarlo con cliente email por defecto? (https://www.clubdelphi.com/foros/showthread.php?t=92925)

nincillo 15-03-2018 13:06:12

INDY: ¿Cómo generar un correo y luego enviarlo con cliente email por defecto?
 
Hola. Estaba intentando generar un fichero .eml con el msg.savetofile de Indy y luego con el shellexecute abrirlo con el programa de correo por defecto que esté instalado en el sistema (dando así la oportunidad al usuario de ver el correo resultante antes de enviarlo).

Hasta ahí, todo bien. Me genera el fichero con los adjuntos y me lo abre correctamente con MS Outlook, MS Mail, etc.

El problema lo tengo con que me abre el correo de tal forma que no tengo opción de enviar. Solo tengo opción de responder, reenviar, etc.

¿Alguien podría decirme alguna manera de solucionarlo o cómo hacerlo de otra forma?.

Mi idea es poder generar un correo electrónico y que lo abra con el cliente de correo que tenga instalado en el sistema por defecto para luego poder darle a enviar.

Gracias y un saludo.

ElDioni 15-03-2018 16:05:56

Hola,
no pones como estás intentando enviar ese archivo. Yo te pongo esta instrucción que lo que hace es abrir la aplicación que windows tenga marcada como predeterminada para abrir el tipo de extensión que tenga el fichero que le pases.

Código Delphi [-]
ShellExecute(0,PWidechar('Open'),PWideChar(rutadelarchivo),nil,nil,0);

Saludos.

nincillo 15-03-2018 17:53:35

Cita:

Empezado por ElDioni (Mensaje 525117)
Hola,
no pones como estás intentando enviar ese archivo. Yo te pongo esta instrucción que lo que hace es abrir la aplicación que windows tenga marcada como predeterminada para abrir el tipo de extensión que tenga el fichero que le pases.

Código Delphi [-]
ShellExecute(0,PWidechar('Open'),PWideChar(rutadelarchivo),nil,nil,0);

Saludos.

Hola @ElDioni.

Exactamente así es como lo hago, y el correo lo abre perfectamente construido. Con imágenes, adjuntos y demás. El "problema" es que lo abre como si fuera un correo recibido y no uno nuevo. Con lo cual, en lugar de darme la opción de Enviar, me da las opciones de Responder, Reenviar, etc.

Un saludo.

TOPX 15-03-2018 18:20:25

Hola.

Los archivos con formato .eml son mensajes "recibidos" y almacenados para consulta posterior.

Si quiere enviar correos electrónicos utilizando otro software, tendría que explorar opciones de automatización específicas para cada uno de esos programas. Por ejemplo, así.

Aunque, también podría intentar trucos como Sending mail from Delphi using Thunderbird - Stack Overflow, donde usan drag and drop para llevar archivos adjuntos a un mensaje en un cliente de correo electrónico.

Si fuera Ud., como ya estoy usando Indy, pues envío el correo desde la aplicación y ya.
-

duilioisola 16-03-2018 08:43:05

Puedes utilizar esto también:
http://www.delphifaq.com/faq/delphi/network/f236.shtml

Envía correos utilizando el cliente de correo por defecto del ordenador.

Si tienes mas de un adjunto puedes modificar esa parte con esto:
Código Delphi [-]
  ArchivosAdjuntos := TStringList.Create;
  try
     ArchivosAdjuntos.Add('C:\Fotos\Foto1.jpg');
     ArchivosAdjuntos.Add('C:\Fotos\Foto2.jpg');
     ArchivosAdjuntos.Add('C:\Fotos\Foto3.jpg');
     SendMailMAPI('Prueba', 'Esto es una prueba', ArchivosAdjuntos, 'Pepito Perez', 'pepito.perez@gmail.com', 'Fulanito Ggarcia', 'fulanito.garcia@hotmail.com')
  finally
     ArchivosAdjuntos.Free;
  end;

function TDMListados.SendMailMAPI(const Subject, Body:string; Adjuntos: TStrings; SenderName, SenderEMail, RecepientName, RecepientEMail: string): integer;
var
...
  Archivo : string;
...
  // Adjuntos es un TStringList con la dirección de los archivos a adjuntar.
  if Adjuntos.Count > 0 then
  begin
     GetMem(Attachments, SizeOf(TMapiFileDesc) * Adjuntos.Count);

     for i := 0 to Adjuntos.Count - 1 do
     begin
        Archivo := Adjuntos[i];
        Attachments[i].ulReserved := 0;
        Attachments[i].flFlags := 0;
        Attachments[i].nPosition := ULONG($FFFFFFFF);
        Attachments[i].lpszPathName := StrNew(PChar(Archivo));
        Attachments[i].lpszFileName := StrNew(PChar(ExtractFileName(Archivo)));
        Attachments[i].lpFileType := nil;
     end;
     MapiMessage.nFileCount := Adjuntos.Count;
     MapiMessage.lpFiles := @Attachments^;
  end;
...

nincillo 16-03-2018 11:20:29

Cita:

Empezado por duilioisola (Mensaje 525129)
Puedes utilizar esto también:
http://www.delphifaq.com/faq/delphi/network/f236.shtml

Envía correos utilizando el cliente de correo por defecto del ordenador.

Si tienes mas de un adjunto puedes modificar esa parte con esto:
Código Delphi [-]
  ArchivosAdjuntos := TStringList.Create;
  try
     ArchivosAdjuntos.Add('C:\Fotos\Foto1.jpg');
     ArchivosAdjuntos.Add('C:\Fotos\Foto2.jpg');
     ArchivosAdjuntos.Add('C:\Fotos\Foto3.jpg');
     SendMailMAPI('Prueba', 'Esto es una prueba', ArchivosAdjuntos, 'Pepito Perez', 'pepito.perez@gmail.com', 'Fulanito Ggarcia', 'fulanito.garcia@hotmail.com')
  finally
     ArchivosAdjuntos.Free;
  end;

function TDMListados.SendMailMAPI(const Subject, Body:string; Adjuntos: TStrings; SenderName, SenderEMail, RecepientName, RecepientEMail: string): integer;
var
...
  Archivo : string;
...
  // Adjuntos es un TStringList con la dirección de los archivos a adjuntar.
  if Adjuntos.Count > 0 then
  begin
     GetMem(Attachments, SizeOf(TMapiFileDesc) * Adjuntos.Count);

     for i := 0 to Adjuntos.Count - 1 do
     begin
        Archivo := Adjuntos[i];
        Attachments[i].ulReserved := 0;
        Attachments[i].flFlags := 0;
        Attachments[i].nPosition := ULONG($FFFFFFFF);
        Attachments[i].lpszPathName := StrNew(PChar(Archivo));
        Attachments[i].lpszFileName := StrNew(PChar(ExtractFileName(Archivo)));
        Attachments[i].lpFileType := nil;
     end;
     MapiMessage.nFileCount := Adjuntos.Count;
     MapiMessage.lpFiles := @Attachments^;
  end;
...

Que buena pinta tiene!!!.
Le voy a pegar un vistazo a ver si lo puedo integrar con el resto del programa que tengo hecho hasta ahora.

Muchas gracias.


La franja horaria es GMT +2. Ahora son las 16:08:46.

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