|
| Office 365 + OAuth2 + envoi de mails |
| Débuté par Ben_GEXL, 02 sep. 2022 11:27 - 10 réponses |
| |
| | | |
|
| |
Membre enregistré 12 messages |
|
| Posté le 02 septembre 2022 - 11:27 |
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 |
| |
| |
| | | |
|
| | |
| |
| Posté le 02 septembre 2022 - 13:00 |
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 |
| |
| |
| | | |
|
| | |
| |
| Posté le 02 septembre 2022 - 14:03 |
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.  |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 30 messages |
|
| Posté le 06 septembre 2022 - 21:11 |
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.  |
| |
| |
| | | |
|
| | |
| |
| Posté le 25 novembre 2022 - 15:51 |
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
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
QUAND EXCEPTIONEXCEPTION DANS SI PAS EmailOuvreSession(Objsessionimap) ALORS Trace("Ouverture de session IMAP réussie") FIN EmailFermeSession(Objsessionimap) FAIRE Erreur(ExceptionInfo(errMessage)) RETOUR FIN |
| |
| |
| | | |
|
| | |
| |
| Posté le 10 mai 2023 - 15:00 |
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"]) 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 |
| |
| |
| | | |
|
| | |
| |
| Posté le 11 mai 2023 - 11:10 |
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 |
| |
| |
| | | |
|
| | |
| |
| Posté le 19 avril 2024 - 12:53 |
Y-a-t-il une solution déjà?
Grts, Marc |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 8 messages |
|
| Posté le 14 octobre 2024 - 14:15 |
Bonjour,
Je peux partager ce composant, mais je ne sais pas comment faire ... Désolé pour l'absence, le jour où j'ai posté cette solution je n'étais pas connecté avec mon compte, je n'ai reçu aucun de vos messages. Je viens de tomber dessus par hasard ... |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 299 messages |
|
| Posté le 14 octobre 2024 - 15:26 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 8 messages |
|
| Posté le 15 octobre 2024 - 07:44 |
Ok, merci J'ai publié hier le zip avec le nom suivant :
Composant OAuth2 pour IMAP Office365 |
| |
| |
| | | |
|
| | | | |
| | |
|