识别&以编程方式验证邮件服务器

时间:2015-08-21 00:25:33

标签: python algorithm smtp

mailtester website中的做法一样,我必须确定&以编程方式验证邮件服务器的存在性。

我已经对网络进行了深入检查,但我没有看到任何教程,操作指南,API,图书馆或在线课程。

将该程序用于任何垃圾邮件目的,就像在上述网站中所做的那样(没有声明有关反垃圾邮件的隐私问题,或者没有声明非法使用和存储有效的电子邮件地址)。顺便说一句,邮件服务器识别是我正在进行的项目的一小部分,但我必须实现它。

请回答任何问题,但所有人都在同一方向,问题:

  • 我应该从哪里开始实施我的待办事项?
  • 任何教程,操作指南,API,图书馆或在线课程?
  • 以编程方式实现上述待办事项的正确方法是什么?

注意:您可以查看屏幕截图,该截图取自上述网站。

screen shot at mail tester

1 个答案:

答案 0 :(得分:0)

我是否正确解释了您的问题:

您想检查是否存在SMTP服务器(例如某些邮件已到达),并且您希望检查该邮件是否也存在。

要做到这一点,你可以做几件事:

解决方案1:

ping服务器,例如mail.example.com,

如果服务器响应,则检查SMTP通常使用的端口是否打开:通常为25

如果至少打开其中一个,那么您可以说该域上的邮件服务器正在运行。

此解决方案存在一些服务器无法响应ping的问题。但是,您可以从DNS请求主机名,而不是ping它,以查看您是否获得域的IP。然后这个解决方案有一个问题,服务器可能已经存在昨天,但现在不是,并且DNS返回IP,但没有人在它的最后。

这可以通过使用子进程调用ping,hostname,netmap和类似工具来实现,或者通过套接字从头开始编写它们。

当然,您可以直接打开到域的套接字,直接到端口25,但是您必须指定超时,因为它可能会发生整个事件阻塞,因为没有来自服务器的答案。是的,ping是一个额外的步骤,但在服务器不存在的情况下更快。它只发送ICMP数据包,它不会尝试任何握手。 (我从经验中知道)。

解决方案2:

更可接受的解决方案是使用smtplib尝试连接到该服务器。

它会"攻击"请求默认端口并发送SMTP请求的指定域。 如果服务器不是SMTP或者它不存在,则会引发异常。 超时也应该设置。 Ping这里也会提高检查速度,不需要超时。你只是假设如果服务器没有回答,它就不存在了。 (嗯,这种方法的聪明才值得怀疑)

如果有任何内容,防火墙,过滤器或类似内容,并不允许您进行任何这些检查,您可以随时拥有本地存储的所有邮件服务器的更新列表(如果可以从任何机器人中获取)连接到你提到的服务,咨询地址。

解决方案3:

检查地址是否存在的最后解决方案是尝试使用该SMTP服务器向自己发送电子邮件。如果事情不起作用,那么电子邮件就不存在了。

大问题!!!:大多数SMTP都没有要求登录是的,但如果这个确实怎么办?并且,大多数SMTP服务器允许您从任何甚至不存在的地址发送电子邮件!

对于电子邮件验证,大多数SMTP都禁用该选项,因此您无法查看是否存在电子邮件。

要进行真实的电子邮件检查,您还必须咨询POP服务器(事实上它是第一位的),看看是否有人可以通过此地址接收电子邮件。

以下是使用smtplib:

仅使用SMTP(如您所知)进行检查的代码


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

addr2check = "something@somethingelse.woops"
# Note, if the server is subdomained for SMTP (like mail.somethingelse.woops) be sure to include it or server wouldn't be found!
#addr2check = "someone@mail.somewhere.here"

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]

要将检查扩展到POP3,请使用poplib!算法与此类似。