Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-09-2023
Avatar de HerensugeBeltz
HerensugeBeltz HerensugeBeltz is offline
Miembro
 
Registrado: may 2021
Ubicación: Hondarribia
Posts: 88
Poder: 4
HerensugeBeltz Va por buen camino
Envío de correos SMTP de office365 con Indy10

Hola,

Desarrollamos una aplicación de escritorio (C++Builder 10.1) que usa los componentes Indy incluidos en dicha versión para el envío de emails. El problema es que los clientes que tienen el correo con office365 cada vez tienen más problemas con los envíos y tienen que bajar la seguridad de su cuenta (y me temo que pronto no podrán enviar más correos de la manera tradicional).
Al parecer hay dos alternativas: implementar OAuth2 (no parece algo sencillo en una aplicación de escritorio) o utilizar la API de Microsoft Graph. Alguna solución comercial tal vez?

Mi pregunta es, hay alguien con aplicaciones de escritorio en C++ Builder o Delphi con el mismo problema? Alguien que me pueda informar sobre cómo lo han solucionado?
Agradezco cualquier ayuda que me ayude a seguir adelante.
Gracias.
Responder Con Cita
  #2  
Antiguo 28-09-2023
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.122
Poder: 35
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Diré, no como la solución, pero, como una posible solución (porque, acaso la solución sería una implementación en Delphi sin más), que acaso podría pensarse en usar un "servidor / puente", es decir, supongamos que tenemos un hosting que permite ejecutar PHP (lo que es común), entonces, podríamos implementar acaso el envío del correo en un script PHP, que, recibiese los argumentos necesarios desde una llamada que se hiciese desde nuestra aplicación Delphi.

La idea es dejar al servidor (PHP o cualquier otro lenguaje) lo que es el envío del correo, mientras que, nuestra aplicación Delphi, lo "único" que tendría que hacer sería una llamada HTTP POST al script de nuestro servidor. Este llevaría a cabo la tarea y proporcionaría la respuesta necesaria a nuestra aplicación: "Ok" (Se envío el correo), "Error: Algún error", etc. Ya digo que no es la solución, que, sería implementar el asunto en la propia aplicación Delphi, pero, en fin, lo dejo caer por si pudiera resultar útil en un momento dado.

P.S. Acaso la implementación de "OAuth2" (por ejemplo) sería más sencilla desde el servidor, aunque, insisto en que acaso la verdadera solución sería pegarse con eso en la propia aplicación Delphi, pues, digo yo que debe ser posible hacer algo así. Seguro que algún compañero nos da una mejor pista o solución para implementar el asunto en la propia aplicación Delphi.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 29-09-2023
Avatar de HerensugeBeltz
HerensugeBeltz HerensugeBeltz is offline
Miembro
 
Registrado: may 2021
Ubicación: Hondarribia
Posts: 88
Poder: 4
HerensugeBeltz Va por buen camino
El problema que le veo a tu propuesta es que nuestra aplicación está distribuida en unos 100 clientes; no veo factible configurarle el servidor a cada uno. Por otra parte, si usásemos nuestro servidor, cada vez que tuviesen un problema con el envío nos llamarían a nosotros, además de que en los correos se maneja información confidencial (contrato de la LPD con cada clientes)...
En fin, como bien dices, lo ideal sería implementarlo en la propia aplicación.
Gracias por tu respuesta.
Responder Con Cita
  #4  
Antiguo 29-09-2023
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.122
Poder: 35
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

La verdad es que lleva razón. Es decir, podría acaso haberme ahorrado la respuesta: no es lo que se pretendía hacer, no ofrece una solución, en definitiva, debería haberme ahorrado dicha respuesta. ¡Pido disculpas!
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 29-09-2023
Avatar de HerensugeBeltz
HerensugeBeltz HerensugeBeltz is offline
Miembro
 
Registrado: may 2021
Ubicación: Hondarribia
Posts: 88
Poder: 4
HerensugeBeltz Va por buen camino
Cita:
Empezado por dec Ver Mensaje
Hola a todos,

La verdad es que lleva razón. Es decir, podría acaso haberme ahorrado la respuesta: no es lo que se pretendía hacer, no ofrece una solución, en definitiva, debería haberme ahorrado dicha respuesta. ¡Pido disculpas!
En absoluto. Toda colaboración vale y puede aportar algo.
Un saludo y buen fin de semana.
Responder Con Cita
  #6  
Antiguo 29-09-2023
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.122
Poder: 35
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

En este hilo de Delphi Praxis, donde se trata, justamente, de lo que se trata en este hilo: "Indy + OAuth2", participa el gran Remy Lebeau, y, parece que Indy no soportaría actualmente OAuth2, aunque, se propone alguna posibilidad: pero no se implementa, simplemente se sugiere / propone.

En dicho hilo, un compañero "Delphiano", apunta a este proyecto de Github: creo que podría servirle, de modo que, puede echarle un vistazo a ver qué tal. Sino me equivoco (no lo he mirado con detenimiento) lo que este proyecto hace es, precisamente, lo que Remy Lebeau propone, para dar a Indy soporte para OAuth2.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 02-10-2023 a las 09:47:32.
Responder Con Cita
  #7  
Antiguo Hace 3 Semanas
elguille elguille is offline
Miembro
 
Registrado: ene 2005
Posts: 119
Poder: 21
elguille Va por buen camino
Mediante esta función y las utilidades clever (imagino que se puede hacer igual con Indy) obtengo un token de acceso valido para office365

Código Delphi [-]
function TMainForm.GetOAuth2Token(ClientID, ClientSecret, TenantID: string): string;
var
  Http: TclHttp;
  Request: TclHttpRequest;
  JsonResponse: string;
  JsonObj: TJSONObject;
begin
  Result := '';
  Http := TclHttp.Create(nil);
  Request := TclHttpRequest.Create(nil);
  try
    // Especificar el tipo de contenido
    // Request.ContentType := 'application/x-www-form-urlencoded';

    // Agregar los parámetros para obtener el token
    Request.AddFormField('client_id', ClientID);
    Request.AddFormField('client_secret', ClientSecret);
    Request.AddFormField('scope', 'https://outlook.office365.com/.default');
    Request.AddFormField('grant_type', 'client_credentials');

    // Enviar la solicitud POST y obtener la respuesta JSON
    JsonResponse := Http.Post('https://login.microsoftonline.com/' + TenantID + '/oauth2/v2.0/token', Request);

    // Parsear el JSON manualmente con System.JSON
    JsonObj := TJSONObject.ParseJSONValue(JsonResponse) as TJSONObject;
    try
      if Assigned(JsonObj) then
        Result := JsonObj.GetValue<string>('access_token')
      else
        raise Exception.Create('Error procesando la respuesta JSON.');
    finally
      JsonObj.Free;
    end;

    if Result = '' then
      raise Exception.Create('No se pudo obtener el Access Token.');
  finally
    Http.Free;
    Request.Free;
  end;
end;
pero luego no hay manera de conectarme por IMAP
Código Delphi [-]
procedure tMainForm.LeerEmailsOffice365(const Token: string);
var
  Imap: TclImap4;
  Msg: TclMailMessage;
  i: Integer;
begin
  Imap := TclImap4.Create(nil);
  Msg := TclMailMessage.Create(nil);
  try
    Imap.Server := 'outlook.office365.com';
    Imap.Port := 993;
    Imap.UseTLS := ctImplicit;
//    Imap.UserName := edit1.text;
    Imap.UserName := edtuser.text;

    // Usar OAuth2 como mecanismo de autenticación
    Imap.Authorization := 'XOAUTH2';
//    Imap.Password := Token;  // Token obtenido previamente
    Imap.Authorization := 'Bearer: '+Token;  // Token obtenido previamente
    Imap.Open;
    Imap.SelectMailBox('INBOX');


    Imap.Close;
  finally
    Imap.Free;
    Msg.Free;
  end;
end;
o enviar algún email, siempre recibo "a0002 NO AUTHENTICATE failed" ¿alguna idea?
Responder Con Cita
  #8  
Antiguo Hace 3 Semanas
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.496
Poder: 21
MAXIUM Va camino a la fama
Probé con 2 proveedores de correo que usan este sistema y debería ser lo mismo para Outlook.

Debes configurar el cliente como ha sido siempre. Solo que en vez de usar la contraseña del email, debes usar una contraseña de aplicación y usar esta.

La puedes generar aquí, con el user y pass respectivo
https://support.microsoft.com/es-es/...a-a6f2979a7944

Última edición por MAXIUM fecha: Hace 3 Semanas a las 19:33:50.
Responder Con Cita
  #9  
Antiguo Hace 3 Semanas
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.405
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Efectivamente, ya se ha recomendado unos mensajes más arriba que use la contraseña de aplicación.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 14:20:46.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi