|
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 22 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
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 |
| |
| |
| | | |
|
| | |
| |
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"]) 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 |
| |
| |
| | | |
|
| | | | |
| | |
|