Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Acerca de enviar texto con formato... (https://www.clubdelphi.com/foros/showthread.php?t=18819)

JuanBCT 23-02-2005 21:03:01

Acerca de enviar texto con formato...
 
Hola! Después de mucho probar y averiguar; logré enviar un correo electrónico desde mi aplicación (cosa q explico acá). Esto funciona muy bien cuando se manda texto plano, pero los problemas comienzan a surgir al querer mandar texto con formato... el cuerpo de mi mensaje es un TDbRichEdit al cual le puedo cambiar tamaño y tipo de letra. ¿Alguien sabría como se hace para convertir este texto en un formato q guarde esas propiedades?

Leí en algún lugar que los mails como los que leemos en el Outlook están en formato HTML, pero hice la prueba de mandar el código completo de una página a mi cuenta y no lo interpretó, me mostró el código tal cual lo mandé. También leí en un hilo la posibilidad de mandar un .html como adjunto... el tema es que, si bien en webmails como el de yahoo uno abre el mensaje y vé inmediatamente el contenido del .html; en Outlook Express habría que clickear el icono de Adjunto, abrirlo... en fin.

Voy a estar muy agradecido si alguien me puede ayudar con esto, saludos!!

JuanBCT 25-02-2005 17:43:16

Se q esto se ha preguntado antes; pero busco y busco y no encuentro nada q al menos me dé una pauta de como hacerlo... no habrá algún alma caritativa q eche un poco de luz sobre esto? :(

marto 25-02-2005 17:49:00

Wop!

Respecto a cómo mantener el formato... ni idea. Respecto a lo del HTML, para que cualquier cliente de correo lo interprete correctamente tienes que indicar que es html en el content-type del mail.

JuanBCT 04-03-2005 15:23:24

Hola Marto, gracias por tu respuesta... al menos en mi versión de Indy en ContentType hay que poner 'text/html'; creo q también habría q especificar
Código Delphi [-]
IdMessage1.IsEncoded:=true
...
Lo probé copiando un código HTML y funciona perfecto... ahora bien, no queda otra solución que convertir yo el rtf a HTML; o habrá algún componente tipo "HTMLEdit"? :rolleyes:

marto 04-03-2005 16:08:11

Mirate las Jedi, en la paleta Jv Internet trae componentes para trabajar con HTML, pero no sé la potencia que tienen

JuanBCT 07-03-2005 17:48:06

Lo logré!!
 
Finalmente logré enviar el mensaje; explico acá lo que hice por si le sirva a alguien...

1) Guardo el contenido del cuerpo en un archivo RTF temporal
Código Delphi [-]
 Datamodule1.MailsCuerpo_Mail.SaveToFile('C:\WINDOWS\EMKTMP.RTF');

2) Convierto el RTF en HTML (lo hice con una rutina freeware q encontré en Torry.net)

3) Leo el HTML y lo cargo en un RichEdit invisible:
Código Delphi [-]
 try
 Archiv.LoadFromFile('C:\WINDOWS\EMKTMP.HTM');
  for A:=0 to Archiv.Count -1 do
   begin
     SS:=archiv.Strings[A];
     richedit1.Lines.Add(SS);
   end;
 finally
    Archiv.Free;
 end;

4) Mando el mail, y en el Body le asigno el texto del RichEdit invisible:
Código Delphi [-]
 //Seteando propiedades del SMTP
 IdSMTP1.Host:=DbEdit6.Text;
 IdSMTP1.Port:=25;
 //Seteando propiedades del mensaje
 IdMessage1.From.Address:=DbEdit7.Text;
 IdMessage1.Subject:=DbEdit5.Text;
 IdMessage1.Body.Text:=RichEdit1.Text;
 //Envío el mensaje
 try
   try
     IdSMTP1.Connect(1000);
     IdSMTP1.Send(IdMessage1);
     except on E:Exception do
       ShowMessage ('Error. Chequee las direcciones en "Configuración de cuenta".');
     end;
   finally
     if IdSMTP1.Connected then IdSMTP1.Disconnect;
     ShowMessage ('Mensaje enviado.');
   end;

Listo!

JuanBCT 07-03-2005 17:50:19

Perdón, en 3), antes de Archiv.Free; iría esto:

richedit1.Lines.Add('');
richedit1.Lines.Add('</BODY>');
richedit1.Lines.Add('</HTML>');

ContraVeneno 30-09-2005 23:50:54

a mi me sirvió, Gracias :D

ContraVeneno 11-10-2005 00:17:22

Cita:

Empezado por JuanBCT
2) Convierto el RTF en HTML (lo hice con una rutina freeware q encontré en Torry.net)

¿me podrías pasar esa rutina?
Lo que hiciste me resolvió un problema, pero con la conversión que hacía, me surgen más y más problemas. He tratado de buscar esa rutina que mencionas, pero no he podido encontrarla. Si fueras tan amable de facilitármela te lo agradecría mucho.

JuanBCT 17-10-2005 20:08:58

Hola Contraveneno, disculpa que no había visto antes tu mensaje. Acá está la rutina en cuestión... http://www.torry.net/quicksearchd.ph...rter&Title=Yes

... en realidad solo usé r2hconv.pas, lo incluí en el proyecto y lo llamé así:

Código Delphi [-]
r2hconv.rtf2html('C:\WINDOWS\EMKTMP.RTF', 'C:\WINDOWS\EMKTMP.HTM',['']);

(no sé si el autor permite usar el archivo por separado, pero bueno... me tomé esa libertad)

Espero que te sirva, saludos!

ContraVeneno 17-10-2005 20:23:48

No hay problema JuanBCT, la paciencia no es una de mis virtudes, pero entiendo que se atravesó el fin de semana, en fin, no hay problema con eso.

Con la rutina que mencinoas, ya me fuinconó perfecto. Y yo tambien solo utilizé esa unidad, digo, es lo único que necesito ;) .

Muchas Gracias.

Phantom_Drake 27-06-2007 20:41:58

yo intente utilizando ese codigo pero a mi correo me llego puro codigo html y nada de formato podrian ser un poco mas esplicitos por favor :o

ContraVeneno 27-06-2007 23:23:52

Código Delphi [-]
Uses r2hconv

....
procedure Tfrm.EnviaCorreoClick(Sender: TObject);
var strOrigen: string;
begin
  inherited;
  redtMail.lines.SaveToFile('c:\temp.rtf');
  r2hconv.rtf2html('c:\temp.rtf', 'c:\temp.htm', ['']);
  redtHTML.Lines.LoadFromFile('c:\temp.htm');
  redtHTML.Lines.Add('');
  redtHTML.Lines.Add('');
  //leve verificación sobre el fomato de la dirección escrita
   if trim(edtMail0.text)='' then begin
    messagebox(Handle,'No ha escrito la dirección de correo del destinatario seleccionado.'+#13+'Correo No enviado.',
    'Error', MB_ICONError); Exit;
   end else begin
    if not ExecRegExpr('[\w\d\-\.]+@[\w\d\-]+(\.[\w\d\-]+)+',
        edtMail0.Text) then begin
      messagebox(Handle,'La dirección escrita no es una dirección de correo válida.'+#13+'Correo No enviado.',
      'Error', MB_ICONError);
      exit;
      //verificación sobre la segunda dirección
      if trim(edtMail1.text)<>'' then
       if not ExecRegExpr('[\w\d\-\.]+@[\w\d\-]+(\.[\w\d\-]+)+',
         edtMail1.Text) then
           edtMail1.text:='';
    end; //if not execregexpr
   end; //if trim mail0
   //Enviar el mail despues de guardar los datos
   frm.SMTP.Host:=Host;
   frm.SMTP.UserId:=Usuario;
   strOrigen:=strOrigen;
   frm.SMTP.Port:=25;
  with frm.SMTP do begin
   try
    try
     Connect;
    except on E:Exception do begin
     messagebox(Handle,'No se pudo establecer la conexión.'
     ,'Error.',MB_oK+MB_ICONERROR);
     end; //fin except
    end; // fin try - except
   finally
    if Connected then begin
      PostMessage.FromAddress:=strOrigen;
      PostMessage.ToAddress.Text:=edtMail0.Text;
      if edtMail1.Text<>'' then
        PostMessage.ToCarbonCopy.Text:=edtmail1.text;
      with PostMessage.Body do begin
       Clear;
       Add(redtHTML.Text);
      end; //with body
       PostMessage.Subject:=edtAsunto.Text;
       SendMail;
       Disconnect;
      end;
     end; //if connected
   end; //fin try - finally
   end; //with smtp
end;
....

usando un componente SMTP.

Aunque personalmente prefiero utilizar el método ShellExec con un comando mailto.

Más explícito que eso, no creo, pero puedes preguntar :D

Phantom_Drake 28-06-2007 00:03:29

de hecho si tengo dudas aun :p en la linea:
Código Delphi [-]
if not ExecRegExpr('[\w\d\-\.]+@[\w\d\-]+(\.[\w\d\-]+)+',edtMail0.Text) then
marca error en el ExecRegExpr
a ke se debe esto??? :D

elchino_7 28-06-2007 00:06:09

New guy
 
Contraveneno porq prefieres usar el shell q el smtp :confused: cuales son las ventajas y como se usaria:confused::confused::confused::confused:

ContraVeneno 28-06-2007 00:19:11

Cita:

Empezado por Phantom_Drake
marca error en el ExecRegExpr
a ke se debe esto??? :D

http://www.clubdelphi.com/foros/show...hlight=RegExpr

RegExpr

Cita:

Empezado por elchino_7
Contraveneno porq prefieres usar el shell q el smtp :confused: cuales son las ventajas y como se usaria:confused::confused::confused::confused:

Por que utilizando el ShellExec se abrirá el cliente predeterminado de correo. No importa si tienes Outloock, Edore, Thunderbird, etc, etc. Al utilizar este comando se abrirá el que tengas instalado en la máquina donde se ejecute.

Bueno, que el comando ShellExec se puede realizar en una sola línea de código y como puedes ver en este hilo, utilizando un SMTP tienes hacer un show solo para enviar un correo.

Código Delphi [-]
ShellExecute(Handle, 'open', 
'mailto:SomeN@Somewhere.com?subject=MySubject&Attach=''C:\Attachment.txt''',
nil, nil, SW_SHOW)

http://www.clubdelphi.com/foros/showthread.php?t=12158

ContraVeneno 28-06-2007 01:04:57

Cita:

Empezado por elchino_7
Contraveneno porq prefieres usar el shell q el smtp :confused: cuales son las ventajas y como se usaria:confused::confused::confused::confused:

Cita:

Empezado por Guía de estilo
No solicites que te respondan por correo en privado

Los problemas deben ser un proceso público y transparente, durante el cual un primer intento de respuesta puede y debería corregirse si alguien con más conocimientos percibe que la respuesta es incompleta o incorrecta. Además quién te responde obtiene parte de su recompensa al verse que son competentes y útiles a nuestra comunidad.
Cuando pides una respuesta privada, estás interrumpiendo tanto el proceso como la recompensa. No lo hagas.

Guía de estilo


http://www.clubdelphi.com/foros/showthread.php?t=45268

Phantom_Drake 28-06-2007 02:37:10

ah se me olvidaba gracias por la informacion :D

Phantom_Drake 02-07-2007 20:50:38

ke onda otra vez dando lata aki :D otra duda
tengo este codigo para mandar el correo con imagen pero nomas no puedo poner la imagen de fondo en el correo solo sale despues del texto alguien me puede ayudar por favor
Código Delphi [-]
procedure TFrm_Email.Button2Click(Sender: TObject);
var I,J,K,L:Integer;
    cadena,correo:string;
    Check: TcheckBox;
    ChildControl: TControl;
    html: TStrings;
    htmpart, txtpart: TIdText;
    bmppart: TIdAttachment;
    email: TIdMessage;
    //archiv:TStrings;
    filename,ss,filename1: string;
    a:Integer;
    idStars:   TIdAttachment;
    //archiv:t;
begin
  Redt_Texto.Lines.SaveToFile('C:\WINDOWS\EMKTMP.RTF');
  r2hconv.rtf2html('C:\WINDOWS\EMKTMP.RTF', 'C:\WINDOWS\EMKTMP.HTM',['']);
  try
    RichEdit2.lines.LoadFromFile('C:\WINDOWS\EMKTMP.HTM');
    for A:=0 to RichEdit2.lines.Count -1 do
    begin
     SS:=RichEdit2.Lines.Strings[A];
     RichEdit1.Lines.Add(SS);
    end;
  finally
  richedit1.Lines.Add('');
  richedit1.Lines.Add('');
  richedit1.Lines.Add('');
    //RichEdit2.Free;
  end;
 
  if DBLookupComboBox1.Text='' then
    ShowMessage('debe seleccionar un formato')
  else
  begin
    Lst_Mails.Items.Clear;
    with dtm_contactos.Qry_Correos do
    begin
      Close;
      SQL.Clear;
      cadena:='select email from contactos where grupo<''0'' ';
      for I := 0 to GroupBox9.ControlCount - 1 do
        if GroupBox9.Controls[i] is TCheckBox then
          if TCheckBox(GroupBox9.Controls[i]).Checked then
            cadena:=cadena+ ' or grupo='''+(IntToStr(i+1))+'''';
      sql.Add(cadena);
      Open;
      First;
      if Lst_Correos.Items.Count > 0 then
        Lst_Mails.Items:=Lst_Correos.Items;
      while not Eof do
      begin
        Lst_Mails.Items.Add(fieldbyname('email').AsString);
        next;
      end;
    end;
    Lst_Correos.Items.Clear;
    for K:=0 to Lst_Mails.Items.Count -1  do
    begin
      correo:= Lst_Mails.Items.Strings[k];
      CopyFile(PChar('C:\Proyecto Email\Formatos\'+ DBLookupComboBox1.text ),PChar('C:\Archivos de programa\Borland\Delphi7\Projects\'+ DBLookupComboBox1.text),TRUE);
      //filename := ExtractFilePath(Application.ExeName) + '\homerorx.jpg';
      //filename1 := 'C:\Proyecto Email\Formatos\'+ DBLookupComboBox1.text + '''';
      filename := 'C:\Proyecto Email\Formatos\'+ DBLookupComboBox1.text ;
      html := TStringList.Create();
      {html.Add('');
      html.Add('');
      html.Add('');
      html.Add(' 

Hello

'); //html.Add(''); html.Add(''); html.Add('');}
for L:=0 to RichEdit2.lines.Count -1 do begin html.Add(RichEdit2.Lines.Strings[L]); end; email := TIdMessage.Create(nil); email.From.Text := 'origen'; email.Recipients.EMailAddresses := correo; email.Subject := 'Hello'; email.ContentTransferEncoding:= 'multipart/related'; email.IsEncoded:=true; email.Body.Assign(html); txtpart := TIdText.Create(email.MessageParts); txtpart.ContentType := 'text/html'; txtpart.Body.Text := RichEdit2.Text; htmpart := TIdText.Create(email.MessageParts, html); htmpart.ContentType := 'text/html'; bmppart := TIdAttachment.Create(email.MessageParts, filename); bmppart.ContentType := 'image/jpeg'; bmppart.FileIsTempFile := false; bmppart.contenttransfer:='base64'; bmppart.ContentDisposition := 'inline'; bmppart.ExtraHeaders.Values['Content-ID'] := ''; try SMTP.Host:='server'; SMTP.Port:=25; SMTP.Connect(); try SMTP.Send(email); ShowMessage('Sent'); except on E: Exception do ShowMessage('Failed: ' + E.Message); end; finally SMTP.Disconnect(); email.Free(); html.Free(); end; end; end;

aldmoscardi 03-07-2007 16:07:50

Provaste de decirle al componenete que iso vas a utlizar?
Yo e realizado un aplicacion que envia mail en formato HTML, si te interesa manda tu dir de mail que te paso un ejemplo, Saludos:cool:


La franja horaria es GMT +2. Ahora son las 15:11:40.

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