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

时间:2018-11-30 16:21:57

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

我试图通过首先解析其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')

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

4 个答案:

答案 0 :(得分:1)

尝试一下。

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

答案 1 :(得分:1)

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)

答案 2 :(得分:0)

截至2020年,我能找到的最新的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 :(得分:0)

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