Python:使用smtplib检查邮件并处理错误

Python:使用smtplib检查邮件并处理错误,python,dns,smtp,Python,Dns,Smtp,我需要以编程方式检查电子邮件。我正在使用以下代码: resolver = dns.resolver.Resolver() resolver.timeout = 3 resolver.lifetime = 3 mx_records = resolver.query(domain, 'MX') for mxRecord in mx_records: mxRecord = str(mxRecord.exchange) host =

我需要以编程方式检查电子邮件。我正在使用以下代码:

    resolver = dns.resolver.Resolver()
    resolver.timeout = 3
    resolver.lifetime = 3
    mx_records = resolver.query(domain, 'MX')
    for mxRecord in mx_records:
        mxRecord = str(mxRecord.exchange)
        host = socket.gethostname()
        server = smtplib.SMTP(timeout=30)
        server.set_debuglevel(0)
        addressToVerify = var0
        server.connect(mxRecord)
        server.helo(host)
        server.mail('me@domain.com')
        code, message = server.rcpt(str(addressToVerify))
        server.quit()
        res_email = 'Not Found'
        if code == 250:
            result = 'Success'
        else:
            print "doesn't exist"
Connection unexpectedly closed
Connection unexpectedly closed: [Errno 10054] 
[Errno 10061]
运行此代码时,我收到一个错误:

    resolver = dns.resolver.Resolver()
    resolver.timeout = 3
    resolver.lifetime = 3
    mx_records = resolver.query(domain, 'MX')
    for mxRecord in mx_records:
        mxRecord = str(mxRecord.exchange)
        host = socket.gethostname()
        server = smtplib.SMTP(timeout=30)
        server.set_debuglevel(0)
        addressToVerify = var0
        server.connect(mxRecord)
        server.helo(host)
        server.mail('me@domain.com')
        code, message = server.rcpt(str(addressToVerify))
        server.quit()
        res_email = 'Not Found'
        if code == 250:
            result = 'Success'
        else:
            print "doesn't exist"
Connection unexpectedly closed
Connection unexpectedly closed: [Errno 10054] 
[Errno 10061]
我试图更改超时值,但没有帮助。然后我尝试在
smtplib.SMTP()
中指定端口,但指定了
587
,这也没有解决问题


如何解决这个问题?

您可以从Python帮助文件中复制代码来查询POP3服务器。在这里,它是以非常轻微的修改形式出现的

import poplib, getpass

pop = poplib.POP3('***********', port=110)
pop.user('**********')
pop.pass_('*********')
print (pop.stat())
print (pop.list()[1])
您只需从邮件客户端复制各种常量,例如端口号

此脚本生成的输出可能会让您感到惊讶,具体取决于邮件客户端中的设置。这是我刚得到的

(431104784) [b'1 15848',b'2 7889',b'3 7938',b'4 3705',b'5 28933',b'6 35479',b'7 12793',b'8 7094',b'11 17194',b'12 312802',b'13 12688',b'14 18431',b'15 24454',b'16 17769',b'17 16223',b'18 14975',b'19 11951',b'20 13373',b'21 34949',b'22 23647',b'23 224958',b'26 24458',10928'b'828',b'2914311',b'307477',b'313852',b'328497',b'334086',b'347240',b'3569458',b'3619430',b'37110263',b'382434',b'3912043',b'405306',b'4110288',b'4217164',b'4374974']

但是我知道服务器上没有我在邮件客户端中没有收到的邮件。这个小问题的答案是,我的电子邮件客户端会在服务器上保留消息两周,或者直到我默认删除它们为止,这大概是为了在某种计算机故障的情况下防止丢失


这意味着仅仅使用上述输出作为新消息的检查是不够的。需要从接收到的消息的标题中记录最长两周的日期,以便与服务器上的日期进行比较。

您可以复制代码,从Python帮助文件中查询POP3服务器。在这里,它是以非常轻微的修改形式出现的

import poplib, getpass

pop = poplib.POP3('***********', port=110)
pop.user('**********')
pop.pass_('*********')
print (pop.stat())
print (pop.list()[1])
您只需从邮件客户端复制各种常量,例如端口号

此脚本生成的输出可能会让您感到惊讶,具体取决于邮件客户端中的设置。这是我刚得到的

(431104784) [b'1 15848',b'2 7889',b'3 7938',b'4 3705',b'5 28933',b'6 35479',b'7 12793',b'8 7094',b'11 17194',b'12 312802',b'13 12688',b'14 18431',b'15 24454',b'16 17769',b'17 16223',b'18 14975',b'19 11951',b'20 13373',b'21 34949',b'22 23647',b'23 224958',b'26 24458',10928'b'828',b'2914311',b'307477',b'313852',b'328497',b'334086',b'347240',b'3569458',b'3619430',b'37110263',b'382434',b'3912043',b'405306',b'4110288',b'4217164',b'4374974']

但是我知道服务器上没有我在邮件客户端中没有收到的邮件。这个小问题的答案是,我的电子邮件客户端会在服务器上保留消息两周,或者直到我默认删除它们为止,这大概是为了在某种计算机故障的情况下防止丢失


这意味着仅仅使用上述输出作为新消息的检查是不够的。有必要将收到邮件的邮件头中的日期记录长达两周,以便与服务器上的邮件进行比较。

是否要发送到或接收您作为合法用户的已知服务器?@BillBell我只需检查emailSMTP是发送协议。您需要Python中的poplib或imaplib,这取决于您的电子邮件是POP3还是IMAP的某种变体。@Bill Bell;我有一个类似的问题;有没有快速简便的方法来确定电子邮件是什么?@bobox:你的电子邮件服务器是POP3吗?如果是这样的话,我可以写一个答案,因为我有权获得答案。否则,您应该问一个新问题。是否要发送到或接收您是合法用户的已知服务器?@BillBell我只需检查emailSMTP是否为发送协议。您需要Python中的poplib或imaplib,这取决于您的电子邮件是POP3还是IMAP的某种变体。@Bill Bell;我有一个类似的问题;有没有快速简便的方法来确定电子邮件是什么?@bobox:你的电子邮件服务器是POP3吗?如果是这样的话,我可以写一个答案,因为我有权获得答案。否则,你应该问一个新问题。