PDA

Ver la Versión Completa : Documento word sin grabar a disco por correo


LucianoRey
29-09-2006, 00:26:43
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
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
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 por las ideas, aqui esta el codigo que originalmente me sirvio, por si les sirve.


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í (http://www.clubdelphi.com/foros/showthread.php?t=36421) dejo la historia

Saludos