Python:正确的方法验证电子邮件是否存在

13

我正在尝试通过首先解析其 DNS,然后使用下面的代码检查电子邮件是否有效来验证电子邮件地址是否存在:

    email = test@cisco.com
    domain = email.split("@")[-1]
    records = dns.resolver.query(domain, 'MX')
    mxRecord = records[0].exchange
    mxRecord = str(mxRecord)
    server.connect(mxRecord)
    server.helo(host)
    server.mail('myemail@gmail.com')
    code, message = server.rcpt(str(email))
    server.quit()
    if code == 250:
        print('valid email', message) 
    else:
        print('invalid email', message)

这个方法有时会起作用,但当我发送多个请求时,我会收到如下消息:

"5.7.1服务不可用,客户端主机[122.166.xxx.xxx]被列入Spamhaus黑名单。要申请从此列表中删除,请访问http://www.spamhaus.org/lookup.lasso (AS160312312)[BL2NAM02FT12312.eop-nam02.prod.protection.outlook.com]"

我理解他们试图阻止我的IP地址,因为它认为这是垃圾邮件。

以下是我的问题:

  • 有没有正确的方法进行此类型的电子邮件验证,而不被标记为垃圾邮件?是否被标记为垃圾邮件是因为我在我的系统上运行代码并仅提供了一个虚拟值作为电子邮件,比如

server.mail('myemail@gmail.com')

  • 是否可能使用某些代理来完成此操作?我的用例需要验证数百个电子邮件地址。我看到一些商业API可用于电子邮件验证,但目前对我来说不可行。

1
你能找到任何解决方案吗? - r4v1
1
没有好的方法可以做到这一点,原因很简单,如果全球的邮件服务器都响应这样的查询,它们将被垃圾邮件发送者淹没,无法执行有用的工作。 - BoarGules
5个回答

13

截至2021年,我能找到的最新的Python3包是py3-validate-email

基本用法:

from validate_email import validate_email
is_valid = validate_email(email_address='example@example.com', check_regex=True, check_mx=True, from_address='my@from.addr.ess', helo_host='my.host.name', smtp_timeout=10, dns_timeout=10, use_blacklist=True, debug=False)

安装:

pip3 install py3-validate-email

3

dnslib中的这种方法不适用于批量电子邮件验证。因为如果您发送大量电子邮件验证请求,smtp服务器会阻止您。那么您应该使用通过pysocks库的代理。您还可以在medium上查看此帖子:

import socket
import socks # PySocks

from smtplib import SMTP

class SocksSMTP(SMTP):

def __init__(self,
        host='',
        port=0,
        local_hostname=None,
        timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
        source_address=None,
        proxy_type=None,
        proxy_addr=None,
        proxy_port=None,
        proxy_rdns=True,
        proxy_username=None,
        proxy_password=None,
        socket_options=None):

    self.proxy_type=proxy_type
    self.proxy_addr=proxy_addr
    self.proxy_port=proxy_port
    self.proxy_rdns=proxy_rdns
    self.proxy_username=proxy_username
    self.proxy_password=proxy_password
    self.socket_options=socket_options
    # if proxy_type is provided then change the socket to socksocket
    # else behave like a normal SMTP class.
    if self.proxy_type:
        self._get_socket = self.socks_get_socket

    super(SocksSMTP, self).__init__(host, port, local_hostname, timeout, source_address)

def socks_get_socket(self, host, port, timeout):
    if self.debuglevel>0:
        self._print_debug('connect: to', (host, port), self.source_address)
    return socks.create_connection((host, port),
            timeout=timeout,
            source_address=self.source_address,
            proxy_type=self.proxy_type,
            proxy_addr=self.proxy_addr,
            proxy_port=self.proxy_port,
            proxy_rdns=self.proxy_rdns,
            proxy_username=self.proxy_username,
            proxy_password=self.proxy_password,
            socket_options=self.socket_options)

1

如果您不想被标记为垃圾邮件,那么您需要花一些时间来对抗反垃圾邮件措施。否则,很可能会被标记为垃圾邮件。

您可以考虑使用Real Email这样的服务进行验证。

import requests

api_key = "" // todo put your api key here
email_address = "foo@bar.com"
response = requests.get(
    "https://isitarealemail.com/api/email/validate",
    params = {'email': email_address},
    headers = {'Authorization': "Bearer " + api_key })

status = response.json()['status']
if status == "valid":
  print("email is valid")
elif status == "invalid":
  print("email is invalid")
else:
  print("email was unknown")

真正的电子邮件是免费的吗? - Gianmaria Dalla Torre

0

我找到了一种检查电子邮件是否存在的方法。我使用了Real Email API。我可以为您提供一个简单的脚本,您可以在此基础上继续操作。

import requests

email_address = str(input('Email: '))
response = requests.get(
    "https://isitarealemail.com/api/email/validate",
    params = {'email': email_address})

status = response.json()['status']
if status == "valid":
  print("email is valid")
elif status == "invalid":
  print("email is invalid")
else:
  print("email was unknown")

-2

试试这个。

pip install validate_email

from validate_email import validate_email
is_valid = validate_email('example@example.com', verify=True)

访问 https://pypi.org/project/validate_email/ 获取更多信息。


4
这个软件包也使用同样的方法。事实上,我已经尝试过这个软件包。但它根本不起作用。 https://github.com/syrusakbary/validate_email/issues/89 有人已经指出了同样的问题。 - Sam Rohn
1
这个包不起作用;如果超时或出错,它也不返回任何内容,这意味着如果出现问题,就没有任何办法知道。 - cuuupid
那么你们用了什么? - chip
仅适用于 Gmail。 - aac
这个软件包自2015年以来就没有得到维护!并且在2020年已经不能使用了!而且一开始它也没有起作用。 - Mohammad Moallemi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接