PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Envoies de Mail par SMTP : Serveur Office365, comment envoyer mon mail ?
Envoies de Mail par SMTP : Serveur Office365, comment envoyer mon mail ?
Débuté par Ralph IGCI, 26 jan. 2023 19:17 - 10 réponses
Membre enregistré
417 messages
Popularité : +6 (6 votes)
Posté le 26 janvier 2023 - 19:17
Bonjour,
J'ai le code que voici
:
// Variables
objSMTPSession est un emailSessionSMTP

// Objet Session SMTP
objSMTPSession.Nom = "pierre.xxp@outlook.com"
objSMTPSession.MotDePasse = "xxxx"
objSMTPSession.AdresseServeur = "smtp.office365.com"
objSMTPSession.Port = 587


Sablier(Vrai)

OPTIONS_EMISSION est entier=2

// Type de connexion
SELON OPTIONS_EMISSION
CAS 1:
// Rien à faire, aucune option
CAS 2:
objSMTPSession.Option =emailOptionSécuriséTLS
CAS 3:
objSMTPSession.Option = optionSSL
AUTRE CAS
dbgAssertion(Faux, "Valeur non géré")
FIN
EmailParamètre(emailParamètreMode, 1)
// Ouverture session SMTP
EmailChangeTimeOut(25) // 15 secondes timeOut

SI EmailOuvreSession(objSMTPSession) = Vrai ALORS
EmailChangeTimeOut(1*60) // On le remet à 10 minutes
// testenvois
RENVOYER Vrai
SINON
RENVOYER Faux
FIN

CAS ERREUR:
RENVOYER Faux
CAS EXCEPTION:
RENVOYER Faux
FIN:
Sablier(Faux)
EmailFermeSession(objSMTPSession)


Ca fonctionne bien.

quand j'essaie d'envoyer en insérant au niveau de //testenvois le code ci-dessous
IF EnModeTest() THEN
// Contenu de l'email
UnCourriel est un Email
UnCourriel.Expediteur="PAUL LE MARCHAND"
UnCourriel.AdresseExpéditeur = "blpierre@outlook.fr"
UnCourriel.Destinataire[1] = "papa@outlook.com"
UnCourriel.Sujet = "Envoi d'un email depuis WINDEV."
UnCourriel.Message = "Envoi d'un message email depuis WINDEV."
SI EmailEnvoieMessage(objSMTPSession, UnCourriel) = Faux ALORS
Erreur("L'envoi de l'email a échoué.", ErreurInfo(errMessage))
FIN

FIN



J'ai l'erreur suivante

---------------------------
Fiche Compte
---------------------------
L'envoi de l'email a échoué.

L'envoi du message a échoué.



Vérifiez les adresses de destination ainsi que les paramètres de votre compte (adresse d'expéditeur).



L'échec peut être dû à un problème technique.



Après 4 tentatives successives, voici le détail des incidents rencontrés :





- Premier essai :



La dernière réponse du serveur SMTP est :

<503 5.5.1 Bad sequence of commands

>

- Deuxième essai :



La dernière réponse du serveur SMTP est :

<503 5.5.1 Bad sequence of commands



essai2

- Troisième essai :

La dernière réponse du serveur SMTP est :

<503 5.5.1 Bad sequence of commands

>

- Quatrième essai :

La dernière réponse du serveur SMTP est :

<503 5.5.1 Bad sequence of commands

Message modifié, 26 janvier 2023 - 19:19
Membre enregistré
58 messages
Popularité : +6 (6 votes)
Posté le 27 janvier 2023 - 08:36
Bonjour Ralph,
Essai la syntaxe de la doc (entre autre pour ajouter le destinataire).
https://doc.pcsoft.fr/?1000018713&name=email_type_variable

Personnellement, je n'utilise plus le SMTP (obsolète et moins/pas sécurisé) mais les connexions OAuth sur l'API Graph de Microsoft.
Il y a un sujet qui en traite, qui pourrait intéresser.
https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/259053-envoi-mail-smtp-avec-oauth2-azure-259474/read.awp…=*

Bon courage

--
Qui ne sait rien, de rien ne doute...
Membre enregistré
417 messages
Popularité : +6 (6 votes)
Posté le 27 janvier 2023 - 09:37
Bonjour Richard,
L'erreur persiste sur le premier lien,
pour le second Je ne vois pas comment obtenir les deux paramètres fondamentaux.
OAuth2Params.ClientID = "01234567890123456789"
OAuth2Params.ClientSecret = "98765432109876543210"

J'ai mon compte outlook.fr.
Merci
Message modifié, 27 janvier 2023 - 09:40
Membre enregistré
37 messages
Popularité : +1 (1 vote)
Posté le 30 janvier 2023 - 15:52
Bonjour,
il faut que l'adresse de l'expéditeur soit identique au nom lié à l'ouverture de la cession.
Et pour ma part, j'ai fait comme Richard, je suis passé par l'API Graph et là plus de pb.

--
Cordialement
Membre enregistré
417 messages
Popularité : +6 (6 votes)
Posté le 31 janvier 2023 - 10:19
Bonjour,
en regardant tous les codes en ligne,
j'ai fait ceci :

cstApiOutlookClientID est une chaîne UNICODE = "XXXXXXXXX-bd4e-4386-8676-7b70dd947"
cstApiOutlookIDClientSecret est une chaîne UNICODE = "d.........-c1c0-4328-956d-97aedf09a9d7"
cstApiOutlookClientSecret est une chaîne UNICODE = "ddddddd"
cstApiTenantID est une chaîne = "xxxxxxxxx-edba-cccc-8801-mpmllllddd..."



OAuth2Params est OAuth2Paramètres
OAuth2Params..ClientID = cstApiOutlookClientID
OAuth2Params..URLAuth = "https://login.microsoftonline.com/"+cstApiTenantID+"/oauth2/v2.0/authorize"
OAuth2Params..URLToken = "https://login.microsoftonline.com/"+cstApiTenantID+"/oauth2/v2.0/token"
OAuth2Params..ClientSecret = cstApiOutlookClientSecret
OAuth2Params..URLRedirection = "http://localhost:9874"
OAuth2Params..ParamètresSupplémentaires = "force_reapprove=false"
OAuth2Params..Scope = "offline_access User.Read https://outlook.office.com/SMTP.Send"

cExpediteur est une chaîne = "nepasrepondre..."



MaSessionSMTP est un emailSessionSMTP
MaSessionSMTP.AdresseServeur = "smtp.office365.com"
MaSessionSMTP.Port = 587
MaSessionSMTP.Option = emailOptionSécuriséTLS
MaSessionSMTP.AuthToken = AuthIdentifie(OAuth2Params)
Info(MaSessionSMTP.AuthToken.Valeur)


Mon Token est Vide , et l'erreur est la suivante

Vous avez appelé la fonction 'Authldentifie'.
Erreur à l'authentification : <invalid client
Description: AADSTS700025: Client is public so neither 'client_assertion'*** passez à la version PRO pour avoir le texte complet ***


Que manque-t-il ?
Message modifié, 31 janvier 2023 - 10:21
Membre enregistré
37 messages
Popularité : +1 (1 vote)
Posté le 31 janvier 2023 - 14:22
Bonjour,
pour ma part je ne modifie par les URL, voici une partie du code que j'utilise pour me connecter à l'api graph

Parametre_API est une Structure
URL_API est une chaîne
URL_Scope est une chaîne
URL_Redirection est une chaîne
URL_Auth est une chaîne
URL_Token est une chaîne
Client_ID est une chaîne
Client_Secret est une chaîne
FIN

gstParametre_API_GRAPH est API_GRAPH.Parametre_API

gstParametre_API_GRAPH.URL_API = "https://graph.microsoft.com/v1.0"
gstParametre_API_GRAPH.Client_ID = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
gstParametre_API_GRAPH.Client_Secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
gstParametre_API_GRAPH.URL_Auth = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize"
gstParametre_API_GRAPH.URL_Token = "https://login.microsoftonline.com/common/oauth2/v2.0/token"
gstParametre_API_GRAPH.URL_Redirection = "http://localhost:9874"
gstParametre_API_GRAPH.URL_Scope = "https://graph.microsoft.com/"


m_ParamIdentification est un OAuth2Paramètres

PROCÉDURE Constructeur(LOCAL p_ParametreConnexionAPI est une Parametre_API)

:m_ParamIdentification.URLAuth = p_ParametreConnexionAPI.URL_Auth
:m_ParamIdentification.URLToken = p_ParametreConnexionAPI.URL_Token

:m_ParamIdentification.ClientID = p_ParametreConnexionAPI.Client_ID
:m_ParamIdentification.ClientSecret = p_ParametreConnexionAPI.Client_Secret

:m_ParamIdentification.URLRedirection = p_ParametreConnexionAPI.URL_Redirection

:m_URLScope = p_ParametreConnexionAPI.URL_Scope
:m_URL = p_ParametreConnexionAPI.URL_API


TOKEN_MICROSOFT est un AuthToken

TOKEN_MICROSOFT = AuthIdentifie(:m_ParamIdentification)
SI TOKEN_MICROSOFT.Valide = Faux ALORS
::m_Objet_Erreur:mtd_TraceErreur("Demande de Token refusée par microsoft")
::m_Objet_Erreur:mtd_TraceErreur("motif : " + RC + TOKEN_MICROSOFT.RéponseServeur)
RENVOYER Faux
SINON
// En MODE DEBUG
::m_Objet_Erreur:mtd_TraceErreur("Demande de Token acceptée")
vTOKEN = JSONVersVariant(TOKEN_MICROSOFT.RéponseServeur)

--
Cordialement
Membre enregistré
417 messages
Popularité : +6 (6 votes)
Posté le 31 janvier 2023 - 14:53
Merci Laurent CM,
Par une manoeuvre non maitrisé , j'avais eu le Token
mais la suite,
Voici mon code

VarSessionSMTP est un emailSessionSMTP

VarSessionSMTP.AdresseServeur = "smtp.office365.com"

VarSessionSMTP.Port = 587
VarSessionSMTP.Option = emailOptionSécuriséTLS
VarSessionSMTP.AuthToken = MonToken
Info(MonToken ..Valeur)


//MonToken



// Si l'identification a réussi, il faut se connecter à la boîte email
SI VarSessionSMTP.AuthToken <> Null ALORS
SI EmailOuvreSession(VarSessionSMTP) = Faux ALORS
// ...
ELSE
UnCourriel est un Email

UnCourriel.Expediteur = "monnom@outlook.fr"
UnCourriel.AdresseExpéditeur = "monnom@outlook.fr"
UnCourriel.Destinataire.Ajoute("sonnom@outlook.com")
UnCourriel.Sujet = "Envoi d'un email depuis WINDEV."
UnCourriel.Message = "Envoi d'un message email depuis WINDEV."

//EmailEnvoieMessage(MaSession, MonMessage, emailOptionEncodeEntête)
SI EmailEnvoieMessage(VarSessionSMTP, UnCourriel,emailOptionEncodeEntête) = Faux ALORS
Erreur("L'envoi de l'email a échoué.", ErreurInfo(errMessage))
ELSE
Info("Envoyé")

FIN


FIN
FIN


Message d'erreur
Le contenu de Email.Expediteur n'est pas reconnu par le serveur. La transaction est refusée.
La dernière réponse du serveur SMTP est :
<530 5.7.57 Client not authenticated to send mail. [CPYP284CA0062.BRAP284.PROD.OUTLOOK.COM 2023-01-31T13:48:50.113Z 08DB0368763E42DC]
>
J'ai changé UnCourriel.Expediteur et j'ai mis le nom et prénom, puis prénom et nom, rien
D'ailleurs, c'est quand je mets l'adresse mail, que ça semple mieux
Merci
Message modifié, 31 janvier 2023 - 15:00
Membre enregistré
83 messages
Popularité : +4 (4 votes)
Posté le 01 février 2023 - 19:31
Bonjour,

Microsoft a définitivement coupé le 27/01/2023 l'authentification "faible" à Office 365 par user/password.
OAuth2 obligatoire désormais.

J'ai une question d'ordre plus générale à tous ceux qui ont anticipé cette coupure : arrivez vous à récupérer un token d'identification valide avec l'instruction Windev AuthIdentifie ? Ca me semble être un préalable indispensable à l'utilisation des autres instructions EmailOuvreSession() et consorts.

Personnellement je n'y parviens pas.
Seule la méthode par l'API Rest fonctionne, celle décrite par le ST PCsoft ici : https://blogs.pcsoft.fr/fr/exemple-utilisation-api-rest-microsoft-graph-envoyer-email-passer-traditionnel-serveur-smtp/281474976711046/read.awp
Grâce à cet exemple j'obtiens un token valide, que j'arrive même à transférer dans un objet OAuth2Paramètres puis dans un objet emailSessionIMAP mais impossible ensuite d'ouvrir une session par EmailOuvreSession().

Je me demande si cela est réellement possible ou si, comme je le crains, l'utilisation de l'API Graph (et donc l'abandon pur et simple des instructions Windev de gestion des emails) est un passage obligé ?
Membre enregistré
2 messages
Posté le 01 mars 2023 - 11:30
bonjour

je te confirme que ca fonctionne, j'ai comme beaucoup eu les meme galères
mais c'est en place chez l'un de mes clients
le seul "problème" qu'il me reste à régler est la durée de validité du jeton obtenu... actuellement le client doit refaire l'authentification forte toutes les 68 minutes ;(
Membre enregistré
417 messages
Popularité : +6 (6 votes)
Posté le 01 mars 2023 - 13:34
Bonjour,
tu peux partager ta misère si c'est possible ?
J'ai même fini par recevoir un code qui marchait sur le contact, mais je n'ai pas eu les détails pour la messagerie.
Pour dire vrai j'ai suspendu la recherche parce que je n'ai jamais pu, à un moment je ne savais plus si mon compte était un problème ou pas.
Merci
Membre enregistré
58 messages
Popularité : +6 (6 votes)
Posté le 20 novembre 2023 - 08:59
Le dernier message date un peu mail PC Soft ne m'a prévenu qu'aujourd'hui qu'il y avait du nouveau dans la discussion.

Xav Nod : pour régler ton problème d'authentification, il faut que dans le compte Azure de tes clients, tu donnes une autorisation "Déléguée" pour l'envoi de mails -> Mail.ReadWrite. Sinon tu risques de na pas pouvoir régler ton problème.

--
Qui ne sait rien, de rien ne doute...