FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Microsoft Outlook 365 y FWH
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Microsoft Outlook 365 y FWH
Posted: Mon May 27, 2024 04:31 PM

Hola a todos,

He hecho una función para enviar mails de manera desatendida 'a través' de Outlook (precisa que Outlook esté levantado).

Lo he probado en Outlook 2010 y funciona bien, pero el cliente tiene Outlook 365 y yo no.

¿Saben Ustedes si cuando lo pruebe en el entorno del cliente, si debería funcionar por compatibilidad con Outlook 2010?

La única manera que tengo de probarlo es ir a casa del cliente pero quisiera ir ya a sabiendas de que no funcionará o que debería funcionar.

¿Ustedes tienen experiencia con Outlook 365?

Muchas gracias.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 318
Joined: Fri Jan 14, 2022 08:37 AM
Re: Microsoft Outlook 365 y FWH
Posted: Mon May 27, 2024 04:48 PM

Hola,

Lo primero sería saber si el cliente tiene instalada la versión de escritorio de M.O. 365 porque si ha decido que lo lleva por web, entonces no va a funcionar

Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Microsoft Outlook 365 y FWH
Posted: Mon May 27, 2024 05:05 PM
paquitohm wrote:Hola,

Lo primero sería saber si el cliente tiene instalada la versión de escritorio de M.O. 365 porque si ha decido que lo lleva por web, entonces no va a funcionar
Bien empiezo.

Espero que tenga la de escritorio pues CDOSYS no funciona y supuse que sería por tener instalado Outlook (parece ser que CDOSYS y versiones recientes de Outlook no son compatibles).

Poder enviar mails desatendidos en este lugar sin usar libs de terceros me está costando sudor y lágrimas.

Deséame suerte.
Muchas gracias,

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 318
Joined: Fri Jan 14, 2022 08:37 AM
Re: Microsoft Outlook 365 y FWH
Posted: Mon May 27, 2024 05:25 PM

Pues como comentamos, es facil y posible de enviar usando alguna herramienta de terceros, powershell, php-mailer o similar.

Yo tuve que hacer algo porque el cliente tenia Microsoft 365 en la nube y queria emails desatendidos. Lo hice con powershell y hasta el dia de hoy que el log de seguimiento no ha fallado ni una sola vez en el seguimiento.

A los clientes se les hinchan las gonadas porque gmail hace con los emails lo que quiere porque cuando envias más de NN te los marca como spam o directamente te bloquea la cuenta si envias muchos y muy parecidos emails. Asi que deciden irse alli donde tienen mas control de la cuenta, como M.O. 365. Realmente no sé si las cuentas de pago de gmail pueden ayudar tambien a sortear estos problemas, pero la gente que conozco usa M.O. 365 supongo porque asi lo tienen todo: escritorio (el que lo use y si quiere usarlo) y web ademas de Office, por supuesto

Facilmente con chatgpt te montas un ejemplo sencillo para enviar desatendido en las herramientas antes mencionadas: Le pasas como parametro de la llamada un json con los datos del email y en el mismo json escribes la respuesta: enviado, si o no y sino el error de envio. En mi caso lo hice con un archivo .ini

Espero que lo tenga en desktop y sino tampoco es mucho

Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Microsoft Outlook 365 y FWH
Posted: Mon May 27, 2024 07:03 PM
paquitohm wrote:Pues como comentamos, es facil y posible de enviar usando alguna herramienta de terceros, powershell, php-mailer o similar.

Yo tuve que hacer algo porque el cliente tenia Microsoft 365 en la nube y queria emails desatendidos. Lo hice con powershell y hasta el dia de hoy que el log de seguimiento no ha fallado ni una sola vez en el seguimiento.

A los clientes se les hinchan las gonadas porque gmail hace con los emails lo que quiere porque cuando envias más de NN te los marca como spam o directamente te bloquea la cuenta si envias muchos y muy parecidos emails. Asi que deciden irse alli donde tienen mas control de la cuenta, como M.O. 365. Realmente no sé si las cuentas de pago de gmail pueden ayudar tambien a sortear estos problemas, pero la gente que conozco usa M.O. 365 supongo porque asi lo tienen todo: escritorio (el que lo use y si quiere usarlo) y web ademas de Office, por supuesto

Facilmente con chatgpt te montas un ejemplo sencillo para enviar desatendido en las herramientas antes mencionadas: Le pasas como parametro de la llamada un json con los datos del email y en el mismo json escribes la respuesta: enviado, si o no y sino el error de envio. En mi caso lo hice con un archivo .ini

Espero que lo tenga en desktop y sino tampoco es mucho
Muchas gracias Paquitohm, lo tendré en cuenta y si tengo problemas quizás me decante por Powershell, que si no me equivoco lo trae Windows.
En ese punto y si me permites abusar, te pediré ayuda.

Es cierto, yo también estoy hasta arriba de gmail, al final al cliente le he contratado un dominio sólo para mail y para estos envíos, y si le responden en ese mail lo direcciono a su cuenta gmail habitual y el atiende desde ahí.
Si algún día se cansa o se harta de gmail ya tendrá su dominio funcionando y que lo amplíe lo que le haga falta.

Muchas gracias,

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 318
Joined: Fri Jan 14, 2022 08:37 AM
Re: Microsoft Outlook 365 y FWH
Posted: Tue May 28, 2024 08:48 AM

Nada hombre, lo que haga falta

Estaré encantado de compartir contigo

Posts: 179
Joined: Fri Dec 07, 2007 01:26 PM
Re: Microsoft Outlook 365 y FWH
Posted: Tue May 28, 2024 10:34 AM
Dear friends,

I also had some issues with the mail-sending, but sending with the microsoft graph api and office365 is working very fine for me.

This is my code...it would be a great honor if some of it could be useful to you.

Kind regards
Ruth

Code (fw): Select all Collapse
#include "c:\harbour\contrib\hbcurl\hbcurl.ch"
#define HB_CURLOPT_POST                      47
#define HB_CURLOPT_URL                        2
#define HB_CURLOPT_DL_BUFF_SETUP              1008
#define HB_CURLOPT_POSTFIELDS                 15
#define HB_CURLOPT_WRITEFUNCTION              11

FUNCTION Main()
    LOCAL cToken, cResult
 cToken := GetAccessToken()
  IF !EMPTY(cToken)
  cResult := SendEmail(cToken)
    ?"Email Send Result: ", cResult
  ELSE
    ? "Failed to retrieve access token."
  ENDIF
 

   
FUNCTION GetAccessToken()
    LOCAL hCurl := CURL_easy_init()
    LOCAL cPayload := ""
    LOCAL cToken := ""
    LOCAL cTest := ""
    LOCAL nStartPos, nEndPos
    LOCAL aHeaders := {"Content-Type: application/x-www-form-urlencoded"}
    LOCAL cTenantID := hb_GetEnv("TENANT_ID")
    LOCAL cClientId := hb_GetEnv("365client_id")
    LOCAL cClientSecret := hb_GetEnv("365client_secret")
    IF hCurl != NIL
        CURL_easy_setopt(hCurl, HB_CURLOPT_URL, "https://login.microsoftonline.com/"+cTenantID+"/oauth2/v2.0/token")
        CURL_easy_setopt(hCurl, HB_CURLOPT_HTTPHEADER, aHeaders)
        CURL_easy_setopt(hCurl, HB_CURLOPT_POSTFIELDS, "grant_type=client_credentials&client_id="+cClientId+"&client_secret="+cClientSecret+"&scope=https://graph.microsoft.com/.default")
        CURL_easy_setopt(hCurl, HB_CURLOPT_POST, .T.)
        curl_easy_setopt( hCurl, HB_CURLOPT_DL_BUFF_SETUP )
        CURL_easy_setopt(hCurl, HB_CURLOPT_WRITEFUNCTION, @cPayload) // Buffer the response
       
       
        CURL_easy_perform(hCurl)
        cPayload := curl_easy_dl_buff_get(hCurl) // Get the response from the buffer
        nStartPos := AT('"access_token":"',cPayload)+LEN('"access_token":"')
        nEndPos := hb_AT('"', cPayload, nStartPos)
        cToken := SUBSTR(cPayload, nStartPos, nEndPos - nStartPos)
     

        CURL_easy_cleanup(hCurl)

       
    ELSE
        ? "Failed to initialize cURL session."
    ENDIF

    RETURN cToken


    FUNCTION SendEmail(cToken)
        LOCAL hCurl := CURL_easy_init()
        LOCAL cEmailJson
        LOCAL cResponse := ""
        LOCAL aHeaders := {}
        LOCAL cImgBase64 := ""

cImgBase64 := hb_base64Encode(hb_MemoRead("c:\www\htdocs\submarine_yellow\img\latest_news2.jpg"))
? "cImgBase64", cImgBase64
        cEmailJson := '{"message": {"subject": "Test base64", ';
        + '"body": {"contentType": "html", ';
        + '"content": "<h1>test</h1><p>The new cafeteria is open...</p>';
        + '<img src=\"data:image/jpeg;base64,' + cImgBase64 + '\" > ';
        + '"}, ';
        + '"toRecipients": [{"emailAddress": {"address": "testrecip@****.info"}}]}, ';
        + '"saveToSentItems": "true"}'
       
        IF hCurl != NIL

            AADD(aHeaders, "Authorization: Bearer " + cToken)
            AADD(aHeaders, "Content-Type: application/json")


            CURL_easy_setopt(hCurl, HB_CURLOPT_URL, "https://graph.microsoft.com/v1.0/users/test@*****.at/sendMail")
            CURL_easy_setopt(hCurl, HB_CURLOPT_HTTPHEADER, aHeaders)
            CURL_easy_setopt(hCurl, HB_CURLOPT_POSTFIELDS, cEmailJson)
            CURL_easy_setopt(hCurl, HB_CURLOPT_POST, .T.)
            CURL_easy_setopt(hCurl, HB_CURLOPT_WRITEFUNCTION, @cResponse) // Buffer the response
   
            CURL_easy_perform(hCurl)
            cResponse := curl_easy_dl_buff_get(hCurl) // Get the response from the buffer
            CURL_easy_cleanup(hCurl)
            ? "response", cResponse
        ELSE
            cResponse := "Failed to initialize cURL session."
        ENDIF
   
        RETURN cResponse
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Microsoft Outlook 365 y FWH
Posted: Tue May 28, 2024 01:01 PM
Dear Ruth,

many thanks! :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 670
Joined: Wed Oct 19, 2005 06:41 PM
Re: Microsoft Outlook 365 y FWH
Posted: Tue May 28, 2024 08:36 PM
Good Afternoon
Nice piece of code
excuseme my ignorance whats meaning
https://graph.microsoft.com/v1.0/users/test@*****.at/sendMail

thanks in advance
Wilson
Wilson 'W' Gamboa A
Wilson.josenet@gmail.com
Posts: 179
Joined: Fri Dec 07, 2007 01:26 PM
Re: Microsoft Outlook 365 y FWH
Posted: Tue May 28, 2024 09:30 PM
Dear Wilson,

I used the information from here...
https://learn.microsoft.com/en-us/graph/api/user-sendmail?view=graph-rest-1.0&tabs=http

As far as I could understand, there are two options for http requests when sending emails via Microsoft Graph API:

POST /me/sendMail: This requires the user to log in manually.
POST /users/{id | userPrincipalName}/sendMail: This is the autonomous option where no manual input of user and password is required. In my case, I used my Microsoft Office 365 email address for {id | userPrincipalName}.

For the curl I had to put it in here
Code (fw): Select all Collapse
CURL_easy_setopt(hCurl, HB_CURLOPT_URL, "https://graph.microsoft.com/v1.0/users/{id | userPrincipalName}/sendMail")
Thank you very much for your kind attention. I am very happy about it.

Kind regards
Ruth
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Microsoft Outlook 365 y FWH
Posted: Wed May 29, 2024 08:21 AM

Hola a todos,

Paquitohm, he tenido suerte, el cliente tiene instalado Outlook 365; probé mi solución (a fondo aún no) y pude enviar mail.

Ruth muchas gracias por el aporte, lo tendré presente.

De momento tengo resuelto el problema.

Muchas gracias,

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 318
Joined: Fri Jan 14, 2022 08:37 AM
Re: Microsoft Outlook 365 y FWH
Posted: Wed May 29, 2024 10:20 AM

Genial Carlos !

Continue the discussion