Как сделать так, чтобы скрипт не вылетал при неправильном вводе имени пользователя и пароля? (smtplib - вход в gmail)

У меня есть проблема, когда пользователь, введя неправильное имя пользователя и пароль, получит эту ошибку и произойдет сбой (я довольно новичок в python):

File "/Users/19austinh/Google Drive/Other/Python/Login.py", line 156, in <module>                user.login(euser, epass)
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/smtplib.py", line 634, in login
    raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257 vn10sm22434291pbc.21 - gsmtp')

Вот мой код:

while True:
    user = smtplib.SMTP('smtp.gmail.com', 587)
    user.starttls()
    euser = input("Enter Gmail Username: ")
    epass = input("Enter Gmail Password: ")
    user.login(euser, epass)
    print ("Retrieving Files")
    subjectinput = input("Enter Subject: ")
    msginput = input("Enter Message: ")
    msg = ("\n"+msginput)
    sourcemail = (euser)
    targetmail = input("Enter Your Recipient: ")
    user.sendmail(sourcemail, targetmail, 'Subject: {}\r\n\r\n{}'.format(subjectinput, msg))
    print ("Email Sent")
    ask = input("Whould you like to send another one [Y/N]: ")
    if(ask == "n" or ask == "N" or ask == "no" or ask == "No"):
        break
    if(ask == "y" or ask == "Y" or ask == "yes" or ask == "Yes"):
        continue

Итак, как сделать так, чтобы, когда пользователь вводит неправильное имя пользователя или пароль, он возвращался и запрашивал их учетные данные? Вот что я попробовал:

try:
    user.login(euser, epass)
    except (smtplib.SMTPAuthenticationError):
        print ("Invalid Credentials!")

Тем не менее, это говорит только "Неверные учетные данные!" но это позволяет программе продолжать работу, что приводит к сбою сценария. Я не хочу использовать "break", потому что это выйдет из "while True", и я не хочу, чтобы это произошло. Ответы с благодарностью! Спасибо:)

2 ответа

Решение

Использовать вложенные while цикл:

while True:
    user = smtplib.SMTP('smtp.gmail.com', 587)
    user.starttls()
    while True:
        euser = input("Enter Gmail Username: ")
        epass = input("Enter Gmail Password: ")
        try:
            user.login(euser, epass)
        except smtplib.SMTPAuthenticationError:
            print('Login failure: please reenter credential information.')
            continue
        break
    ...

Я думаю, что вы придерживаетесь следующей конструкции, так что соединение создается, вы повторяете цикл до тех пор, пока вы не войдете в систему успешно, затем вы делаете исходную отправку почты или не цикл, например:

user = smtplib.SMTP('smtp.gmail.com', 587)
user.starttls()
while True: # until we login
    euser = input("Enter Gmail Username: ")
    epass = input("Enter Gmail Password: ")
    try:
        user.login(euser, epass)
    except smtplib.SMTPAuthenticationError:
        print('Login failure: please reenter credential information.')
        continue
    break
while True:
    pass # Your original stuff using the connection
Другие вопросы по тегам