2017-01-18 33 views
0

我試圖使用我發現的腳本ping通電子郵件,以確保它們存在。電子郵件Ping掛在電子郵件

with open(input_list, 'r') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     address = row[0] 
     person_name = row[1]+' '+row[2] 
     company = row[4] 
     match = re.match('^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$', address) 
     print("Email for ", person_name) 
     print(address) 
     if match == None: 
      synt = 'Bad Syntax' 
      warnings.warn(address + " has bad syntax.") 
     else: 
      synt = 'Good syntax' 
     dom = re.search("@(.*)$", address).group(1) 
     print(dom) 
     try: 
      records = dns.resolver.query(dom, 'MX') 
      mxRecord = records[0].exchange 
      mxRecord = str(mxRecord) 
     except: 
      warnings.warn("Issue contacting domain") 
      pass 
     # Get local server hostname 
     host = socket.gethostname() 
     # SMTP lib setup (use debug level for full output) 
     server = smtplib.SMTP('smtp-mail.outlook.com',587)#will need this for mail sending 
     while True: 
      try: 
       server.set_debuglevel(0) 
       # SMTP Conversation 
       server.connect(mxRecord) 
       server.helo(host) 
       server.mail('[email protected]') 
       code, message = server.rcpt(str(address)) 
       server.quit() 
       if code == 250: 
        print('Success') 
        new_row = [address, person_name, company, synt, 'Ping Successful'] 
        email_data.append(new_row) 
        with open('cseresult2.csv', 'a+', newline='') as mess: 
         writ = csv.writer(mess, dialect='excel') 
         writ.writerow(email_data[-1]) 
       else: 
        print('Bad') 
        new_row = [address, person_name, company, synt, 'Ping Bounced'] 
        email_data.append(new_row) 
        with open('cseresult2.csv', 'a+', newline='') as mess: 
         writ = csv.writer(mess, dialect='excel') 
         writ.writerow(email_data[-1]) 
      except: 
       continue 
      break 
     print() 
     print('================') 
     print() 
     time.sleep(3) 

該代碼工作大多好。然而,跳出while循環,我得到了很多超時錯誤:

TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 

while循環已經慎重了,但現在它掛在電子郵件上通過列表的其餘部分不重複。這是一個項目,所以任何幫助,讓它移動,將不勝感激。

回答

0

如果您的while環路遇到任何類型的持續錯誤,它將被設置爲永久繼續。 try區塊中有很多代碼,因此有很多情況可能發生(例如,無法連接到您的電子郵件服務器,未能打開您的csv文件等)。沒有更多的信息,我不能肯定地說這種情況正在發生,但是解決這個問題肯定不會有什麼壞處。

由於您所關心的唯一錯誤是TimeoutError,因此您應該明確地捕獲該錯誤,並且僅在該情況下才會收到該錯誤並且continue。對於所有其他錯誤,要麼打印錯誤並打破循環,要麼讓錯誤冒泡。創建服務器實例時,您還應該將超時值設置爲理智的值。最後,如果在一段時間後超時未解決,則最好使用for循環,該循環結束;即使在持續的TimeoutError的情況下,你不想嘗試永遠:

### Set a sane timeout 
server = smtplib.SMTP('smtp-mail.outlook.com', 587, timeout=1) 

### Try a maximum of 10 times 
for i in range(10): 
    try: 
     ### Connect to the email server and write to your file 

    except TimeoutError, e: 
     print e 

    ### All other errors will bubble up 

如果你是好奇默認的超時時間是什麼,你可以這樣做:

import socket 

print(socket.getdefaulttimeout()) 

的反應是默認超時,以秒爲單位。值爲None表示您永遠不會超時,這似乎不適合您。