PDA

Ver la Versión Completa : Una función para enviar Email en XE10


darkamerico
12-04-2016, 00:24:40
Saludos amigos, he visto varias implementaciones antiguas de procedimientos para enviar Emails usando Indy, las he probado y no funcionan en XE10, quizás alguno de ustedes tiene una función que trabaje.

Saludos

Casimiro Notevi
12-04-2016, 00:33:53
¿Cuales has probado y qué problemas has tenido?

Neftali [Germán.Estévez]
12-04-2016, 16:23:00
¿Desde dónde o con qué cuenta quieres enviar el Mail?
¿Qué error te da?
¿En ejecución o en compilación?
...

darkamerico
12-04-2016, 19:19:09
¿Cuales has probado y qué problemas has tenido?

He estado intentando hacer que funcione esta:

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
IdSMTPBase, IdSMTP, IdMessage, IdAttachment, IdAttachmentFile, Vcl.StdCtrls,
IdServerIOHandler, IdSSL, IdSSLOpenSSL, IdIOHandler, IdIOHandlerSocket,
IdIOHandlerStack;

procedure SendEmail(const Recipients: string; const Subject: string; const Body: string);
var
SMTP: TIdSMTP;
Email: TIdMessage;
SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
SMTP := TIdSMTP.Create(nil);
Email := TIdMessage.Create(nil);
SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

try
//SSLHandler.MaxLineAction := maException;
SSLHandler.SSLOptions.Method := sslvTLSv1;
SSLHandler.SSLOptions.Mode := sslmUnassigned;
SSLHandler.SSLOptions.VerifyMode := [];
SSLHandler.SSLOptions.VerifyDepth := 0;

SMTP.IOHandler := SSLHandler;
SMTP.Host := 'smtp.gmail.com';
SMTP.Port := 587;
SMTP.Username := 'darkamerico7@gmail.com';
SMTP.Password := '------'; //La clave del email
SMTP.UseTLS := utUseExplicitTLS;

Email.From.Address := 'darkamerico7@gmail.com';
Email.Recipients.EmailAddresses := Recipients;
Email.Subject := Subject;
Email.Body.Text := Body;

SMTP.Connect;
SMTP.Send(Email);
SMTP.Disconnect;

finally
SMTP.Free;
Email.Free;
SSLHandler.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SendEmail('darkamerico7@gmail.com','Hula','Ciao');
end;

Obtengo el siguiente error:

http://s22.postimg.org/hde9stmw1/error_Send_Email.png

Saludos

darkamerico
12-04-2016, 19:21:32
He estado intentando hacer que funcione esta:

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
IdSMTPBase, IdSMTP, IdMessage, IdAttachment, IdAttachmentFile, Vcl.StdCtrls,
IdServerIOHandler, IdSSL, IdSSLOpenSSL, IdIOHandler, IdIOHandlerSocket,
IdIOHandlerStack;

procedure SendEmail(const Recipients: string; const Subject: string; const Body: string);
var
SMTP: TIdSMTP;
Email: TIdMessage;
SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
SMTP := TIdSMTP.Create(nil);
Email := TIdMessage.Create(nil);
SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

try
//SSLHandler.MaxLineAction := maException;
SSLHandler.SSLOptions.Method := sslvTLSv1;
SSLHandler.SSLOptions.Mode := sslmUnassigned;
SSLHandler.SSLOptions.VerifyMode := [];
SSLHandler.SSLOptions.VerifyDepth := 0;

SMTP.IOHandler := SSLHandler;
SMTP.Host := 'smtp.gmail.com';
SMTP.Port := 587;
SMTP.Username := 'darkamerico7@gmail.com';
SMTP.Password := '------'; //La clave del email
SMTP.UseTLS := utUseExplicitTLS;

Email.From.Address := 'darkamerico7@gmail.com';
Email.Recipients.EmailAddresses := Recipients;
Email.Subject := Subject;
Email.Body.Text := Body;

SMTP.Connect;
SMTP.Send(Email);
SMTP.Disconnect;

finally
SMTP.Free;
Email.Free;
SSLHandler.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SendEmail('darkamerico7@gmail.com','Hula','Ciao');
end;

Obtengo el siguiente error:

http://s22.postimg.org/hde9stmw1/error_Send_Email.png

Saludos

Tuve que copiar los archivos: libeay32.dll y ssleay32.dll en el directorio del proyecto.

darkamerico
12-04-2016, 19:23:57
El error es en tiempo de ejecución luego de presionar el botón.

roman
12-04-2016, 21:34:25
Bueno, a veces sirve leer los mensajes de error. Por ejemplo, éste dice:


Learn more at
https://support.google.com/mail/answer/14257?rd=1


en donde, al menos en mi caso, después de intentar alguna cosa, se da uno cuenta de que no es un problema tanto de programación sino de lo insoportable que se ha vuelto gmail:


Se ha evitado un intento de inicio de sesión.


Hola, XXXX:
Alguien acaba de intentar iniciar sesión en tu cuenta de Google, xxxx@gmail.com, en una aplicación que no cumple los estándares de seguridad modernos.


LineComment Saludos

roman
12-04-2016, 21:49:37
Ahora bien, desconozco como hacer que tu aplicación cumpla esos estándares de seguridad pero en tu cuenta de gmail está la opción "Permitir que las aplicaciones menos seguras accedan a tu cuenta" (indicada en la página en cuestión). Haciendo esto, se puede ya mandar el correo. Claro, está que eso no es lo que recomiendan.

LineComment Saludos

darkamerico
12-04-2016, 22:45:28
Ahora bien, desconozco como hacer que tu aplicación cumpla esos estándares de seguridad pero en tu cuenta de gmail está la opción "Permitir que las aplicaciones menos seguras accedan a tu cuenta" (indicada en la página en cuestión). Haciendo esto, se puede ya mandar el correo. Claro, está que eso no es lo que recomiendan.

LineComment Saludos

En primer lugar, gracias por contestar amigo; referente al tema en cuestión, me deja aun mas preocupado luego de leer tus comentarios, será que con el tiempo nadie "No Debidamente Autenticado" podrá enviar emails a servidores como google, hotmail, etc..., en otras palabras, que opciones nos quedan, interactuar solamente con servidores privados?

Un Abrazo

Americo

darkamerico
12-04-2016, 22:51:38
Bueno, leyendo el mensaje de error que me indicó roman, fui a la configuracion de mi cuenta de gmail y active la opcion de Recibir Correos de Dispositivos menos seguros y ... eureka, llegó el correo:

http://s21.postimg.org/u0bskz9qv/exito.jpg

Saludos