Как сделать так, чтобы скрипт не вылетал при неправильном вводе имени пользователя и пароля? (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