Ir al contenido



Foto

Archivos Adjuntos usando Indy 10.5


  • Por favor identifícate para responder
11 respuestas en este tema

#1 estor485

estor485

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 01 junio 2012 - 04:05

Hola buen día, primero que nada me disculpo si es que estoy cometiendo algún error o faltando al a las normas del foro al abrir un nuevo tema, he buscado en los ya existentes pero casi todos tienen mucho tiempo sin ser modificados, mi problema es el siguiente, tengo una aplicación hecha tanto en UniGui como VCL (el normal de Delphi, no una aplicación UniGui corriendo en modo VCL), estoy usando componentes InDy (v10.5) para enviar correos y lo hace bien tanto UniGui como VCL, el problema viene cuando quiero adjuntar un archivo en este caso un Txt, manda el correo, pero manda algo así :
"This is a multi-part message in MIME format --ER57AgL2KgQ=_UE3IFDO7y8OToAbLRThPX Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Correo de prueba para enviar correo adjunto --ER57AgL2KgQ=_UE3IFDO7y8OToAbLRThPX Content-Type: application/octet-stream; name="MsjOriginal.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="MsjOriginal.txt" RXN0ZSBtZW5zYWplIGNvbnRpZW5lIGxhIGxpc3RhIGRlIHBhbGFicmFzIGFsdGlzb25hbnRlcyBx dWUgc2VyYW4gZWRpdGFkYXMgZGVsIGJ1em9uIGRlIHRyYW5zcGFyZW5jaWEuDQpTZSBhZGp1bnRh IHVuYSBjb3BpYSBzaW4gZWRpdGFyIGRlbCBtaXNtbywgc2UgYWNlcHRhbiBtYXMgcGFsYWJyYXMg "

he importado las siguientes clases


delphi
  1. Uses
  2. IdSMTP, IdMessage, StdCtrls, IdBaseComponent, IdComponent,IdIOHandler, IdIOHandlerSocket,
  3. IdIOHandlerStack, IdSSL, IdSSLOpenSSL,IdTCPConnection, IdTCPClient,IdExplicitTLSClientServerBase,
  4. IdMessageClient, IdSMTPBase, IdAttachment, IdAttachmentFile;



inicializo mis variables :


delphi
  1. smtp := TIdSMTP.Create(Self);
  2. mail := TIdMessage.Create(Self);
  3. IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.create(self);
  4. Adjunto := TIdAttachmentFile.Create(mail.MessageParts, UniServerModule.StartPath+'MsjOriginal.txt');
  5. Adjunto.ContentType := 'multipart';


Uso una cuenta Gmail, pero también ya probé con la de mi trabajo que no usa encriptación y el resultado es el mismo, alguien tiene alguna idea de como enviarlo sin que aparezca basura?
De antemano les agradezco a todos.
Saludos!!
  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 02 junio 2012 - 01:57

Creo que te sobre la línea Adjunto.ContentType := 'multipart'; ya que el adjunto es tipo text, si no pones nada debería funcionar, pero si quieres ponerlo tú, debería ser 'text/plain'.



  • 0

#3 estor485

estor485

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 04 junio 2012 - 09:14

Gracias Sergio he probado con lo que me has dicho, ademas de agregarle esta linea


delphi
  1. Adjunto.MessageParts.Add;


Ahora de repente lo envía bien y otras lo manda como basura, supongo que sera algo de mi Delphi o los Indys, aun así muchas gracias.
  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 04 junio 2012 - 09:20

Ese add te sobra, la llamada a TIdAttachmentFile.Create ya se auto-añade a la lista de messageparts, si además pones un add, tienes 2 messageparts, uno el bueno, y el otro de un tipo indefinido... mala combinación!
  • 0

#5 estor485

estor485

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 04 junio 2012 - 12:13

Ya le he borrado esa parte y el resultado es el mismo, cuando quiere lo envía y cuando no solo muestra basura
aquí el código para ver si algo se me escapa.


delphi
  1. unit Mail;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs,IdSMTP, IdMessage, StdCtrls, IdBaseComponent, IdComponent,IdIOHandler,
  8.   IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL,IdTCPConnection,
  9.   IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase,
  10.   IdAttachment, IdAttachmentFile;
  11.  
  12. type
  13.   TForm1 = class(TForm)
  14.     Edit1: TEdit;
  15.     Edit2: TEdit;
  16.     Label1: TLabel;
  17.     Label2: TLabel;
  18.     Button1: TButton;
  19.     Memo1: TMemo;
  20.     procedure Button1Click(Sender: TObject);
  21.   private
  22.     { Private declarations }
  23.   public
  24.     { Public declarations }
  25.   end;
  26.  
  27. var
  28.   Form1: TForm1;
  29.  
  30. implementation
  31.  
  32. {$R *.dfm}
  33.  
  34. procedure TForm1.Button1Click(Sender: TObject);
  35.     var
  36.   smtp: TIdSMTP;
  37.   mail: TIdMessage;
  38.   Adjunto: TIdAttachmentFile;
  39.     IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
  40. begin
  41. ///////Correo\\\\\\
  42. smtp := TIdSMTP.Create(Self);
  43.   mail := TIdMessage.Create(Self);
  44.     IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.create(self);
  45.   with smtp do
  46.   begin
  47.     {Port := 2626;
  48.     Host := 'mail.proseso.mx';
  49.     Username := 'juan.oliva@proseso.mx';
  50.     Password := '********';}
  51.     Port := 587;
  52.     Host := 'smtp.gmail.com';
  53.     Username := 'estor485';
  54.     Password := '******';
  55.     AuthType := satDefault;                        // PAra Gmail
  56.     IOHandler := IdSSLIOHandlerSocketOpenSSL1;
  57.     UseTLS := utUseExplicitTLS;
  58.  
  59.   end;
  60.  
  61.   with mail do
  62.   begin
  63.     Recipients.Add;
  64.     Recipients[0].Name := '';
  65.     Recipients[0].Address := Edit2.Text;//correo al que se envia/;
  66.     From.Name := 'Departamento de desarrollo';
  67.     From.Address := 'correo@remitente.com';
  68.     //IsEncoded := true;
  69.     ContentType := 'text/html';
  70.     Subject := Edit1.Text;
  71.     Body.Text := Memo1.Text; //cuerpo mensaje
  72.  
  73.   end;
  74. Adjunto := TIdAttachmentFile.Create(mail.MessageParts,'adjunto.txt' );
  75.   smtp.Connect();
  76.   try
  77.     try
  78.       smtp.Send(mail);
  79.       ShowMessage('Msj enviado');
  80.     except
  81.       on E: Exception do
  82.         begin
  83.           ShowMessage('Msj no enviado');
  84.         end;
  85.     end;
  86.   finally
  87.     if smtp.Connected then
  88.       smtp.Disconnect;
  89.   end;
  90.  
  91.   mail.Free;
  92.   smtp.Free;
  93.   CloseModal;
  94.  
  95. /// Fin Correo \\\\\\
  96. end;
  97.  
  98. end.



Una vez mas gracias por tomarte el tiempo de leer y ayudar a un novato  :)
  • 0

#6 luisgutierrezb

luisgutierrezb

    Advanced Member

  • Miembros
  • PipPipPip
  • 92 mensajes
  • LocationMéxico

Escrito 04 junio 2012 - 12:59

Yo utilizo esta función, hay unas variables globales de la forma, y no usa gmail, a lo mejor solo es cuestion de que lo adaptes, yo no eh batallado para nada...
 


php
  1. function TEnviaCorreo.Envia: Boolean;
  2. var
  3.   htmpart, txtpart: TIdText;
  4.   //bmppart: TIdAttachment;
  5.   email: TIdMessage;
  6.   i:integer;
  7. begin
  8.   //Inicialización del ultimo error
  9.   sError := '';
  10.   //Inicialización del SMTP
  11.   SMTP := TIdSMTP.Create(nil);
  12.   SMTP.Host := sServidor;
  13.   SMTP.Port := wPuerto;
  14.   SMTP.Username := sUsuario;
  15.   SMTP.Password := sPassword;
  16.   SMTP.ValidateAuthLoginCapability := True;
  17.   SMTP.UseEhlo := True;
  18.   SMTP.UseTLS := utNoTLSSupport;
  19.   //Correo
  20.   email := TIdMessage.Create(nil);
  21.   email.FromList.EMailAddresses := '"' + sDeNombre + '" <' + sDeCorreo + '>';
  22.   email.Recipients.EMailAddresses := sPara;
  23.   email.Subject := sAsunto;
  24.   if Trim(sCC) <> '' then
  25.     email.CCList.EMailAddresses := sCC;
  26.   if Trim(sBCC) <> '' then
  27.     email.BccList.EMailAddresses := sBCC;
  28.   email.ContentType := 'multipart/mixed';
  29.   //email.Body.Assign(Mensaje);
  30.  
  31.   txtpart := TIdText.Create(email.MessageParts);
  32.   txtpart.ContentType := 'text/plain';
  33.   txtpart.Body.Text := sAlternativo;
  34.  
  35.   htmpart := TIdText.Create(email.MessageParts, Mensaje);
  36.   htmpart.ContentType := 'text/html';
  37.  
  38.   for i:=0 to ArchAdjuntos.Count -1 do
  39.     if FileExists(ArchAdjuntos[i]) then
  40.       TIdAttachmentFile.Create(email.MessageParts, ArchAdjuntos[i]);
  41.     //bmppart := TIdAttachmentFile.Create(email.MessageParts, filename);
  42.     //bmppart.ContentType := 'image/jpeg';
  43.     //bmppart.FileIsTempFile := true;
  44.     //bmppart.ContentDisposition := 'inline';
  45.     //bmppart.ExtraHeaders.Values['content-id'] := 'us.jpg';
  46.     //bmppart.DisplayName := 'prueba.pdf';
  47.  
  48.   try
  49.     SMTP.Connect();
  50.     try
  51.       SMTP.Send(email);
  52.       Result := True;
  53.     except
  54.       on E: Exception do
  55.       begin
  56.         sError := E.Message;
  57.         Result := False;
  58.       end;
  59.     end;
  60.   finally
  61.     SMTP.Disconnect();
  62.     email.Free();
  63.   end;
  64.  

Creo que donde pudiera haber duda es en la variable sAlternativo, es un mensaje alternativo para los correos que no procesan HTML


  • 0

#7 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 05 junio 2012 - 03:39

El código de Luis es similar al mio, en tu código veo errores, por ejemplo pones que mail.contenttype es text/plain, eso no es correcto, lo que es textplain es tu attach, que como ves Luis lo añade como un mensaje alternativo (pone el mensaje en texto y en html).

Si tu quieres meter el txt como atach, puedes poner el texto del email en mail.body.text y adjuntar el txt como un adjunto normal, sin necesidad de decirle el contenttype (pero lo puedes poner si quieres, sería mejor).



delphi
  1. Attach:= TIdAttachment.Create(Carta.MessageParts, Fichero);
  2. Attach.ContentType:= 'text/plain';


  • 0

#8 estor485

estor485

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 05 junio 2012 - 12:03

Gracias Luis y Sergio el problema es :


delphi
  1. mail.ContentType := 'text/html';


Como mencione la aplicación la estoy usando tanto VCL como UniGui, en esta ultima necesito que se manden como HTML (no es prioridad, pero era preferido que fuera así). Si tuvieran una alternativa para eso se los agradecería, de igual forma lo mas importante ya quedo, ahora puedo enviar PDF, DOCX, Txt, etc.

Gracias :)
  • 0

#9 estor485

estor485

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 05 junio 2012 - 12:04

Luis me marca que no reconoce TIdText, sera cuestión de versiones?
Saludos!
  • 0

#10 luisgutierrezb

luisgutierrezb

    Advanced Member

  • Miembros
  • PipPipPip
  • 92 mensajes
  • LocationMéxico

Escrito 05 junio 2012 - 12:25

Agregaste la unidad IdText???

aqui te paso el uses de esa unidad, por si faltara alguno mas:
 


php
  1. uses
  2.   Classes, sysutils,
  3.   IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  4.   IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP, IdText,
  5.   IdMessage,IdAttachment,IdAttachmentFile;


  • 0

#11 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 06 junio 2012 - 04:11

Gracias Luis y Sergio el problema es :


delphi
  1. mail.ContentType := 'text/html';


Como mencione la aplicación la estoy usando tanto VCL como UniGui, en esta ultima necesito que se manden como HTML (no es prioridad, pero era preferido que fuera así). Si tuvieran una alternativa para eso se los agradecería, de igual forma lo mas importante ya quedo, ahora puedo enviar PDF, DOCX, Txt, etc.

Gracias :)


Tu quieres enviar un texto, pues lo primero es elegir si lo quieres enviar como el body del mail, como una version txt del body usando el ejemplo de Luis) o como un attach, pero no puedes mezclar todo y que te funcione.

En cualquier caso, si es un attach, el mensaje es tipo multipart (body + attach), así que parece que eso no te serviría... usa el body.text y listo, te ahorras problemas, aunque te recomiendo enviar el texto en el body Y como attach por una razón: un mensaje con body solo es "del pleistoceno" y en esa época no se incluía el charset, con lo que acentos y esas cosas te pueden llegar malamente, pero, si las indy detectan body+attach, el mensaje pasa a ser multipart y el body text incluye su charset y todo se ve perfecto.

  • 0

#12 estor485

estor485

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 13 junio 2012 - 04:36

Gracias a ambos, no lo he probado ya que ahora estoy quebrandome la cabeza con otro pendiente, pero en cuanto tenga tiempo lo are pruebo y les comento.
Muchas gracias.

:)
  • 0