2015-08-21 4 views
0

Comme dans le mailtester website, je dois identifier & valider le serveur de messagerie, par programme.Identifier et valider le serveur de messagerie, par programme

J'ai vérifié le web en profondeur, mais je ne vois pas de tutoriel, de guide pratique, d'API, de bibliothèque ou de cours en ligne.

Je pas utiliser le programme pour des fins de spam comme fait dans le site Web mentionné (aucun problème de confidentialité déclaré au sujet de l'anti-spam, ou pas de déclaration pour le stockage utilisation & illégale d'adresse e-mail valide). En passant, l'identification du serveur de messagerie est une petite partie du projet sur lequel je travaille actuellement, mais je dois l'implémenter.

S'il vous plaît, répondre à la, mais dans le même sens, des questions:

  • Où dois-je commencer à mettre en œuvre de façon à faire mon?
  • Un didacticiel, un guide pratique, une API, une bibliothèque ou un cours en ligne?
  • Quelle est la bonne façon de mettre en œuvre ci-dessus à faire, par programmation?

Remarque: Vous pouvez consulter la capture d'écran qui provient du site Web mentionné.

screen shot at mail tester

+0

Ce que vous entendez par "valider" n'est pas clair. Si vous n'exercez qu'un sous-ensemble de SMTP, vous validez uniquement ce sous-ensemble (ou vous pouvez simplement vous connecter, et peut-être vérifier que la bannière est syntaxiquement valide). Comme toujours, le bon test est de vous envoyer un email et de le recevoir. Pour cela, tout ce dont vous avez besoin est un programme de messagerie électronique. – tripleee

Répondre

0

-je interpréter votre question:

Vous voulez vérifier si le serveur SMTP (à partir de laquelle une partie du courrier est arrivé par exemple) existe et que vous souhaitez vérifier si ce courrier existe aussi.

Pour ce faire, vous pouvez faire quelques choses:

Solution 1:

ping le serveur, par exemple mail.example.com,

si le serveur répond, vérifiez si les ports sont généralement utilisés par SMTP sont ouverts: généralement 25

si au moins un d'entre eux est ouvert, alors vous pouvez dire que le serveur de messagerie sur ce domaine est en cours d'exécution.

Cette solution a un problème que certains serveurs ne répondent pas au ping. Mais au lieu de l'envoyer par un ping, vous pouvez demander le nom d'hôte du DNS pour voir si vous obtiendrez l'adresse IP d'un domaine. Alors cette solution a un problème qu'un serveur ait pu être là hier mais ce n'est pas aujourd'hui, et DNS retourne l'IP, mais personne n'est à la fin. Vous pouvez y parvenir en appelant ping, hostname, netmap et des outils similaires en utilisant un sous-processus ou en le programmant vous-même à partir de zéro avec des sockets. Vous pouvez, bien sûr, ouvrir une socket vers le domaine, directement sur le port 25, mais vous devrez spécifier timeout car il peut arriver que tout se bloque car aucune réponse ne vient du serveur. Oui, le ping est une étape supplémentaire, mais il est plus rapide dans les cas où le serveur n'existe pas. Il envoie juste des paquets ICMP, il n'essaie pas de poignées de main. (Je sais par expérience).

Solution 2:

solution plus acceptable est d'utiliser smtplib juste pour essayer de vous connecter à ce serveur.

Il va "attaquer" le domaine spécifié demandant sur le port par défaut et envoyer une demande SMTP. L'exception sera déclenchée si le serveur n'est pas SMTP ou s'il n'existe pas. La temporisation doit également être définie. Le ping va ici aussi augmenter la vitesse des contrôles, et aucun délai n'est nécessaire. Vous supposez simplement que si le serveur ne répond pas, il n'existe pas. (Hm, l'intelligence de cette approche est discutable)

Si quelque chose, un pare-feu, filtre ou quelque chose de semblable, ne vous permet aucun de ces contrôles, vous pouvez toujours avoir une liste mise à jour de tous les serveurs de messagerie (si elle peut être obtenu à partir de n'importe quel robot) stocké localement ou se connecter à un service comme celui que vous avez mentionné pour le consulter sur l'adresse.

Solution 3:

solution de dernier recours pour vérifier si une adresse existe est d'essayer d'utiliser ce serveur SMTP pour nous envoyer un e-mail. Si la chose ne fonctionne pas, alors l'e-mail n'existe pas.

Gros problème !!!: La plupart des SMTP ne demandent pas de connexion oui, mais que faire si celui-ci le fait? Et, la plupart des serveurs SMTP vous permettent d'envoyer un e-mail à partir de n'importe quelle adresse qui n'existe même pas!

Pour la vérification de l'e-mail, la plupart des SMTP ont cette option désactivée, vous ne pourrez donc pas voir si un e-mail existe ou non. Pour vérifier le courrier électronique pour de vrai, vous devrez également consulter le serveur POP (en fait, il va en premier), pour voir s'il y a quelqu'un qui peut recevoir un e-mail à cette adresse.

Voici le code pour faire vérifier uniquement via SMTP (comme vous avez demandé) à l'aide smtplib:



from smtplib import SMTP 
from socket import timeout as ExcTimeout 
import socket 
import sys 

addr2check = "[email protected]" 
# Note, if the server is subdomained for SMTP (like mail.somethingelse.woops) be sure to include it or server wouldn't be found! 
#addr2check = "[email protected]" 

ok = 0 
r = None 
try: 
    # For Python 2.5 and below (smtplib doesn't support timeout, so do it globally) 
    if sys.version[:3]<="2.5": 
     TO = socket.getdefaulttimeout() 
     socket.setdefaulttimeout(8) 
     try: s = SMTP(addr2check.split("@")[1]) 
     except: socket.setdefaulttimeout(TO); raise 
     socket.setdefaulttimeout(TO) 
    else: s = SMTP(addr2check.split("@")[1], timeout=8) # Maybe even bigger TO for some GSM and 56K modems 
    ok += 1 
    r = s.verify(addr2check) 
    if r!=-1: 
     ok += r[0]==250 
    else: 
     r = s.expn(addr2check) 
     if r==-1: ok = -1 
     else: ok += r[0]==250 
    s.quit() 
except ExcTimeout: print "Connection timed out! Server most probably doesn't exist!" 
except Exception, e: 
    # Here some checks for what exactly happened, or just: 
    pass 

msgs = { 
    -1: "Server exists, but doesn't support e-mail verification!", 
    0: "Server does not exist!!!", 
    1: "Server exists but reports: "+str(r)+" for given e-mail!", 
    2: "E-Mail "+addr2check+" most definitely exists! Confirmed by it's SMTP server!" 
    } 

print msgs[ok] 

Pour prolonger votre vérification POP3, utilisez poplib! L'algorithme sera similaire à celui-ci.