Buen día. Esta vez tratare de explicar una forma para generar y enviar por correo electrónico un documento en PDF. (claro puede ser en cualquier otro formato que el componente ofrezca pero ahora lo hice con PDF). espero y sea de ayuda.
En este primer paso vamos a guardar el documento en PDF.
Código Delphi
[-]
procedure TFormCatalogo.SpeedButtonExportarClick(
Sender: TObject);
var
IDMaestro : integer;
Ruta : string;
saveDialog : TSaveDialog;
ArchivoPDF : String;
begin
try
Screen.Cursor := crHourGlass;
IDMaestro := ADOQueryCatalogo.FieldByName('ID').AsInteger;
DatosParaImpresion(IDMaestro);
saveDialog := TSaveDialog.Create(self);
saveDialog.Title := 'Guardar Archivo';
saveDialog.Filter := 'PDF|*.pdf';
saveDialog.DefaultExt := 'pdf';
saveDialog.FilterIndex := 1;
if saveDialog.Execute then
begin
FRuta := saveDialog.FileName;
saveDialog.Free;
ppReport.ShowPrintDialog := False;
ppReport.DeviceType := 'PDF';
ppReport.PDFSettings.Author := 'Autor';
ppReport.TextFileName := FRuta;
end;
ppReport.Print;
EnviaCorreoElectronico;
Screen.Cursor := crDefault;
except
on E:Exception do
begin
Screen.Cursor := crDefault;
raise Exception.Create('Error el exportar a formato PDF:'+#13+ E.Message);
end;
end;
end;
Ahora para enviar el correo electrónico se necesitan dos componentes en la pestaña indy Clients necesitamos el objeto IdSMTP y en la pestaña Indy Misc necesitamos el objeto IdMessage. ahora vamos a configurar.
Código Delphi
[-]
procedure TFormCatalogo.EnviaCorreoElectronico;
var
NombreUsuario : string;
Correo : string;
Password : string;
Host : string;
Puerto : string;
Autenticacion : TAuthenticationType;
Firma : string;
Destinatario : string;
SMTP: TIdSMTP;
Mensaje: TIdMessage;
Adjunto: TIdAttachment;
IDMaestro : integer;
begin
with ADOQueryRecuperaConfigMail do
begin
Close;
Parameters.ParamByName('IDUsuario').Value := FUsuarioLink;
Open;
NombreUsuario :=
FieldByName('NOMBREDELUSUARIO').AsString;
Correo :=
FieldByName('CORREO').AsString;
Password :=
FieldByName('CONTRASEÑA').AsString;
Host :=
FieldByName('HOST').AsString;
Puerto :=
FieldByName('PUERTO').AsString;
if FieldByName('AUTENTICACION').AsString = '' then
Autenticacion := atLogin
else
Autenticacion :=
FieldByName('AUTENTICACION').AsVariant;
Firma :=
FieldByName('FIRMA').AsString;
end;
Destinatario :=
ADOQueryReporte.FieldByName('EMAIL').AsString;
if Destinatario = '' then
raise Exception.Create('No existe correo electronico del destinatario.');
SMTP := TIdSMTP.Create( nil );
SMTP.Username := Correo;
SMTP.Password := Password;
SMTP.Host := Host;
SMTP.Port := StrToInt(Puerto);
SMTP.AuthenticationType := Autenticacion;
Mensaje := TIdMessage.Create( nil );
Mensaje.Clear;
Mensaje.From.Name := NombreUsuario;
Mensaje.From.Address := Correo;
Mensaje.Subject := 'Asunto';
Mensaje.Body.Text := 'Cuerpo del mensaje '+#13+#13+Firma;
Mensaje.Recipients.Add;
Mensaje.Recipients.Items[0].Address := Destinatario;
if not ADOQueryReporteDetalle.IsEmpty then
begin
Adjunto := TIdAttachment.Create(Mensaje.MessageParts,FRuta);
end
else
Adjunto := nil;
if MessageDlg('El correo electrónico que se enviara es el siguiente:'+#13+#13+
'Usuario: '+NombreUsuario+#13+
'Correo: '+Correo+#13+#13+
'Destinatario: '+Destinatario+#13+#13+
'Ruta de Archivo Adjunto:'+FRuta+#13+#13+
'Asunto: Asunto'+#13+
'Body: '+#13+
'Cuerpo del mensaje '+#13+#13+Firma,
mtConfirmation, mbYesNoCancel, 0) = mrYes then
begin
try
SMTP.Connect;
except
raise Exception.Create('Error al conectar con el servidor.');
end;
if SMTP.Connected then
begin
try
SMTP.Send( Mensaje );
except
raise Exception.Create('Error al enviar el mensaje.');
end;
try
SMTP.Disconnect;
except
raise Exception.Create('Error al desconectar del servidor.');
end;
end;
if Adjunto <> nil then
FreeAndNil( Adjunto );
FreeAndNil( Mensaje );
FreeAndNil( SMTP );
Application.MessageBox('Mensaje enviado correctamente.',
' ',MB_ICONINFORMATION );
end;
end;
Bueno de mi parte es todo espero les sea de ayuda. Muchas gracias por leerme. Se aceptan criticas y mejoras al código. Muchas gracias