PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → Office 365 + OAuth2 + envoi de mails
Office 365 + OAuth2 + envoi de mails
Iniciado por Ben_GEXL, set., 02 2022 11:27 AM - 7 respostas
Membro registado
12 mensagems
Popularité : +1 (1 vote)
Publicado em setembro, 02 2022 - 11:27 AM
Bonjour,

Nous utilisons Office 365 et l'envoi de mails, jusqu'à présent avec un SMTP authentifié classique (port 587)...
Microsoft ayant décidé d'arrêter l'authentification "de base" au profit de l'authentification "moderne", on se doit de revoir notre copie mais ce n'est pas simple.

L'authentification doit se faire par OAuth 2. On arrive à la faire fonctionner mais je ne vois pas comment utiliser l'envoi de mails ensuite. Les fonctions SMTPenvoi... ne vont plus fonctionner ?

D'autre part, l'authentification OAuth 2 ouvre une fenêtre et demande un compte Office. Or, nous voudrions utiliser un compte "robot" et non le compte de l'utilisateur connecté.

Bref, on a du mal à s'en sortir ;) ! Si quelqu'un pouvait nous éclairer, ce serait très gentil !

Merci
Publicado em setembro, 02 2022 - 1:00 PM
Bonjour,

Après m'être longuement arraché les cheveux avec l'utilisation de la syntaxe WinDev, j'ai fini par trouver une réponse mais avec l'utilisation d'un .NET Microsoft.

Il faut ajouter System.dll dans la partie "Assemblages .NET" et réécrire sa procédure pour l'envoi d'un email

Voici la procédure que j'utilise. (NB : Xwork et Nwork sont des variables de travail)

PROCÉDURE NET_EnvoyerMail(Destinataire est une chaîne, DestinataireCopie est une chaîne, DestinataireCopieCachée est une chaîne, lesujet est une chaîne, lemessage est une chaîne,ficAttachement est une chaîne="")
leSMTP est une chaîne=""; lutilisateur est une chaîne=""; lemotdepasse est une chaîne=""; leport est un entier=25; SSL est un booléen=Vrai; lExpediteur est une chaîne=""

HLitRecherche(PARAMGLOBAL,Cle,"SMTP",hIdentique)
SI HTrouve(PARAMGLOBAL) ALORS
leSMTP = ExtraitChaîne(PARAMGLOBAL.Valeur,1,"|")
leport = ExtraitChaîne(PARAMGLOBAL.Valeur,2,"|")
lExpediteur= ExtraitChaîne(PARAMGLOBAL.Valeur,6,"|")
lutilisateur = ExtraitChaîne(PARAMGLOBAL.Valeur,4,"|")
Xwork = ExtraitChaîne(PARAMGLOBAL.Valeur,5,"|")

lemotdepasse =

FIN

SI SansEspace(leSMTP)="" ALORS
Gtrace("Il n'y a pas de serveur de courrier d'envoi de paramétré !")
RENVOYER Vrai
FIN
SI SansEspace(Destinataire)="" ALORS
Gtrace("Il n'y a pas d'adresse e-mail sur l'un des collaborateurs")
RENVOYER Vrai
FIN
smtp_server est un SmtpClient
e_mail est un MailMessage()
smtp_server.UseDefaultCredentials = False
lecred est un NetworkCredential(lutilisateur,lemotdepasse)
smtp_server.Credentials = lecred
smtp_server.Port = leport
smtp_server.EnableSsl = SSL
smtp_server.Host = leSMTP
ladresse est un MailAddress(lExpediteur)
e_mail.from=ladresse

Nwork = 1
Xwork = ExtraitChaîne(Destinataire,Nwork,";",DepuisDébut)
TANTQUE Xwork<>EOT ET Nwork<21
e_mail.To.add(Xwork)
Nwork++
Xwork=ExtraitChaîne(Destinataire,Nwork,";",DepuisDébut)
FIN



SI DestinataireCopie<>"" ALORS
Nwork = 1
Xwork = ExtraitChaîne(DestinataireCopie,Nwork,";",DepuisDébut)
TANTQUE Xwork<>EOT ET Nwork<21
e_mail.Cc.add(Xwork)
Nwork++
Xwork=ExtraitChaîne(DestinataireCopie,Nwork,";",DepuisDébut)
FIN
FIN

SI DestinataireCopieCachée<>"" ALORS
Nwork = 1
Xwork = ExtraitChaîne(DestinataireCopieCachée,Nwork,";",DepuisDébut)
TANTQUE Xwork<>EOT ET Nwork<21
e_mail.Bcc.add(Xwork)
Nwork++
Xwork=ExtraitChaîne(DestinataireCopieCachée,Nwork,";",DepuisDébut)
FIN
FIN


SI ficAttachement<>"" ALORS
myAtt est un Attachment(ficAttachement)
e_mail.Attachments.add(myAtt)
FIN

e_mail.Subject = lesujet
e_mail.IsBodyHtml = False
e_mail.Body = lemessage
QUAND EXCEPTION DANS
smtp_server.Send(e_mail)
FAIRE
RENVOYER Faux
FIN
RENVOYER Vrai



ATTENTION : il peut y avoir des noms de syntaxe .NET ayant le même nom qu'une syntaxe PcSOFT.
Par exemple : XmlDocument existe en .NET et Wlanguage. Pour garder celui du Wlanguage, il faut mettre WL.XmlDocument.

J'espère que cela te conviendra

Romain
Publicado em setembro, 02 2022 - 2:03 PM
Bonjour Ben_GEXL,

Pour les fonctions SMTP, celles-ci sont toujours fonctionnelles avec l'authentification OAuth2.

Sur le portail Azure dans ton application, tu vas devoir ajouter l'autorisation "SMTP.Send" qui te permettra de t'authentifier en SMTP.

Lorsque tu récupères ton Token tu devras ajouter ce scope : "https://outlook.office.com/SMTP.Send"

cf : https://docs.microsoft.com/fr-fr/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth…

Une fois cela fait il ne te restera plus qu'à ouvrir une session SMTP et envoyer ton mail.

Voici un exemple de code fonctionnel :

monEmail est un Email
sessionSMTP est un emailSessionSMTP

sessionSMTP..AdresseServeur = "smtp.office365.com"
sessionSMTP..Port = 587
sessionSMTP..Nom = "toto@tata.fr"
sessionSMTP..MotDePasse = "motdepasse"
sessionSMTP..Option = emailOptionSécuriséTLS
sessionSMTP..AuthToken = Token

SI PAS EmailOuvreSession(sessionSMTP) ALORS
Trace(ErreurInfo())
RETOUR
FIN

monEmail.Sujet = "Test envoie de mail session SMTP"
monEmail.Expediteur = "toto@tata.fr"
monEmail.Destinataire.Ajoute("toto@tata.fr")

EmailEnvoieMessage(sessionSMTP, monEmail)


Pour l'ouverture du navigateur lorsque tu récupère le Token je n'ai malheureusement pas encore trouvé de solution miracle. :(
Membro registado
21 mensagems
Publicado em setembro, 06 2022 - 9:11 PM
Quoise a écrit :
> Pour l'ouverture du navigateur lorsque tu récupère le Token je n'ai malheureusement pas encore trouvé de solution miracle.

Même chose pour moi.
Je crois que par conception l'ouverture de cette page est nécessaire. À moins que PCSoft ajoute un paramètre pour éviter l'ouverture de celle-ci dans une future mise à jour?
Cela dit j'aurais espéré à la limite pouvoir ouvrir cette page sur un champ HTML "caché" pour éviter d'ennuyer le client à fermer cette fenêtre plutôt que de la faire ouvrir avec le navigateur principal de l'ordinateur. :(
Publicado em novembro, 25 2022 - 3:51 PM
Je me suis un peu arraché les cheveux comme tout le monde sur le sujet.
La fonction authidentifie ne correspond pas à ce que je cherchais puisque je voulais enregistrer, voire renouveler mon Token.
J'ai donc développer mon propre composant qui communique avec une application AZURE de type web.
Maintenant, je peux récupérer mon token facilement tout le temps de la durée du jeton (fixée à 24 mois sur mon application), sans autre identification que la première effectuée.

Voici le code qui utilise mon composant :
sRet est une chaîne
clMasession est une Session("id application","Valeur Secret du jeton","URL de redirection",["offline_access","https://outlook.office.com/IMAP.AccessAsUser.All"])
sRet = clMasession:Ouvre_Session()
SI sRet <> Vrai ALORS
Erreur(ExtraitChaîne(sRet,2))
RETOUR
FIN

// Paramètres de la session IMAP
EmailChangeTimeOut(10)
Objsessionimap est un emailSessionIMAP
Objsessionimap.Nom = "monemail@mondomaine.com"
Objsessionimap.AdresseServeur = "outlook.office365.com"
Objsessionimap.Port = 993
Objsessionimap.Option = optionSSL
Objsessionimap.AuthToken = clMasession:Token
Libérer clMasession

// Ouverture de la session IMAP
QUAND EXCEPTIONEXCEPTION DANS
SI PAS EmailOuvreSession(Objsessionimap) ALORS
Trace("Ouverture de session IMAP réussie")
FIN
EmailFermeSession(Objsessionimap)
FAIRE
Erreur(ExceptionInfo(errMessage))
RETOUR
FIN
Publicado em maio, 10 2023 - 3:00 PM
Salut Greg,

Je me suis arracher les cheveux pour trouver une solution afin de pouvoir envoyer un email avec attachement à traver Office 365. La solution que tu a proposé me semble extrêmement brillante et simple. Lorsque j'ai voulu la tester, session devient rouge comme si ce n'est pas reconnu.

sRet est une chaîne
clMasession est une Session("id application","Valeur Secret du jeton","URL de redirection",["offline_access","https://outlook.office.com/IMAP.AccessAsUser.All"]) //Session devient rouge
sRet = clMasession:Ouvre_Session()
SI sRet <> Vrai ALORS
Erreur(ExtraitChaîne(sRet,2))
RETOUR
FIN


Est-ce un variable our une structure or un composant ou une fonction que je n'ai pas puisque j'utilise Windev 26 pour le moment? Ce serait vraiment aimable de toi si tu peut s'il te plaît m'aider pour mettre au point un moyen d'envoyer un email à travers office 365.

Merci bien.
Tsiry
Publicado em maio, 11 2023 - 11:10 AM
Thank you all for the provided options, not one I can get to work.

@Greg, can you please share the full solution?

@PCSoft, it would be good to have a working example in the manual for Microsoft Office365 to send emails programmatically with OAUTH2 and without a web login screen.

Any help is appreciated.

Thanks
Guido
Publicado em abril, 19 2024 - 12:53 PM
Y-a-t-il une solution déjà?

Grts,
Marc