Найти - Пользователи
Полная версия: Проверка аккаунтов smtp. Прикрутить многопоточность. Как?
Начало » Python для новичков » Проверка аккаунтов smtp. Прикрутить многопоточность. Как?
1
mark24
На моем корпоротивном почтовом сервере много пользователей. Иногда мне надо проверить их валидность. Некоторые умельцы меняют пароли на более легкие, а это не хорошо. Я экспортирую из БД в txt учетные данные типа логин:пароль[/b. Написал скрипт проверки. Вот он:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smtplib
gLogin = []
gPass = []
def hello():
    print 'Enter the file name with the usernames and passwords'
    x = raw_input('File name: ')
    return x
def LoadList(NameFile):
    global gLogin
    global gPass
    f = open(NameFile, 'r')
    for login in f.xreadlines():
        i1 = login.find('@')
        i2 = login.find(':')
        tmpline = login
        login = login[0:i1]
        passw = tmpline[i2+1:len(tmpline)-1]
        gLogin.append(login)
        gPass.append(passw)
def check(lg, pas):
    server = smtplib.SMTP('smtp.corpmail.ru:25')
    server.starttls()
    server.set_debuglevel(1)
    server.login(lg, pas)
    try:
        print 'Acount', lg + '@corpmail.ru  - open access!'
        server.quit()
    except:
        print 'Acount', lg + '@corpmail.ru  - access denied...'
def main():
    global gLogin
    global gPass
    fname = hello()
    LoadList(fname)
    for i in xrange(len(gLogin)):
        check(gLogin[i], gPass[i])
      
    return 0
if __name__ == '__main__':
    main()

Код выполняеться. Но проблема в исключении.
 try:
        print 'Acount', lg + '@corpmail.ru  - open access!'
        server.quit()
 except:
        print 'Acount', lg + '@corpmail.ru  - access denied...'

Если аккаунт верный, то как и положено код в блоке try выполняеться, пишет мне open access!, но как только доходит до аккаунта с неверным паролем, то выполнение прекращаеться.


smtplib.SMTPAuthenticationError: (535, ‘5.7.8 Error: authentication failed: Invalid user or password!’)

Process finished with exit code 1


Вопрос! Почему не выполняеться блок except:? Получаеться исключение но он не выполняеться! Помогите!
Вопрос №2
Скрипт работает долго. Хотелось бы много поточность. Подскажите как это сделать? Просто я ни разу с этим не сталкивался…
noob_saibot
У вас:
server.login(lg, pas)
не входит в try.
mark24
noob_saibot
noob_saibot
У вас:
И то верно, глаз замылися. Ламерская ошибка(((
mark24
Явно что-то делаю не так. Вот что написал:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smtplib
import threading
import Queue
import time
import sys
gLogin = []
gPass = []
gIndex = 0
def hello():
    print 'Enter the file name with the usernames and passwords'
    x = raw_input('File name: ')
    return x
def LoadList(NameFile):
    global gLogin
    global gPass
    f = open(NameFile, 'r')
    for login in f.xreadlines():
        i1 = login.find('@')
        i2 = login.find(':')
        tmpline = login
        login = login[0:i1]
        passw = tmpline[i2+1:len(tmpline)-1]
        gLogin.append(login)
        gPass.append(passw)
    if len(gLogin) != len(gPass):
        print (len(gLogin)), ' x ', (len(gPass))
        print 'Error! Check whether the input file! The script is stopped ...'
        sys.exit()
def SaveGood(WriteInf):
    f = open('good.txt', 'a')
    f.write(WriteInf)
    f.close()
def check(lg, pas):
    server = smtplib.SMTP('smtp.corpmail.ru:25')
    server.starttls()
    #server.set_debuglevel(1)
    try:
        server.login(lg, pas)
        SaveGood(lg + '@corpmail.ru:' + pas + '\n')
        print 'Acount', lg + '@corpmail.ru  - open access!'
        server.quit()
    except:
        print 'Acount', lg + '@corpmail.ru  - access denied...'
        server.quit()
#############################################################
def processing(thread_num, iq):
    global gIndex
    while True:
        n = iq.get()
        for i in xrange(gIndex):
            check(gLogin[i], gPass[i])
        iq.task_done()
#############################################################
def main():
    global gLogin
    global gPass
    global gIndex
    fname = hello()
    LoadList(fname)
    gIndex = len(gLogin)
#######################################################################
    num_threads = 4
    in_queue = Queue.Queue()
    for i in xrange(200, 300):
        in_queue.put(i)
#######################################################################
    t_start_calc = time.time()
    for i in xrange(num_threads):
        worker = threading.Thread(target=processing, args=(i, in_queue))
        worker.setDaemon(True)
        worker.start()
    in_queue.join()
    #for i in xrange(len(gLogin)):
    #    check(gLogin[i], gPass[i])
    t_end = time.time()
    print 'Operation time - ', t_end - t_start_calc ,' mS'
    return 0
if __name__ == '__main__':
    main()

Но код зацилкиваеться… Терминал хрен остановишь. На проверку одного ака выдает 4. В чем проблема?
noob_saibot
Не понял, что это:
mark24
gIndex = len(gLogin)
и
mark24
def processing(thread_num, iq):
    global gIndex
    while True:
        n = iq.get()
        for i in xrange(gIndex):
            check(gLogin[i], gPass[i])
        iq.task_done()

Так же не понял что такое: “На проверку одного ака выдает 4”
Если проблема не в try и не в задании gIndex то предлагаю каждый этап пронумеровать и наглядно увидите, где зацикливается а => и почему

PS: А без Queue работает?
Lexander
1. Пароли в корпоративной системе хранятся в открытом виде - facepalm.
2. На счет ускорения посмотрите http://python.su/forum/topic/23291/
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB