Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Enviar e-mail desde terra.com, gmail.com, yahoo.es, movistar.es, hotmail.com, etc. (https://www.clubdelphi.com/foros/showthread.php?t=87117)

nnebli 16-11-2014 14:35:57

Enviar e-mail desde terra.com, gmail.com, yahoo.es, movistar.es, hotmail.com, etc.
 
Después de haber estado buscando por Internet la forma de enviar e-mail desde diversas cuentas de correo como terra.com, gmail.com, yahoo.es, movistar.es, hotmail.com, etc. no he visto nada que realmente deje claro (a los ojos de los poco curtidos en el tema como yo) como enviarlos. Por eso, y bajo la sugerencia de Newton (al que agradezco desde ya su ayuda), he creado este hilo para intentar que en el mismo se quede claro como enviar e-mail desde distintas cuentas de correo.

En Delphi al Límite ví un ejemplo que funcionó perfectamente con 'terra.com', lo he adaptado un poco para poder enviar varios ficheros adjuntos. Lo pongo a continuación para quien le pueda ser útil.

Agradecería que quien tenga código para enviar un e-mail con más de un fichero adjunto desde distintas cuentas de correo (terra.com, gmail.com, yahoo.es, movistar.es, hotmail.com, etc.) que lo ponga a continuación y así podrá servir de ayuda a todo aquel que lo necesite. Por favor, intentad que el código que se ponga funcione correctamente sin tener que hacer modificaciones apreciables, y si hay que hacerlas, explicarlas para que todos las podamos entender, incluido los menos duchos en Delphi. Gracias.

Código para enviar un e-mail desde 'terra.com' con varios ficheros adjuntos, utiliznado Delphi 7 y Windows XP:

Código Delphi [-]
// Nota: utilizamos varios TEdit para recoger información como el asunto del mensaje, usuario, contraseña, etc.
 
unit EnviarEMailConDelphi7;
interface
uses
IdSMTP, IdMessage, // he añadido estas dos
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;
type
TFPEnviarEMailConDelphi7 = class(TForm)
btnEnviarMensaje: TButton;
Label1: TLabel;
edUsuario: TEdit;
Label2: TLabel;
edContrasenna: TEdit;
Label3: TLabel;
edAsunto: TEdit;
Label4: TLabel;
edDestinatario1: TEdit;
Label5: TLabel;
edTextoDelEmail: TEdit;
procedure btnEnviarMensajeClick(Sender: TObject);
procedure CompruebaTecla(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FPEnviarEMailConDelphi7: TFPEnviarEMailConDelphi7;
 
implementation
Const
// definiemos el máximo número de ficheros adjuntos que se van a poder utilizar
MaximoNumeroDeFicherosAdjuntosp = 5;
var
// definimos aquí este Array para que podamos tener acceso desde cualquier sitio de este programa
RutaYNombreDelFicheroAAdjuntarp : Array[1..MaximoNumeroDeFicherosAdjuntosp] of String;
 
{$R *.dfm}
 
 
procedure EnviarMensaje( sUsuario, sClave, sHost, sAsunto, sDestino, sMensaje: String );
var
SMTP: TIdSMTP;
Mensaje: TIdMessage;
Adjunto : Array[1..MaximoNumeroDeFicherosAdjuntosp] of TIdAttachment;
repite : Integer;
begin
// Creamos el componente de conexión con el servidor
SMTP := TIdSMTP.Create( nil );
SMTP.Username := sUsuario;
SMTP.Password := sClave;
SMTP.Host := sHost;
SMTP.Port := 25;
SMTP.AuthenticationType := atLogin;
// Creamos el contenido del mensaje
Mensaje := TIdMessage.Create( nil );
Mensaje.Clear;
Mensaje.From.Name := sDestino;
Mensaje.From.Address := sDestino;
Mensaje.Subject := sAsunto;
Mensaje.Body.Text := sMensaje;
Mensaje.Recipients.Add;
Mensaje.Recipients.Items[0].Address := sDestino;
 
// adjunta todos los ficheros que se hayan indicado. Máximo 5 ficheros de acuerdo con la definción del Array: RutaYNombreDelFicheroAAdjuntarp
For repite := 1 To MaximoNumeroDeFicherosAdjuntosp Do
Begin
// Si hay que meter un archivo adjunto lo creamos y lo asignamos al mensaje
if RutaYNombreDelFicheroAAdjuntarp[repite] <> '' then
begin
// si existe el fichero a adjuntar lo adjunta
if FileExists( RutaYNombreDelFicheroAAdjuntarp[repite] ) then
Adjunto[repite] := TIdAttachment.Create( Mensaje.MessageParts, RutaYNombreDelFicheroAAdjuntarp[repite] );
end
else
Adjunto[repite] := nil;
End;
// fin de: adjunta todos los ficheros que se hayan indicado. Máximo 10 fichero de acuerdo con la definción del Array: RutaYNombreDelFicheroAAdjuntarp
 
// Conectamos con el servidor SMTP
try
SMTP.Connect;
except
raise Exception.Create( 'Error al conectar con el servidor. ' );
end;
 
// Si ha conectado enviamos el mensaje y desconectamos
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;
 
// Liberamos los objetos creados
For repite := 1 To MaximoNumeroDeFicherosAdjuntosp Do
if Adjunto[repite] <> nil then
FreeAndNil( Adjunto[repite] );
 
FreeAndNil( Mensaje );
FreeAndNil( SMTP );
 
Application.MessageBox( 'Mensaje enviado correctamente. ','Fin de proceso',MB_ICONINFORMATION );
 
end;
 
procedure TFPEnviarEMailConDelphi7.btnEnviarMensajeClick(Sender: TObject);
Var
Usuariop : String;
Clavep : String;
AsuntoMensajep : String;
DireccionDestinop : String;
TextoDelMensajep : String;
begin
// recuperamos de los TEdit los datos
Usuariop := edUsuario.Text;
Clavep := edContrasenna.Text;
AsuntoMensajep := edAsunto.Text;
DireccionDestinop := edDestinatario1.Text;
TextoDelMensajep := edTextoDelEmail.Text;
 
// indicamos la ruta y el nombre donde están los ficheros a adjuntar
RutaYNombreDelFicheroAAdjuntarp[1] := 'C:\documento1.zip';
RutaYNombreDelFicheroAAdjuntarp[2] := 'C:\documento2.zip';
RutaYNombreDelFicheroAAdjuntarp[3] := 'C:\documento3.zip';
RutaYNombreDelFicheroAAdjuntarp[4] := 'C:\documento4.zip';
RutaYNombreDelFicheroAAdjuntarp[5] := 'C:\documento5.zip';
 
// Vamos al procedimiento que envía el mensaje. Nota: Como este correo se envía desde 'terra.com' ponemos: 'smtp.terra.com'
EnviarMensaje( Usuariop, Clavep, 'smtp.terra.com', AsuntoMensajep, DireccionDestinop, TextoDelMensajep);
 
end;
 
procedure TFPEnviarEMailConDelphi7.CompruebaTecla(Sender: TObject;var Key: Char);
begin
If Key = #27 Then
Close;
end;
end.

Fin de: Código para enviar un e-mail desde 'terra.com' con varios ficheros adjuntos, utiliznado Delphi 7 y Windows XP:

nlsgarcia 16-11-2014 17:13:14

nnebli,

Cita:

Empezado por nnebli
...quien tenga código para enviar un e-mail con más de un fichero adjunto...

Cita:

Empezado por nnebli
...Por favor, intentad que el código que se ponga funcione correctamente sin tener que hacer modificaciones apreciables, y si hay que hacerlas, explicarlas para que todos las podamos entender, incluido los menos duchos en Delphi...

:rolleyes:

Revisa esta información:
Espero sea útil :)

Nelson.

newtron 17-11-2014 12:23:48

Amigo nnebli.

Como te prometí te he preparado un ejemplo en el que he intentado hacer un compendio de todo lo que he encontrado por aquí con el tiempo y que envía correos a uno o varios destinatarios insertando uno o varios archivos y usando, o no, SSL que es el problema que tienen los servidores de correos como gmail, yahoo, terra, etc.

No sé qué versión de Indy tienes pero la que tienes que instalar para que esto funcione es la 10 y tienes que copiar a la carpeta del ejecutable las librerías libeay32.dll y ssleay32.dll.

Dependiendo del servidor de correos que uses tendrás que usar un tipo de TLS u otro. Para Gmail, Hotmail y Yahoo tendrás que usar la opción "2-utUseExplicitTLS" y para Terra la "1-utNoTLSSupport".

Un problema que vas a tener con Gmail es que cuando intentas enviar el primer mensaje desde fuera de la web el correo se te bloquea y recibirás un correo del servidor en la cuenta de Gmail pidiendote autorización para poder enviar correos desde fuera de la web, tendrás que entrar en ese mensaje y habilitar la opción.

Los servidores de correo saliente de los distintos servidores de correo son los siguientes:

GMAIL: smtp.gmail.com
HOTMAIL: smtp.live.com
TERRA: smtp.terra.com
YAHOO: pop.mail.yahoo.com

te vendrán bien para no tener que ir buscando por ahí.

Finalmente me estoy dando cuenta de que tú usas Delphi 7 y yo Delphi 2007 con lo que no vas a poder abrir este proyecto pero el .pas si podrás abrirlo para ver cómo funciona, no creo que tengas ningún problema teniendo el ejecutable y el .pas para adaptarlo a tu programa.

De una forma o de otra si tienes algún "atranque" lo comentas.

Saludos

P.D. He hecho una pequeña trampilla que espero no moleste a los moderadores. Como el archivo .rar que estaba subiendo excede de los 293 kb que se pueden subir (no entiendo por qué) he renombrado el archivo como .pdf que si permite algo más de capacidad así que al descargarlo lo vuelves a renombrar como .rar y listo. :D

shoulder 17-11-2014 17:19:04

E-mail
 
Viendo este post un tema, porque yo envio por delphi7 mails a traves del Outlook pero tengo que tener abierto el outlook y minimizado para que funcione. Con lo que vi puedo setear el deplhi como si fuera un outlook propio, es asi, sin tener que abrir previamente el prg outlook?.

newtron 17-11-2014 17:54:39

Cita:

Empezado por shoulder (Mensaje 484934)
Viendo este post un tema, porque yo envio por delphi7 mails a traves del Outlook pero tengo que tener abierto el outlook y minimizado para que funcione. Con lo que vi puedo setear el deplhi como si fuera un outlook propio, es asi, sin tener que abrir previamente el prg outlook?.

Bueno, esto lo que hace es enviar correos, ni los almacena en ningún sitio como elementos enviados, ni tiene agenda de contactos ni todas las opciones que tiene outlook. En caso de querer tener un historial de los correos enviados lo que puedes hacer es poner una copia del correo a una dirección propia para que vayan entrando en esa cuenta y así poder en un momento dado consultarlos.

Saludos

nnebli 17-11-2014 19:18:18

Hola, Newton.

Le he dado un vistazo a la ficheros .Pas y la verdad es que es realmente sencillo, que es lo mejor de todo, poco código y si funciona bien mejor que mejor. Voy a intentar adaptarlo a Delphi 7 y lo probaré a ver qué tal. Cuando tenga algo comento los resultados.

Muchas gracias por tu ayuda.

Saludos.

nnebli 17-11-2014 19:21:48

Por cierto, te pido disculpas Nelson por no decirte nada, miraré también lo que comentas a ver que me puede aportar. La idea es poner el código terminado para que quien esté 'un poco verde como yo' que no se pierda buscando en un sitio y otro. Cuando consiga hacer que envíe e-mails desde otras cuentas que no sean de 'terra.com', subiré el código.

Gracias también por tu ayuda.

Saludos.

newtron 17-11-2014 19:46:11

Cita:

Empezado por nnebli (Mensaje 484939)
Hola, Newton.

Le he dado un vistazo a la ficheros .Pas y la verdad es que es realmente sencillo, que es lo mejor de todo, poco código y si funciona bien mejor que mejor. Voy a intentar adaptarlo a Delphi 7 y lo probaré a ver qué tal. Cuando tenga algo comento los resultados.

Muchas gracias por tu ayuda.

Saludos.

Nada hombre, ya te decía que el código era bastante simple. Espero que te venga bien y recuerda comprobar la versión de las Indy.

Saludos

mamcx 17-11-2014 20:01:12

A menos que estes enviando a "nombre de" otra persona correo, no es recomendable enviar correos por medio de estos servicios. Para ello, existen servicios que son enfocados a aplicaciones como

http://www.mailgun.com/

Y que hacen que si sigues las reglas, no quedes como un spammer.

nnebli 17-11-2014 22:08:38

Hola Newton.

Creo que he solventado algunos baches, pero este no puedo con él:

Me sale un error al compilar:

idSMTP1.UseTLS := utNoTLSSupport; --> Me indica el error que 'UseTLS' no está declarado.

He puesto desde 'Indy Cliente' el TidSMTP pero efectivamente en 'idSMTP1' no aparece 'UseTLS. Me imagino que por eso preguntabas la versión de INDY. Perdona por la pregunta, pero ¿donde puedo ver la versión de Indy? Y lo más importante ¿como puedo solucionar este problema?

Te agradecería tu respuesta.

Saludos.

newtron 18-11-2014 09:35:27

Hola de nuevo.

Si pulsas con el botón derecho en el icono del componente verás que te aparece en la primera línea .... About .... ahí verás la versión de Indy.

Si es una versión antigua, que es lo que me imagino, tendrías que desinstalarla de tu Delphi e instalar la nueva versión que te puedes descargar aquí.

Saludos

nnebli 18-11-2014 22:52:52

La versión de las Indy es la 9.00.10

Voy a ver si consigo instalar la versión 10 y comento resultados.

Gracias.

shoulder 18-11-2014 23:12:05

Outlook Microsoft 2010
 
Porque teniendo el outlook cerrado tengo que decir al usuario que trabaje con el outlook minimizado para que funcionen todas las sentencias que hice de envio de mail en el programa, delphi 7.

la sentencia que uso para ver si esta abierto y comenzar es esta

Cita:

try
Outlook := GetActiveOleObject('Outlook.Application');
except
Outlook := CreateOleObject('Outlook.Application');
end;
.......


si oulook esta minimizado envia mails, los muestra..pero si lo tienen cerrado no lo abre.

newtron 19-11-2014 09:51:10

Cita:

Empezado por shoulder (Mensaje 485040)
Porque teniendo el outlook cerrado tengo que decir al usuario que trabaje con el outlook minimizado para que funcionen todas las sentencias que hice de envio de mail en el programa, delphi 7.

¿Preguntas o afirmas?, deberías abrir un hilo nuevo con esa consulta.

Saludos


La franja horaria es GMT +2. Ahora son las 20:09:18.

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