![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Gracias Antonio. No me había percatado de ese detalle aunque la verdad es que no sé si fiarme mucho.
A ver si llega ese día, todo se bloquea y nos pilla en "bragas" porque usar oauth no parece fácil. Saludos.
__________________
Be water my friend. |
|
#2
|
||||
|
||||
|
"Contraseña de aplicación" sigue funcionando, lo uso desde hace años.
Seguramente con el tiempo lo irán cambiando también, pero de momento no hay fechas que yo sepa.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#3
|
|||
|
|||
|
hola a todos,
refloto el tema, porque en outlook, no me funcionan las contraseñas de aplicación. El caso es que en GMail funciona perfectamente. Outlook permite crear contraseñas de aplicación, previa activación de la verificación en dos pasos, pero no deja indicar para qué aplicación; simplemente te crea una contraseña, sin indicar el tipo de aplicación ni a qué tiene acceso. Y aunque la pongas esa contraseña en los datos del smtp, no funciona. Sigue apareciendo el error: 535 5.7.139 Authentication unsuccessful, basic authentication is disabled SMTP: smtp-mail.outlook.com - También he probado : smtp.office365.com STARTTLS on port: 587 user: [email protected] pass: yyy |
|
#4
|
|||
|
|||
|
Le pregunte a mi querido ChatGPT y me dice:
Implementar el envío de correos electrónicos con OAuth2 en Delphi utilizando Indy10 implica varios pasos, incluyendo la configuración de OAuth2, el uso de las bibliotecas de Indy para enviar correos y la autenticación con el token de acceso. A continuación, te proporcionaré una guía paso a paso sobre cómo hacerlo. Requisitos Previos Delphi con Indy10: Asegúrate de que tienes Delphi instalado con las bibliotecas Indy10 disponibles. Cuenta de Correo: Necesitarás una cuenta de correo electrónico que soporte OAuth2 (por ejemplo, Gmail, Outlook). Bibliotecas Adicionales: Es posible que necesites las bibliotecas de OAuth2, como IdOAuth2 de Indy. Paso 1: Configuración de OAuth2 Para usar OAuth2, necesitas registrar tu aplicación en la consola de desarrolladores de tu proveedor de correo electrónico (por ejemplo, Google). Esto te proporcionará: Client ID Client Secret Redirect URI Paso 2: Obtener el Token de Acceso Para obtener un token de acceso, deberás realizar el flujo de autorización de OAuth2. Aquí te muestro cómo hacerlo utilizando una función de ejemplo. El proceso de obtención del token puede variar dependiendo del proveedor de servicios de correo electrónico. Ejemplo de obtención del token de acceso: Código:
uses
IdHTTP, IdSSL, IdSSLOpenSSL, System.JSON;
function GetAccessToken(ClientID, ClientSecret, RefreshToken: string): string;
var
IdHTTP: TIdHTTP;
IdSSL: TIdSSLIOHandlerSocketOpenSSL;
Params: TStringList;
Response: string;
JSONResponse: TJSONObject;
begin
IdHTTP := TIdHTTP.Create(nil);
IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
Params := TStringList.Create;
try
IdHTTP.IOHandler := IdSSL;
// Establecer los parámetros para la solicitud de token
Params.Add('client_id=' + ClientID);
Params.Add('client_secret=' + ClientSecret);
Params.Add('refresh_token=' + RefreshToken);
Params.Add('grant_type=refresh_token');
// Hacer la solicitud POST para obtener el token
Response := IdHTTP.Post('https://oauth2.googleapis.com/token', Params);
JSONResponse := TJSONObject.ParseJSONValue(Response) as TJSONObject;
try
Result := JSONResponse.GetValue('access_token').Value; // Extraer el token
finally
JSONResponse.Free;
end;
finally
Params.Free;
IdSSL.Free;
IdHTTP.Free;
end;
end;
Una vez que hayas obtenido el token de acceso, puedes usar Indy10 para enviar correos electrónicos. Ejemplo de envío de correo: Código:
uses
IdSMTP, IdMessage;
procedure SendEmail(EmailAddress, Subject, Body, AccessToken: string);
var
SMTP: TIdSMTP;
Msg: TIdMessage;
begin
SMTP := TIdSMTP.Create(nil);
Msg := TIdMessage.Create(nil);
try
// Configurar SMTP
SMTP.Host := 'smtp.gmail.com'; // Cambia según tu proveedor
SMTP.Port := 587;
SMTP.UseTLS := utUseExplicitTLS;
// Establecer las credenciales con el token de acceso
SMTP.AuthType := atOAuth2;
SMTP.OAuth2.ClientID := '<Tu Client ID>';
SMTP.OAuth2.ClientSecret := '<Tu Client Secret>';
SMTP.OAuth2.AccessToken := AccessToken;
SMTP.Username := EmailAddress; // La dirección de correo electrónico
// Crear el mensaje
Msg.From.Address := EmailAddress;
Msg.Recipients.Add.Email := EmailAddress; // Cambia según el destinatario
Msg.Subject := Subject;
Msg.Body.Text := Body;
// Conectar y enviar el mensaje
SMTP.Connect;
try
SMTP.Send(Msg);
finally
SMTP.Disconnect;
end;
finally
Msg.Free;
SMTP.Free;
end;
end;
Paso 4: Integrar Todo Ahora puedes integrar los pasos anteriores en tu aplicación. Aquí tienes un ejemplo de cómo podrías usar las funciones: Código:
procedure TForm1.btnSendEmailClick(Sender: TObject);
var
AccessToken: string;
begin
// Obtén el token de acceso
AccessToken := GetAccessToken('<Tu Client ID>', '<Tu Client Secret>', '<Tu Refresh Token>');
// Envía el correo
SendEmail('<[email protected]>', 'Asunto', 'Cuerpo del mensaje', AccessToken);
end;
Manejo de Errores: Asegúrate de implementar el manejo de errores en el código de producción. Seguridad: Mantén tus credenciales seguras y no las incluyas directamente en el código. Bibliotecas de Dependencia: Asegúrate de que las bibliotecas de Indy y las dependencias de SSL estén correctamente configuradas en tu proyecto. Pruebas: Realiza pruebas exhaustivas para asegurarte de que el flujo de autorización y el envío de correos funcionen correctamente. Con esto deberías poder enviar correos electrónicos utilizando Indy10 y OAuth2 en Delphi. |
|
#5
|
||||
|
||||
|
Tengo un programa en funcionamiento que usa estos parámetros, prueba con ellos:
Cita:
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#6
|
|||
|
|||
|
Muchas gracias NavBouy,
un código fantástico que le servirá a muchos! Tengo claro, obtener el Token y con ese token enviar el correo. Tengo que tener una cuenta outlook propia de mi aplicación, darme de alta en Azure, añadir mi aplicación. Ahí obtengo mi IdClient, mi client Secret y refresh token. ¿Con eso obtengo el token y envío como si fuese el cliente? ¿Donde se tiene en cuenta la contraseña del cliente? Si mañana otro cliente mio que tenga yahoo o un servidor de esos que te hacen una web y te crean un dominio y redirigen el mail, ¿¿tengo que dar de alta mi aplicación para tener ese ClientId, clientSecret y tokenRefresh y poder acceder al smtp enviar correos desde ese servidor?? |
|
#7
|
|||
|
|||
|
supongo que si, yo no he hecho ninguna app con eso del correo con Tokens pero imagino que se obtiene en la propia cuenta de Google o quien sea el proveedor (en algun sitio debe estar)
y si, lo de la contraseña y eso debe pedirsela al usuario en algun panel de configuracion o algo y que la guarde en algun sitio para no estar pidiendosela siempre. ChatGPT me informo de esto (sorry por poner codigo en C++): Cita:
Código:
// Paso 1: Crear las credenciales en Google Cloud Console
// Paso 2: Obtener el código de autorización usando el endpoint de autorización de Google
// Paso 3: Intercambiar el código de autorización por un token de acceso
#include <curl/curl.h>
#include <json/json.h>
// Requiere libcurl y una biblioteca de JSON
void getAccessToken(std::string clientID, std::string clientSecret, std::string authCode) {
CURL* curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded");
std::string postFields = "code=" + authCode +
"&client_id=" + clientID +
"&client_secret=" + clientSecret +
"&redirect_uri=urn:ietf:wg:oauth:2.0:oob" +
"&grant_type=authorization_code";
curl_easy_setopt(curl, CURLOPT_URL, "https://oauth2.googleapis.com/token");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postFields.c_str());
// Enviar la solicitud y obtener el token de acceso
res = curl_easy_perform(curl);
// Si el resultado es CURLE_OK, el token se habrá recibido
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
}
El token de acceso es utilizado para autenticar cualquier solicitud que haga tu aplicación a la API de Gmail. Debes incluirlo en el encabezado HTTP de la solicitud como un "Bearer token": Código:
Authorization: Bearer YOUR_ACCESS_TOKEN CODIGO DELPHI: Código:
uses
IdHTTP, IdSSLOpenSSL, System.SysUtils, System.Classes;
procedure GetAccessToken(const ClientID, ClientSecret, AuthCode: string);
var
HTTP: TIdHTTP;
SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
Params: TStringList;
Response: TStringStream;
begin
HTTP := TIdHTTP.Create(nil);
SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
Params := TStringList.Create;
Response := TStringStream.Create;
try
HTTP.IOHandler := SSLHandler;
// Configurar los parámetros para la solicitud POST
Params.Add('code=' + AuthCode);
Params.Add('client_id=' + ClientID);
Params.Add('client_secret=' + ClientSecret);
Params.Add('redirect_uri=urn:ietf:wg:oauth:2.0:oob');
Params.Add('grant_type=authorization_code');
// Hacer la solicitud POST para obtener el token de acceso
try
HTTP.Post('https://oauth2.googleapis.com/token', Params, Response);
ShowMessage('Response: ' + Response.DataString); // Aquí obtienes el token de acceso en formato JSON
except
on E: Exception do
ShowMessage('Error: ' + E.Message);
end;
finally
HTTP.Free;
SSLHandler.Free;
Params.Free;
Response.Free;
end;
end;
TIdHTTP se utiliza para hacer la solicitud HTTP POST a la URL de Google (https://oauth2.googleapis.com/token). Los parámetros necesarios para la solicitud POST se agregan al TStringList, como el código de autorización, el client ID y el client secret. El SSLHandler (de Indy) se utiliza para manejar la conexión segura a los servidores de Google. El resultado de la solicitud se guarda en un TStringStream (en formato JSON), que contiene el token de acceso. Uso del token de acceso: Una vez que obtengas el token de acceso (en formato JSON), podrás extraer el campo access_token y utilizarlo en futuras solicitudes HTTP a la API de Gmail, enviándolo en el encabezado de autenticación como un "Bearer token". Ejemplo de uso del token de acceso en otra solicitud: Código:
procedure SendAuthenticatedRequest(const AccessToken: string);
var
HTTP: TIdHTTP;
SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
Response: TStringStream;
begin
HTTP := TIdHTTP.Create(nil);
SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
Response := TStringStream.Create;
try
HTTP.IOHandler := SSLHandler;
HTTP.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + AccessToken;
try
HTTP.Get('https://www.googleapis.com/gmail/v1/users/me/messages', Response);
ShowMessage('Response: ' + Response.DataString);
except
on E: Exception do
ShowMessage('Error: ' + E.Message);
end;
finally
HTTP.Free;
SSLHandler.Free;
Response.Free;
end;
end;
Consideraciones adicionales: Recuerda que el token de acceso tiene un tiempo de vida limitado (normalmente 1 hora). Después, deberás usar un token de actualización para solicitar un nuevo token de acceso. Necesitarás el paquete OpenSSL para Delphi si no lo tienes instalado. Última edición por navbuoy fecha: 14-10-2024 a las 11:53:35. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Problemas con SMTP en smtp.office365.com | gguerrini | Internet | 5 | 14-10-2021 16:28:26 |
| Envio de correos SIN SSL | Rc96 | Internet | 4 | 15-09-2017 19:42:58 |
| ?Envio de correos ? | jasmad | Lazarus, FreePascal, Kylix, etc. | 16 | 02-10-2012 15:45:02 |
| servidor de correos SMTP | metroyd | Varios | 0 | 21-10-2007 23:57:36 |
| Envio de Correos Masivo | Esau | Internet | 2 | 10-04-2007 01:46:11 |
|