OVH Cloud OVH Cloud

Validite du serveur smtp

7 réponses
Avatar
QUINCY Bernard
Bonjour,

J'ai une appli avec laquelle on envoie des emails en utilisant la fonction
EmailOuvreSessionSMTP.
Pas de problème mais ce sont les utilisateurs qui rentrent leur smtp, et si
il y a une erreur sur le smtp , le programme reste bloqué .
Comment connaitre la validité du smtp

SI EmailOuvreSessionSMTP(user,smtpmail)= Vrai ALORS
// on gere l'envoie du mail

SINON
Erreur("Impossible d'établir la connexion"+ RC+...)
EmailMsgErreur(email.Erreur))
FIN

si le smtp est faux , je ne passe jamais à l'erreur !!! , je reste bloqué

Merci de vos réponses

7 réponses

Avatar
Eric
QUINCY Bernard avait soumis l'idée :

J'ai une appli avec laquelle on envoie des emails en utilisant la fonction
EmailOuvreSessionSMTP.
Pas de problème mais ce sont les utilisateurs qui rentrent leur smtp, et si
il y a une erreur sur le smtp , le programme reste bloqué .
Comment connaitre la validité du smtp



Hum, normalement le timeout est fixé à 10 secondes, donc
emailouvresessionsmtp doit rendre la main après cette durée (qui peut
être fixée avec emailchangetimeout).

Pour connaitre la validité d'un serveur (pas forcément de mail), tu
peux soit résoudre l'adresse (netadresseip) ou soit tester sa réponse
(ping).
Le mieux reste de faire une résolution MX du domaine pour connaitre le
nom exact du serveur de mail. (wanadoo.fr => smtp.wanadoo.fr)

DNS_MX_DATA est une structure
pNameExchange est un entier sur 4 octets
wPreference est un entier sur 2 octets
Pad est un entier sur 2 octets
FIN

dnsrecord est une structure
pNext est un entier sur 4 octets
pName est un entier sur 4 octets
wType est un entier sur 2 octets
wDataLength est un entier sur 2 octets
DW est un entier sur 4 octets
dwTtl est un entier sur 4 octets
dwReserved est un entier sur 4 octets
data est un DNS_MX_DATA
FIN
dr est un dnsrecord

res est un entier = API("Dnsapi","DnsQuery_A", "tondomaine.xxx" , 15 ,
0 , Null , &dr , Null )
SI PAS res ALORS
ch est une chaîne ASCIIZ de 128
BOUCLE
API("kernel32","RtlMoveMemory", &dr, dr:pNext, Dimension(dr))
SI API("kernel32","lstrlenA",dr:data:pNameExchange)=0 ALORS SORTIR
API("kernel32" , "RtlMoveMemory" , &ch , dr:data:pNameExchange ,
API("kernel32" , "lstrlenA" , dr:data:pNameExchange))
Trace("ch : ",ch," pref : ",dr:data:wPreference)
ch=""
FIN
FIN

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Avatar
QUINCY Bernard
Je viens de vérifier , normalement le timeout est par défaut de 10s .
Si je met EmailChangeTimeOut(10), la je sors bien au bout de 10s sinon je
reste planté !!!
donc le timeout par défaut ne fonctionne pas ....

A+
Merci de vos réponses
Avatar
:-\)
Un SocketConnecte sur le port 25 du serveur smtp permettrait de savoir il
est accessible.

"QUINCY Bernard" a écrit dans le message de news:
41876682$0$5916$
Je viens de vérifier , normalement le timeout est par défaut de 10s .
Si je met EmailChangeTimeOut(10), la je sors bien au bout de 10s sinon je
reste planté !!!
donc le timeout par défaut ne fonctionne pas ....

A+
Merci de vos réponses





Avatar
Eric Demeester
dans (in) fr.comp.developpement.agl.windev, Eric
ecrivait (wrote) :

Bonsoir,

Pour connaitre la validité d'un serveur (pas forcément de mail), tu
peux soit résoudre l'adresse (netadresseip) ou soit tester sa réponse
(ping).



Résoudre l'adresse en faisant un nslookup dessus (c'est ce que retourne
netadresseip j'imagine) pourquoi pas.

Tester la réponse au ping, en revanche, n'est pas fiable, car certains
serveurs qui existent bel et bien sont configurés pour ne pas répondre
au ping. Pour s'en convaincre, aller par exemple sur :

http://www.noos.fr

puis tenter de le pinguer...

Par ailleurs, le fait qu'un serveur smtp existe ne présume pas du fait
qu'il acceptera la connexion. Il peut par exemple demander une
authentification et refuser la connexion si cette authentification n'est
pas correcte (Windev ne sait à ce jour pas gérer le SMTP AUTH, c'est
prévu dans la v9 paraît-il).

--
Eric
Avatar
:-\)
> Par ailleurs, le fait qu'un serveur smtp existe ne présume pas du fait
qu'il acceptera la connexion. Il peut par exemple demander une
authentification et refuser la connexion si cette authentification n'est
pas correcte (Windev ne sait à ce jour pas gérer le SMTP AUTH, c'est
prévu dans la v9 paraît-il).



Oui mais s'il accepte une connexion sur le port 25 la fonction smtp de
windev ne partira pas en boucle sans fin, que le serveur demande une
authentification ou pas
Avatar
Eric Demeester
dans (in) fr.comp.developpement.agl.windev, ":-)"
ecrivait (wrote) :

Bonsoir,

Oui mais s'il accepte une connexion sur le port 25 la fonction smtp de
windev ne partira pas en boucle sans fin, que le serveur demande une
authentification ou pas



Effectivement, sauf que rien dans la question de Bernard ne permet de
savoir si le problème qu'il rencontre vient du serveur SMTP ou de
Windev...

Une piste serait de tenter d'initier un échange en TELNET avec le
serveur en question, histoire de voir ce qu'il répond.

Tout ça est compliqué et mon propos était, même si je ne l'ai peut-être
pas formulé assez clairement, de dire que dialoguer avec des serveurs
sur Internet n'est pas trivial, et que les commandes Windev permettant
de le faire ne sont pas forcément standard, adaptées et efficaces.

--
Eric
Avatar
Eric
Eric Demeester a émis l'idée suivante :

Effectivement, sauf que rien dans la question de Bernard ne permet de
savoir si le problème qu'il rencontre vient du serveur SMTP ou de
Windev...



Tout est dans la question justement!

Citation Bernardinesque: "Pas de problème mais ce sont les utilisateurs
qui rentrent leur smtp, et si
il y a une erreur sur le smtp , le programme reste bloqué ."

Le problème vient de l'utilisateur (qui saisit des conneries!).
La fonction emailouvresessionsmtp est blocante (car serveur smtp
erroné) sauf si Bernard force le timeout avec emailchangetimeout.

Mais après relecture de la doc...

Les fonctions de connexion EmailOuvreSession, EmailOuvreSessionPOP3 et
EmailOuvreSessionSMTP sont bloquantes pendant toute la durée de la
connexion. Si le serveur ne répond pas, ces fonctions sont bloquantes
pendant la durée du timeout.

Attention : la valeur du timeout définie avec la fonction
EmailChangeTimeOut n'a pas de rapport avec la durée des fonctions
EmailOuvreSession, EmailOuvreSessionPOP3 et EmailOuvreSessionSMTP. En
effet, il s'agit de la durée de non réponse du serveur. Il faut ajouter
à cette durée le temps de la résolution de l'adresse.

Par exemple, avec un serveur qui répond instantanément, la connexion
peut durer 3 à 4 secondes si le DNS est lent (même si le timeout est de
1 seconde).

Par ailleurs, le fait qu'un serveur smtp existe ne présume pas du fait
qu'il acceptera la connexion. Il peut par exemple demander une
authentification et refuser la connexion si cette authentification n'est
pas correcte (Windev ne sait à ce jour pas gérer le SMTP AUTH, c'est
prévu dans la v9 paraît-il).



La question était de tester la validité d'un serveur (Comme l'indique
le sujet du post initial), pas de savoir si la connection serait
acceptée.
Non?

Tester la réponse au ping, en revanche, n'est pas fiable



Là, je suis d'accord, c'est pas la meilleure solution ;-)

A+

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net