【问题标题】:python: correct method verify if email existspython:正确的方法验证电子邮件是否存在
【发布时间】:2019-05-02 19:56:57
【问题描述】:

我正在尝试通过首先解析其 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] 被阻止使用 垃圾屋。要请求从此列表中删除,请参阅 http://www.spamhaus.org/lookup.lasso (AS160312312) [BL2NAM02FT12312.eop-nam02.prod.protection.outlook.com]'"

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

这是我的问题:

  • 是否有正确的方法来进行这种类型的电子邮件验证,而不会被标记为垃圾邮件?它是否被标记为垃圾邮件,因为我在我的系统上运行代码并且只是为电子邮件提供一个虚拟值,例如

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

  • 是否可以使用一些代理来执行此操作?我的用例需要验证 100 个电子邮件地址。我看到一些商业 api 可用于电子邮件验证,但目前对我来说不可行。

【问题讨论】:

  • 您找到任何解决方案了吗?
  • 没有很好的方法来做到这一点,原因很简单,如果世界上的邮件服务器要响应这样的查询,他们会被垃圾邮件发送者淹没,以至于他们没有能力做有用的工作.

标签: python smtp email-validation spam-prevention email-spam


【解决方案1】:

截至 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

【讨论】:

    【解决方案2】:

    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)
    

    【讨论】:

      【解决方案3】:

      是的,您很可能会被标记为垃圾邮件。如果您想避免这种情况,您需要付出一些努力来对抗反垃圾邮件措施。

      您可以考虑使用像 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")
      

      【讨论】:

        【解决方案4】:

        试试这个。

        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/了解更多信息。

        【讨论】:

        • 这个包也是用同样的方法。事实上我试过这个包。它根本不起作用。 github.com/syrusakbary/validate_email/issues/89 有人指出了同样的情况
        • 这个包不起作用;它也不会在超时或错误时返回任何内容,这意味着如果出现问题,则无法知道
        • 你们都用了什么?
        • 仅适用于 gmail
        • 这个包自 2015 年以来就没有维护过!而且是2020年不行!而且它一开始也不起作用
        【解决方案5】:

        您为什么不发送实际的电子邮件?将来自不同 ip 的 100 封左右独特的电子邮件排成队列,然后发送一封实际的电子邮件。使用 spintax 和速率限制将标题、主题行和消息更改为每封电子邮件每小时 8 个以下,您应该可以毫无问题地获得规模。 Spamhaus 会自动将您标记为从虚假帐户发送并超出限制......对于未使用的电子邮件帐户,大约是 8 个/小时。也不要将与销售相关的消息放在您生成的电子邮件中。

        【讨论】:

          猜你喜欢
          • 2023-03-21
          • 1970-01-01
          • 2011-03-03
          • 1970-01-01
          • 2012-10-30
          • 2017-02-27
          • 2011-10-26
          • 1970-01-01
          • 2014-04-15
          相关资源
          最近更新 更多