Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > FireMonkey
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-03-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Enviar Correo con Archivo Ajunto Stream (pdf)

Buen dia amigo, estoy tratando de enviar un correo desde la aplicacion pero se me presentan 2 problemas:
1. Necesito limpiar los Archivo adjunto antes de enviarlo ya que cuando llega al correo me aparece que tiene varios archivos adjunto (asumo que con todas la pruebas que hice aun conserva en la memori los que envie anteriormente)
2. Nececito Generar un Stream del archivo PDF para no que guardar el archivo en el PC o Movil y obviamente enviar directamente al Destinatario como archivo adjunto.

Les envio el codigo que tengo actualmente aunque aun tiene problema pero quiero ver si alguien me ayude a que funcione:

Código Delphi [-]
procedure TForm1.TMSFMXToolBarButton42Click(Sender: TObject);
var
filename: TStream;
//filename: String;
s1: tStream;
  begin
     s1 := TMemoryStream.Create;
     frxReport1.PrepareReport();
     frxReport1.Export(frxPDFExport1);
     frxReport1.SaveToStream(s1);
    begin
    UniQueryEmail.Close;
    UniQueryEmail.SQL.Clear;
    UniQueryEmail.SQL.Add('Select * from Email');
    UniQueryEmail.SQL.Add('where instrut = :instrut');
    UniQueryEmail.ParamByName('instrut').AsString := LabelRutInst.Text;
    UniQueryEmail.Open;
    if not uniqueryemail.Eof  then
       begin
         filename := s1;
         try
         IdSMTP.Host := UniQueryEmailSMTP_HOST.AsString;
         IdSMTP.Password  := UniQueryEmailSMTP_PASSWORD.AsString;
         IdSMTP.Port := StrToInt(UniQueryEmailSMTP_PORT.AsString);
         IdSMTP.Username := UniQueryEmailSMTP_USERNAME.AsString;
         data.Subject := 'PRUEBA DE ENVIO';//edit3.Text; ???????????????
         data.Recipients.EMailAddresses := LabelPacEmail.Text;
         data.Body := memo1.Lines;
         data.AttachmentTempDirectory := filename;
         TIdAttachmentfile.create(data.MessageParts,filename); //es aquí donde tengo el problema asumo que sea por incompatibilidad de archivo o seguramente no lo estoy haciendo de la forma correcta
           try
           IdSMTP.Connect;
           IdSMTP.Send(Data);
           finally
            IdSMTP.Disconnect(true);
            ShowMessage('Correo enviado con exito');
           end;

         Except

          on E: exception do
             ShowMessage(E.Message)

         end;


       end
       else
       begin
         ShowMessage('No se puede enviar el EMAIL');
       end;
    
    end;
  end;
Responder Con Cita
  #2  
Antiguo 08-03-2023
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
En tu código veo que declaras dos TStream y no tengo muy claro al final como los manejas....
Cita:
Empezado por giantonti1801 Ver Mensaje


Código Delphi [-]
procedure TForm1.TMSFMXToolBarButton42Click(Sender: TObject);
var
filename: TStream;
//filename: String;
s1: tStream;
  begin
...
  end;
Dando por hecho que la parte de guardar el PDF en un stream te funciona bien y el problema es en el envio de correo, te paso una adaptación del codigo que yo utilizo y que espero te pueda servir

Código Delphi [-]
uses
  IdAttachmentFile, IdText, IdAttachment, IdMessageParts; 


function TForm2.prepareMessage(AToMail, ASubject: string; ABody: TStrings; AFileStream: TStream; AFileName: string): Boolean;
var
  CCListMail: string;
  HTMLFormat: Boolean;
begin
  Result := False;
  HTMLFormat := true;
  CCListMail := '';

  with IdMessage do begin
    clear;
    Body.clear;

    Recipients.EMailAddresses := AToMail;

    From.Address := FromMail;
    From.Name := FromNombre;
    ReplyTo.Add.Address := FromMail;
    if (CCListMail <> '') then
      BccList.EMailAddresses := CCListMail;

    Subject := ASubject;

      //se insertan los ficheros adjuntos
    with TIdAttachmentFile.Create(MessageParts) do begin
      AFileStream.Seek(0, 0);
      LoadFromStream(AFileStream);
      FileName := ExtractFileName(AFileName);
    end;

    if HTMLFormat then begin
        //la parte del mensaje que contienes HTML
      ContentType := 'multipart/mixed';
      with TIdText.Create(MessageParts, nil) do begin
        ContentType := 'text/html';
        Body.AddStrings(ABody);
      end;

      Body.Add('This is a multi-part message in MIME format.');
    end
    else begin
      ContentType := 'text/plain';
      Body.AddStrings(ABody);
    end;
  end;

  result := True;
end;

function TForm2.SendMail: Boolean;
begin
  result := false;

  // se carga la configuracion del SMTP
  getSMTPConfig;

  IdSMTP.Connect;
  if IdSMTP.connected then
  try
    IdSMTP.Send(IdMessage);
    result := True;
  finally
    IdSMTP.Disconnect(true);
  end;
end;

procedure LoadBitmapIntoStream(stream: TStream; AFileName: string);
var
  Bitmap: TBitmap;
begin
  /// Aqui es donde se carga el contenido del fichero en en un memoryStream
  /// Para las pruebas yo las he realizado con un simple BMP
  Bitmap := TBitmap.create;
  try
    Bitmap.LoadFromFile(AFileName);
    Bitmap.SaveToStream(stream);
  finally
    Bitmap.Free;
  end;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  Email, asunto: string;
  FileStream: TStream;
  MailFileName: string;
begin
  FileStream := TMemoryStream.Create;
  try
    /// carga el contenido del fichero en en un memoryStream, puede ser una imagen o un fichero PDF o cualquier otro contenido
    LoadBitmapIntoStream(FileStream, 'c:\a\icon_title2.bmp');

    Email := Destinatario; // 'uncorreo@servidor.com';
    asunto := 'El asunto del correo. Esto es una prueba de correo';
    MailFileName := 'MyImagen.bmp'; 
    /// MailFileName es el nombre que aparecera  en el email del receptor. 
    /// No tiene por que ser el mismo nombre que tiene originalmente.

    if not prepareMessage(Email, asunto, memo1.Lines, FileStream, MailFileName) then
      showMessage('Error en el proceso de preparacion del email')
    else if not SendMail then
      showMessage('No se pudo enviar el EMAIL')
    else
      ShowMessage('Correo enviado con exito');
  finally
    FileStream.Free;
  end;
end;

Última edición por bucanero fecha: 08-03-2023 a las 10:00:29. Razón: modificacion del codigo
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Enviar Stream a un frxRichView de FastReport santiago14 Impresión 1 12-10-2016 20:41:17
ENVIAR CORREO mi cuenta de correo es GMAIL ASAPLTDA PHP 1 16-11-2006 00:54:03
Problemas al Enviar Correo con Ciertas Dir. de Correo AGAG4 Internet 2 01-02-2006 20:37:42
Enviar stream por internet a varias ip's a la vez federicoboga Internet 5 27-06-2005 06:18:09
Enviar un Stream y mostrar el progreso johncook Internet 0 22-10-2004 17:05:43


La franja horaria es GMT +2. Ahora son las 16:50:35.


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
Copyright 1996-2007 Club Delphi