【问题标题】:Check Email is exist on SMTP server in Python?检查电子邮件是否存在于 Python 中的 SMTP 服务器上?
【发布时间】:2020-04-16 11:28:46
【问题描述】:

我为验证电子邮件是否真的存在于 SMTP 服务器上创建了一个脚本,一切正常,但一些假电子邮件也会发送响应 250 OK。我该如何管理这个问题。请帮帮我。

try:
            domain_name = addressToVerify['Email'].split('@')[1]

            records = dns.resolver.query(domain_name, 'MX')
            mxRecord = records[0].exchange
            mxRecord = str(mxRecord)
            host = socket.gethostname()
            server = smtplib.SMTP()
            server.set_debuglevel(0)
            server.connect(mxRecord)
            server.helo(host)
            server.mail('example@example.com')
            code, message = server.rcpt(str(addressToVerify['Email']))

            server.quit()

【问题讨论】:

    标签: python python-3.x networking dns smtplib


    【解决方案1】:

    首先,电子邮件地址验证是电子邮件相关 RFC 中的“banned”(好吧,它仍然存在,但在生产场景中几乎没有人启用它)的一项功能,原因很明显:它变成了它从未打算过的东西,垃圾邮件发送者的天堂。但是,它只能用于本地帐户。因为这就是电子邮件传递的工作方式。概念的 SMTP 部分仅用于发送、传递。它是一个继电器。 SMTP 服务器不知道收件人,因为它只是试图将消息传递到下一跳——当然,它可以是本地服务器,但也可以是任何远程服务器。它使用 DNS MX 记录从电子邮件地址域部分获取其他 SMTP 方的地址。如果找到,它会连接到其他服务器并传递消息。如果是本地邮件,它会联系管理实际邮箱的本地投递代理。那个人会知道邮箱是否存在。如果没有,它将根据其配置做出反应:它可能会或可能不会重放任何警告。但由于互联网的性质,所有这些都是异步发生的。

    但是,正如您所见,SMTP 服务器本身无法判断收件人邮箱是否真的存在——本地地址除外。您可以自己验证 MX 记录,但这会告诉您是否有注册到该电子邮件域的 SMTP 服务器 - 并检查其在网络上的可用性。而已。 但您实际上不能指望VRFY 工作

    旁注:本地代理不直接绑定到任何邮箱协议。您可以拥有一个没有运行邮箱协议服务器的邮箱。这没什么意义,但在技术上不是必需的。

    当然,您可以为任何操作系统获得的大多数电子邮件服务都是复杂的,其中包含 SMTP、递送代理和 POP3 或 IMAP/MAPI 服务器。

    【讨论】:

    • 还有其他验证电子邮件的方法吗?
    • @Sangram 很抱歉,但实际上没有办法。您可以验证地址语法,仅此而已。
    • @Barmar 是的,RFC 仍然包含它。但请看这里的例子:sonicwall.com/support/knowledge-base/…
    • RFC 说可以在配置中禁用它。但是您写道,它被禁止并且永远不会成为 SMTP RFC 的一部分,即使您链接到 RFC 的一部分。
    • @Barmar 对,我的表述很糟糕。它是一部分,它仍然是它的一部分。我删除那句话。然而,即便如此,它还是被禁止(不以任何理由删除),因为使用它存在很高的安全风险。
    猜你喜欢
    • 2011-10-22
    • 2012-07-15
    • 1970-01-01
    • 2023-03-22
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2015-06-10
    相关资源
    最近更新 更多