Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Envío de mail con un archivo adjunto. (https://www.clubdelphi.com/foros/showthread.php?t=81324)

y_a_p 03-11-2012 22:20:16

Envío de mail con un archivo adjunto.
 
Hola a todos, la verdad necesito ayuda urgente!, tengo un programa para un pediatra, en Delphi 7, Firebird, SQL Manager, necesito que envie archivos por mail, el tema es que estuve leyendo y no se por donde arrancar... no se que componente debo usar y como usarlo... agradecería por favor su ayuda urgente, gracias

ecfisa 03-11-2012 22:34:36

Hola y_a_p.

Mira en estos enlaces:
Saludos.

Casimiro Notevi 03-11-2012 22:35:26

Pues además de leer nuestra guía de estilo ;), también puedes ver los enlaces que hay al final de esta misma página.
También puedes hacer una búsqueda, es un tema que se ha tratado muchísimas veces.

y_a_p 03-11-2012 23:26:29

Disculpen, pero justamente pregunto porque no entiendo nada y el código que me pasas no se donde va, si tengo que crear un formulario. Es la primera vez que programamos esto..

ecfisa 03-11-2012 23:55:48

Hola y_a_p.

Realmente no es complejo y en el primer enlace está claramente explicado, pero voy a darle funcionalidad por si te sirviera de guía.
  • Dentro del editor de Delphi: File->New->Application.
  • Pone un TButton (pestaña Standard)
  • Inmediatamente debajo de implementation, agrega: uses IdSMTP, IdMessage;
  • Copia la función EnviarMensaje y pegala debajo.
  • Hace doble click sobre el botón que previamente pusiste y agrega la llamada.

El código debería quedarte así:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}

uses
  IdSMTP, IdMessage;

procedure EnviarMensaje( sUsuario, sClave, sHost, sAdjunto, sAsunto, sDestino, sMensaje: String );
var 
  SMTP: TIdSMTP;
   Mensaje: TIdMessage;
   Adjunto: TIdAttachment;
begin
  SMTP := TIdSMTP.Create( nil );
  SMTP.Username := sUsuario;
  SMTP.Password := sClave;
  SMTP.Host := sHost;
  SMTP.Port := 25;
  SMTP.AuthenticationType := atLogin;

  Mensaje := TIdMessage.Create( nil );
  Mensaje.Clear;
  Mensaje.From.Name := sDestino;
  Mensaje.From.Address := sDestino;
  Mensaje.Subject := sAsunto;
  Mensaje.Body.Text := sMensaje;
  Mensaje.Recipients.Add;
  Mensaje.Recipients.Items[0].Address := sDestino;

  if sAdjunto <> '' then
  begin
    if FileExists( sAdjunto ) then
      Adjunto := TIdAttachment.Create( Mensaje.MessageParts, sAdjunto );
  end
  else
    Adjunto := nil;

  try
    SMTP.Connect;
  except
    raise Exception.Create( 'Error al conectar con el servidor.' );
  end;

  if SMTP.Connected then
  begin
    try
      SMTP.Send( Mensaje );
    except
      raise Exception.Create( 'Error al enviar el mensaje.' );
    end;

    try
      SMTP.Disconnect;
    except
      raise Exception.Create( 'Error al desconectar del servidor.' );
    end;
  end;

  if Adjunto <> nil then
    FreeAndNil( Adjunto );

  FreeAndNil( Mensaje );
  FreeAndNil( SMTP );

  Application.MessageBox( 'Mensaje enviado correctamente.',
    'Fin de proceso',MB_ICONINFORMATION );
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnviarMensaje( 'juanito33', 'djeuE21', 'smtp.terra.es',
             'c:\documento.zip', 'Te envio mi documento',
             'felipe8843@terra.es', 'Adjunto archivo: documento.zip' );
end;

end.
Lógicamente tendrás que cambiar los argumentos enviados a la función EnviarMensaje para que el código sea operativo.

Saludos.

angel.sosa 25-04-2013 20:46:11

hola, yo igual estoy intentando utilizar Indy para enviar mensajes con adjunto, utilizo delphi 7 y veo dentro de sus paquetes que tengo Indy10 dentro de los paquetes, al intentar utilizar el código que sugieren me marca esto, algo similar a los demás ejemplos, incluso los que descargue el el FTP.

Código Delphi [-]
procedure EnviarMensaje( sUsuario, sClave, sHost, sAdjunto, sAsunto, sDestino, sMensaje: String );
var SMTP: TIdSMTP;
   Mensaje: TIdMessage;
   Adjunto: TIdAttachment;
   HS     : TIdSSLIOHandlerSocket ;                 //<<<<<<<<<<<<<<<<<<<<
begin

  HS := TIdSSLIOHandlerSocket.Create( nil );        //<<<<<<<<<<<<<<<<<<<<

el error que me marca es este

Código Delphi [-]
[DCC Error] Unit1.pas(34): E2003 Undeclared identifier: 'TIdAttachment'

ecfisa 25-04-2013 21:06:47

Cita:

Empezado por angel.sosa (Mensaje 459297)
el error que me marca es este
Código Delphi [-]
[DCC Error] Unit1.pas(34): E2003 Undeclared identifier: 'TIdAttachment'

Hola Angel.

Si revisas con atención el mensaje #5, verás que en la cláusula uses incluyo a:
Código Delphi [-]
...
implementation

uses
  IdSMTP, IdMessage;
...

Saludos. :)

angel.sosa 25-04-2013 21:58:29

ahora me aparece otra cosa, como que no esta declarado o algo pero no encuentro donde se declara en el codigo que mandas

Código Delphi [-]
procedure EnviarMensaje( sUsuario, sClave, sHost, sAdjunto, sAsunto, sDestino, sMensaje: String );
var
   SMTP: TIdSMTP;
   Mensaje: TIdMessage;
   Adjunto: TIdAttachment;

begin
  SMTP := TIdSMTP.Create( nil );
  SMTP.Username := sUsuario;
  SMTP.Password := sClave;
  SMTP.Host := sHost;
  SMTP.Port := 25;
  SMTP.AuthenticationType := atLogin;

  Mensaje := TIdMessage.Create( nil );


el mensaje que me marca es este
Código Delphi [-]
[DCC Error] estadoemail.pas(45): E2003 Undeclared identifier: 'AuthenticationType'

ecfisa 25-04-2013 22:34:58

Hola Angel.

Realmente no sé que te puede estar sucediendo, creo que va a resultarte mas entendible adjuntar el mismo código del ejemplo del mensaje (ya implementado) el cuál me compila sin ningún error.

No olvides tomar en cuenta lo que mencioné en el mensaje:
Cita:

Empezado por ecfisa (Mensaje 448614)
Lógicamente tendrás que cambiar los argumentos enviados a la función EnviarMensaje para que el código sea operativo.

Saludos. :)

angel.sosa 25-04-2013 23:12:17

no vas a creerlo, acabo de descomprimir el archivo que me envias, los adecue con los datos de mi correo y me marca de nuevo esto:

Código Delphi [-]
[DCC Error] Unit1.pas(29): E2003 Undeclared identifier: 'TIdAttachment'

ecfisa 26-04-2013 00:20:47

Cita:

Empezado por angel.sosa (Mensaje 459307)
no vas a creerlo, acabo de descomprimir el archivo que me envias, los adecue con los datos de mi correo y me marca de nuevo esto:

Código Delphi [-]
[DCC Error] Unit1.pas(29): E2003 Undeclared identifier: 'TIdAttachment'

Sin dudas que te creo, aunque me llama la atención que te de el error en esa línea siendo que está declarada con anterioridad al uso de AuthenticationType (el error previo) ...

¿ Será la versión de Indy ? :confused:
En mi caso es la: 9.00.10, podes verificar la tuya agregando un componente TIdHTTP y la siguiente línea:
Código Delphi [-]
    ShowMessage(idHTTP1.Version);
Si es una versión diferente tal vez tengas que buscar por el número de versión y los términos que te dan error (AuthenticationType, TIdAttachment, etc).

Saludos. :)

nlsgarcia 26-04-2013 00:54:25

y_a_p,

Cita:

Empezado por y_a_p
...tengo un programa para un pediatra...necesito que envie archivos por mail...

Cita:

Empezado por y_a_p
...utilizo delphi 7 y veo dentro de sus paquetes que tengo Indy10...

Cita:

Empezado por y_a_p
...acabo de descomprimir el archivo que me envias...me marca de nuevo esto...Undeclared identifier: 'TIdAttachment'...

Cita:

Empezado por ecfisa
¿ Será la versión de Indy ?

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}

uses
  IdSMTP, IdMessage, IdAttachmentFile;

procedure EnviarMensaje( sUsuario, sClave, sHost, sAdjunto, sAsunto, sDestino, sMensaje: String );
var
  SMTP: TIdSMTP;
  Mensaje: TIdMessage;
  Adjunto: TIdAttachmentFile;
  
begin
  SMTP := TIdSMTP.Create( nil );
  SMTP.Username := sUsuario;
  SMTP.Password := sClave;
  SMTP.Host := sHost;
  SMTP.Port := 25;
  SMTP.AuthType := atDefault;

  Mensaje := TIdMessage.Create( nil );
  Mensaje.Clear;
  Mensaje.From.Name := sDestino;
  Mensaje.From.Address := sDestino;
  Mensaje.Subject := sAsunto;
  Mensaje.Body.Text := sMensaje;
  Mensaje.Recipients.Add;
  Mensaje.Recipients.Items[0].Address := sDestino;

  if sAdjunto <> '' then
  begin
    if FileExists( sAdjunto ) then
      Adjunto := TIdAttachmentFile.Create( Mensaje.MessageParts, sAdjunto );
  end
  else
    Adjunto := nil;

  try
    SMTP.Connect;
  except
    raise Exception.Create( 'Error al conectar con el servidor.' );
  end;

  if SMTP.Connected then
  begin
    try
      SMTP.Send( Mensaje );
    except
      raise Exception.Create( 'Error al enviar el mensaje.' );
    end;

    try
      SMTP.Disconnect;
    except
      raise Exception.Create( 'Error al desconectar del servidor.' );
    end;
  end;

  if Adjunto <> nil then
    FreeAndNil( Adjunto );

  FreeAndNil( Mensaje );
  FreeAndNil( SMTP );

  Application.MessageBox( 'Mensaje enviado correctamente.',
    'Fin de proceso',MB_ICONINFORMATION );
end;

end.
El código del Msg #5 y #9 compila y funciona correctamente en Delphi 7 con Indy 9, en Indy 10 hay ligeros cambios como se señalan en el código anterior (Resaltados en color rojo) el cual fue probado en Delphi 2006 con Indy 10 y funciono correctamente según lo esperado con valores reales.

Espero sea útil :)

Nelson.

y_a_p 27-04-2013 15:41:18

Hola!, agradezco tu respuesta, lo voy a comparar con el código que he hecho, luego te cuento como me fue...

angel.sosa 02-05-2013 20:12:37

ya quedo, yo igual tenia Delphi 2007 e indy10, solo q el mensaje no me llega cuando se lo envio a correos gmail.com y a hotmail.com y no les llegan.

angel.sosa 02-05-2013 20:39:36

muchas a gracias a todos por la valiosa ayuda, e pasado varios dias revisando las respuestas y ninguna se acomodaba a mi codigo, hasta que aparecio lo de la version y solucione mi problema. solo resta un detalle que es poder enviar a gmail y hotmail

Cita:

Empezado por angel.sosa (Mensaje 459734)
ya quedo, yo igual tenia Delphi 2007 e indy10, solo q el mensaje no me llega cuando se lo envio a correos gmail.com y a hotmail.com y no les llegan.


nlsgarcia 02-05-2013 21:21:48

angel.sosa,

Cita:

Empezado por angel.sosa
...solo resta un detalle que es poder enviar a gmail y hotmail...

Revisa el Msg # 4 de este link: http://www.clubdelphi.com/foros/show...light=SendMail

Espero sea útil :)

Nelson.

y_a_p 08-06-2013 23:40:46

Bunas tardes, disculpen volver con este tema... eh buscado y no encuentro lo que necesito... A la hora de crear el mensaje para ser enviado, el ejemplo que dieron es este.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  EnviarMensaje( 'juanito33', 'djeuE21', 'smtp.terra.es',
             'c:\documento.zip', 'Te envio mi documento',
             'felipe8843@terra.es', 'Adjunto archivo: documento.zip' );
end;

Yo lo que necesito es que en lugar de poner en codigo el destinatario, necesito sacarlo de la base de datos, porque no siempre se le va a enviar un email a una sola persona, todos tienen emails distintos..

espero su respuesta, muchas gracias


La franja horaria es GMT +2. Ahora son las 21:27:18.

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