Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Problemas con TIdSMTP (https://www.clubdelphi.com/foros/showthread.php?t=95052)

Angel.Matilla 04-02-2021 18:10:03

Problemas con TIdSMTP
 
Buenas otra vez; aquí está de nuevo el pesado de turno.

Tengo, como ya sabéis, una aplicación hecha en BCB6 con una base de datos FB y estoy teniendo un problema al enviar correos desde la misma para lo que uso un TIdMessage, asociado a un TIdSMTP, (ver. 10.6.2.0) que tengo definido así:

Código:

Mensaje->AttachmentEncoding = 'UUE'
Mensaje->CharSet = 'iso-8859-1'
Mensaje->ContentType = 'text/plain'
Mensaje->Encoding = mePlainText
Mensaje->ConvertPreamble = True

El usuario me ha pedido incluir en los mensajes su logotipo como firma y en principio creía que no había mayor problema, que bastaba con incluirlo como adjunto y listo. Pero no he encontrado la manera de incluir ese logotipo en el mensaje de forma que se haga legible. Sin envío el mensaje sin el logotipo, con este código:
Código:

Mensaje->MessageParts->Add();
Mensaje->Subject    = <Asunto>;
Mensaje->Body->Text  = <Cuerpo del mensaje>;
Mensaje->Body->Text = fMenu->MenCor->Body->Text + <Firma>;

Se envía sin mayor problema; por ejemplo:
Cita:

Esto es una prueba
Esto es una prueba
Esto es una prueba
Esto es una prueba
Esto es una prueba

-----

Atentamente,
Ángel
Pero si trato de "incrustar" una imagen (JPG) que haga de firma con este código:
Código:

TIdAttachmentFile *Firma  = new TIdAttachmentFile("Imagen.jpg");
Firma->ExtraHeaders->Values["Content-ID"] = "<imagen.jpg>";

Evidentemente, el logo ya lo tengo guardado en un fichero. Lo que obtengo es esto:
Cita:

Esto es una prueba
Esto es una prueba
Esto es una prueba
Esto es una prueba

-----

Atentamente,
Ángel

begin 660 Imagen.jpg
M_]C_X``02D9)1@`!`0```0`!``#_VP!#``,"`@,"`@,#`P,$`P,$!0@%!00$
[...]
end
Yo sé que todo eso que hay entre el begin y el end es la imagen pero ¿cómo hago para que se vea en el mensaje?

Casimiro Notevi 04-02-2021 20:25:02

Deberás cambiar 'text/plain' por html.
Echa un vistazo por los foros, se ha tratado varias veces antes.

Angel.Matilla 05-02-2021 19:04:07

Estaba convencido de que lo había probado... y así es. Si pongo text/html esto es lo que recibo:
Cita:

Esto es una prueba. Esto es una prueba. Esto es una prueba. Esto es una prueba. Esto es una prueba. ----- Atentamente, �ngel begin 660 Imagen.jpg M_]C_X``02D9)1@`!`0```0`!``#_VP!#``,"`@,"`@,#`P,$`P,$!0@%!00$ [...]end
Tal cual: sin retornos de carro ni nada.

Casimiro Notevi 05-02-2021 20:07:50

Echa un vistazo a este hilo.
Y este también.
Y este otro.

Angel.Matilla 05-02-2021 20:41:38

Gracias. Lo miraré.

Angel.Matilla 06-02-2021 11:09:00

He estado mirando los enlaces que me has mandado, y otros que encontré en el foro como Enviar mails con imágenes, y entiendo la filosofía de lo que explican. Pero me ha surgido un problema: como sabéis uso BCB 6 y me está costando adaptar el código Delphi. Hay una línea especialmente que se pone de uñas, esta:
Código Delphi [-]
lTextPart := TIdText.Create(lMessage.MessageParts);
Si trato de adaptarla a Builder entiendo que debería ser algo así:
Código:

TIdText *Texto;
Texto = new TIdText(MenCor->MessageParts);

siendo MenCor un TidMessage, pero al compilar me da este error:
Cita:

[C++ Error] Funciones.cpp(1310): E2285 Could not find a match for 'TIdText::TIdText(TIdMessageParts * const)'
En la ayuda del objeto me indica que la sintaxis sería:
Cita:

Create(Collection: TIdMessageParts; ABody: TStrings);
Parameters
Collection: TIdMessageParts
Owner of the collection item.

ABody: TStrings = nil
Content of the message part.
He probado también esto:
Código:

TIdText *iTexto;
TIdMessageParts *iMensaje;
iMensaje = new TIdMessageParts(MenCor);
iTexto = new TIdText(iMensaje);

pero me da el mismo error. ¿Podéis echarme una mano aunque sea un peado?

Casimiro Notevi 06-02-2021 20:52:32

Mi C++ está muuuuuy oxidado, hace años que no lo uso. De todas formas, qué es lTextPart, lMessage, etc.
¿Qué código estás siguiendo?

Angel.Matilla 07-02-2021 08:26:03

Estoy tomando como ejemplo el enlace que he puesto más arriba, que es en Delphi. lTextPart y lMessage son variables de ese ejemplo.

juanelo 08-02-2021 18:19:28

Te mando este codigo que funciona :
Código Delphi [-]
bool __fastcall TFrmMail::EnviaMail()
{
  bool Que=true;
  int i=0,Intento=0;
  AnsiString Archivo,Imagen,Temp;
  TIniFile *Ini;



  ModuloDeDatos->LlenaListas(ListaPara,CorreoDestino,false);
  ModuloDeDatos->LlenaListas(ListaCC,CC,false);
  ModuloDeDatos->LlenaListas(ListaBCC,BCC,false);

  SMTP->Username = UserID;
  SMTP->Password = Password;
  SMTP->Host = Host;
  SMTP->Port = Port;
  SMTP->AuthenticationType = atLogin;
  if(UsaSSL)
    SMTP->IOHandler=SSL;

  if(UsaSTARTTLS)
  {
    SSL->SSLOptions->Method = sslvTLSv1;
    SSL->PassThrough = true;
  }
  // Creamos el contenido del mensaje
  Mensaje = new TIdMessage(NULL);

  Mensaje->Clear();

  Mensaje->ContentType = "multipart/mixed";

  Mensaje->From->Name = FromName;
  Mensaje->From->Address = FromAddress;
  Mensaje->Subject = Subject;
  //Mensaje->Body->Add(EdtBody->Text);

  
    Ini= new TIniFile( ModuloDeDatos->DirExe + "CorreoAdmin.ini");
    Host=Ini->ReadString("Correo","Host","");
    Port=Ini->ReadInteger("Correo","Port",26);
    UserID=Ini->ReadString("Correo","UserID","");
    FromAddress=Ini->ReadString("Correo","FromAddress","");
    FromName=Ini->ReadString("Correo","FromName","IDEA Sistemas Activaciones");
    PlantillaHTML=Ini->ReadString("Correo","PlantillaHTML","");
    Logo=Ini->ReadString("Correo","Logo","");
    TextoAdicional=Ini->ReadString("Correo","TextoAdicional","");
    UsaSSL=Ini->ReadBool("Correo","UsaSSL",false);
    UsaSTARTTLS=Ini->ReadBool("Correo","UsaSTARTTLS",false);
    delete Ini;

    CorreoDestino="juan.novelo@hotmail.com";
    CC = "juan.novelo@ideasistemas.mx";
    SMTP->Username = UserID;
    SMTP->Password = Pass;
  

  BodyIndyText = new TIdText(Mensaje->MessageParts,NULL);
  BodyIndyText->ContentType="text/plain";
  BodyIndyText->Body->Text="";

  Temp=EdtBody->Text;
  EdtBody->Text=EdtTextAdicional->Text + " 
" + EdtBody->Text; BodyIndyHtml = new TIdText(Mensaje->MessageParts,EdtBody->Lines); BodyIndyHtml->ContentType="text/html"; BodyIndyHtml->Body->Clear(); BodyIndyHtml->Body->Add(EdtBody->Text); if(FileExists(Logo)) { Imagen=ExtractFileName(Logo); LogoIndy = new TIdAttachment(Mensaje->MessageParts,Logo); LogoIndy->ContentType = "image/jpeg"; LogoIndy->FileIsTempFile = false; LogoIndy->ContentDisposition = "inline"; LogoIndy->ExtraHeaders->Values["content-id"] = Imagen; LogoIndy->DisplayName = Imagen; } while(i< ListaCC->Count) { Mensaje->CCList->Add(); Mensaje->CCList->Items[i]->Address=ListaCC->Strings[i]; i++; } i=0; while(i< ListaBCC->Count) { Mensaje->BccList->Add(); Mensaje->BccList->Items[i]->Address=ListaBCC->Strings[i]; i++; } i=0; while(i< ListaPara->Count) { Mensaje->Recipients->Add(); Mensaje->Recipients->Items[i]->Address=ListaPara->Strings[i]; i++; } if(CmbAttachs->Properties->Items->Count > 0 && FileExists(CmbAttachs->Properties->Items->Strings[0])) IndyAttach1 = new TIdAttachment( Mensaje->MessageParts, CmbAttachs->Properties->Items->Strings[0] ); if(CmbAttachs->Properties->Items->Count > 1 && FileExists(CmbAttachs->Properties->Items->Strings[1])) IndyAttach2 = new TIdAttachment( Mensaje->MessageParts, CmbAttachs->Properties->Items->Strings[1] ); if(CmbAttachs->Properties->Items->Count > 2 && FileExists(CmbAttachs->Properties->Items->Strings[2])) IndyAttach3 = new TIdAttachment( Mensaje->MessageParts, CmbAttachs->Properties->Items->Strings[2] ); if(CmbAttachs->Properties->Items->Count > 3 && FileExists(CmbAttachs->Properties->Items->Strings[3])) IndyAttach4 = new TIdAttachment( Mensaje->MessageParts, CmbAttachs->Properties->Items->Strings[3] ); // Conectamos con el servidor SMTP while(Intento < 2) { try { try { STB->Panels->Items[0]->Text="Conectando ... "; if(UsaSTARTTLS) SMTP->Connect(IdTimeoutDefault); else SMTP->Connect(); if(UsaSTARTTLS && SMTP->SendCmd("STARTTLS", 220) == 220)// se coloca PassThrough a false { SSL->PassThrough = false; SMTP->SendCmd("EHLO " + SMTP->LocalName); } if(SMTP->Connected()) { if(UsaSTARTTLS) SMTP->Authenticate(); STB->Panels->Items[0]->Text="Enviando correo ... "; SMTP->Send(Mensaje); Que=true; STB->Panels->Items[0]->Text="Desconectando ... "; SMTP->Disconnect(); STB->Panels->Items[0]->Text="Correo Enviado ... "; if(EsFactura || EsCPRN) MarcaFacturaEnviadaPorMail(CveDocto,EnviaXML,-1,TipoDoc); } Intento=2; PuedeCerrar=true; //DeleteFile(ModuloDeDatos->ArchivoPDF); } catch(Exception &e) { Que=false; if(e.Message.AnsiPos("load") == 0) // Por error de Indy { Intento=2; STB->Panels->Items[0]->Text="Error en el envio" + e.Message; //Application->MessageBox(e.Message.c_str(),"Error",MB_OK); } else Intento++; PuedeCerrar=false; } } __finally { if(SMTP->Connected()) SMTP->Disconnect(); if(Intento > 1) { if(IndyAttach1!=NULL) delete IndyAttach1; if(IndyAttach2!=NULL) delete IndyAttach2; if(IndyAttach3!=NULL) delete IndyAttach3; if(IndyAttach4!=NULL) delete IndyAttach4; if(LogoIndy!=NULL) delete LogoIndy; if(Mensaje!=NULL) delete Mensaje; EdtBody->Text=Temp; } } } return Que; }

Angel.Matilla 09-02-2021 10:06:19

Gracias por la ayuda. Lo probaré en cuanto pueda.

Angel.Matilla 09-02-2021 13:14:58

if(FileExists(Logo))
{
Imagen=ExtractFileName(Logo);
LogoIndy = new TIdAttachment(Mensaje->MessageParts,Logo);
LogoIndy->ContentType = "image/jpeg";
LogoIndy->FileIsTempFile = false;
LogoIndy->ContentDisposition = "inline";
LogoIndy->ExtraHeaders->Values["content-id"] = Imagen;
LogoIndy->DisplayName = Imagen;
}
[/delphi][/quote]
Me está dando un error de compilación en la línea new TIdAttachment. me dice:
Cita:

E2352 Cannot create instance of abstract class 'TIdAttachment'
¿No debería ser new TIdAttachmentFile?

juanelo 09-02-2021 18:04:39

Asi es Angel, lo que pasa es que te di codigo para la version 9.0.14 de Indy.

Angel.Matilla 11-02-2021 17:34:10

Yop tengo la 10.6.2.0. Seguiré investigando. Gracias.


La franja horaria es GMT +2. Ahora son las 16:48:32.

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