Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Servers (https://www.clubdelphi.com/foros/forumdisplay.php?f=9)
-   -   Documento word sin grabar a disco por correo (https://www.clubdelphi.com/foros/showthread.php?t=36016)

LucianoRey 29-09-2006 00:26:43

Documento word sin grabar a disco por correo
 
Hola, espero me puedan ayudar, les cuento que tengo que hacer una aplicación donde tengo una plantilla de word que tengo que enviar por correo.

Esta plantilla lleva el nombre de la persona, el cual sale de mi base de datos.

Bueno ya genere mi plantilla, (gracias al foro he aprendido todo esto), ya puedo ver que se genera con los nombre de cada persona, sin embargo cuando hago esto me genera un documento sin nombre, por cada uno y esta bien, pero de esta forma tendria que guardar cada archivo y despues tomar el nombre de cada archivo para enviarlo por correo(cosa que tambien aprendi buscando en el foro).

Mi pregunta es, hay forma de que se genere la plantilla con cada nombre e inmediatamente enviarla por correo?, sin tener que guardar la plantilla de cada registro y luego enviarla.

Perdón si estoy mal en el foro que use, pero vi varios mensajes parecidos y me dije aqui es.

Saludos y gracias de antemano.

LucianoRey 03-10-2006 19:29:19

Documento word sin grabar a disco por correo
 
Hola de nuevo, alguien podria decirme como muevo este hilo a el de "Servers", ó es algo que solo pueden hacer los moderadores?, si fuera asi, me podria ayudar algun moderador?, gracias.:)

dec 03-10-2006 23:57:28

Hola,

Ya está este Hilo en en el apartado de los Foros que mencionas. ;)

LucianoRey 04-10-2006 20:59:27

Ayuda
 
Alguien podria ayudarme?, replanteo mi duda:

Tengo una plantilla de Word, que quiero enviar por correo, esta plantilla debe llevar datos, que saco de alguna tabla, mi problema es como envio esta plantilla con los datos por correo.

De alguna manera ya lo hice, en donde lleva el nombre del archivo adjunto, le pongo el nombre de la plantilla, pero llega la plantilla vacia, es decir, como está originalmente con los "docvariable" dentro de la plantilla, pero yo quiero que llegue con los datos.

Al hacer el envio me genera una plantilla por cada registro de mi tabla, y le pone por nombre Documento1, Documento2 y asi hasta DocumentoN, pero hasta ahi esos documentos no se han guardado, y si pongo este nombre en donde va el nombre del archivo adjunto me dice que no existe, por eso la pregunta, se puede enviar un documento que no ha sido guardado, pero esta en memoria?, como se haria?, ó tengo que guardar cada documento antes de enviarlo?.

No quiero guardarlo en la pc, porque al generarme un documento por registro y al tener N registros, pues corro el riesgo de quedarme sin espacio en disco

LucianoRey 04-10-2006 21:00:58

De antemano, gracias por la ayuda que me pudieran ofrecer.

Caral 04-10-2006 21:31:00

Hola
No se exactamente como hacer lo que pides pero, si a la fuerza tienes que guardar dicho archivo, por que no haces una carpeta temporal, guardas el archivo, lo envias y lo borras en la misma ejecucion.
Es solo una idea.
Saludos

Caral 04-10-2006 21:34:57

Se me acaba de ocurrir una locura::eek:
Se podra guardar el archivo en una variable y una vez que se envie por el nombre de variable no por el nombre de archivo, esta se elimine de la memoria, ya se estoy alucinando.:D
Solo ideas.:)
Saludos

LucianoRey 04-10-2006 21:35:10

Si gracias, no se me habia ocurrido asi, que tonto soy, lo hare, muchas gracias.

LucianoRey 04-10-2006 21:36:53

Voy a intentar esa ultima, si me sale , les platico, gracias.

LucianoRey 16-10-2006 19:31:32

Gracias
 
Gracias por las ideas, aqui esta el codigo que originalmente me sirvio, por si les sirve.

Código:

unit UWord;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj, OleServer, DB, DBTables;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Table1: TTable;
    DataSource1: TDataSource;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
uses UDMWord, IdSMTP, IdMessage;
procedure TForm1.Button1Click(Sender: TObject);
var
 Word: Variant;
 Documento: Variant;
 smtp: TIdSMTP;
 mail: TIdMessage;
 ArchivoE: String;
 ArchivoS: String;
begin
Word := CreateOleObject('Word.Application');
ArchivoE:='c:\Archivo\Algo.dot';  // mi plantilla de word
ArchivoS:='c:\Envio.doc';  //el archivo que voy a enviar
DataModule1.Table1.Active:=True;
DataModule1.Table1.First;
while not DataModule1.Table1.Eof do
 begin    //abajo, el paso de los datos a mis variables de word
    Documento:=Word.Documents.Open(ArchivoE);
  Documento.Variables.Add('numexp',DataModule1.Table1.FieldValues['numexp']);
  Documento.Variables.Add('asunto',DataModule1.Table1.FieldValues['asunto']);
  Documento.Variables.Add('fojas',DataModule1.Table1.FieldValues['fojas']);
  Documento.Fields.Update;
  Documento.SaveAs(ArchivoS);  //guardo el archivo
  Documento.Close(False);
  smtp:=TIdSMTP.Create(Self);
  mail :=TIdMessage.Create(Self);
  with smtp do
    begin
      Port := 25;
      Host := 'nombre del host';
//      AuthenticationType:=atLogin;
      UserName := 'nombre de mi cuenta de correo';
      PassWord := 'mi password de la cuenta de correo';
    end;
  with mail do
    begin                    //Con bcc para que no se vean todas las direciones a las que envio, bueno aqui solo a una cuenta pero ya adapte a mi necesidad
      BccList.Add;
      BccList[0].Name:='Nombre de la persona a quien envias';
      BccList[0].Address:='su direccion de correo';
      From.Address:= 'mi direccion de correo, como la de arriba';
      Subject:='Asunto del correo';
      Body.Text:='Cuerpo del mensaje';
    end;
    TIdAttachment.Create(mail.MessageParts,ArchivoS);  //adjunto el archivo
  smtp.Connect(30000);
  try
    try
      smtp.Send(mail);
    except
      on E: Exception do
        ShowMessage(E.Message);
    end;
  finally
    if smtp.Connected then
      smtp.Disconnect;
  end;
  DataModule1.Table1.Next;
  mail.Free;
  smtp.Free;
  DeleteFile(ArchivoS);
 end;
end;


Bicho 16-10-2006 19:57:42

Hola, eso es exactamente lo mismo que hice para una aplicación en mi trabajo. Y resulta que esa aplicación hacía lo que pedías en un principio: enviar por correo el documento sin grabar en disco. Con la diferencia de que el documento era un Excel en lugar de un word, pero para el caso es lo mismo.
Era muy sencillo de hacer, y es que el mismo documento tiene un método que es SendMail y desde allí envia por correo con el documento en Excel como fichero adjunto, pero el problema reside en que el correo se envíaba a través del Outlook, con lo que pedía autorización por parte del usuario para poder enviar el correo.

Y lo que yo tenía que hacer era evitar eso, la autorización, no encontramos solución, pero si una alternativa. Guardar el fichero de forma temporal, enviar el correo con un componente Indy o SMTP con el documento adjunto y por ultimo borrar el fichero.

Y va estupendo. Aquí dejo la historia

Saludos


La franja horaria es GMT +2. Ahora son las 15:33:59.

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