2015-04-10 2 views
0

Так что для практики я пробовал написать простую программу для чтения/записи писем из оболочки терминала/python. Моя проблема в том, что всякий раз, когда я пытаюсь ввести неверный ответ, он заканчивает программу, а не возвращается в «главное меню», так сказать. Такая же проблема, когда я пытаюсь дать возможность выйти из программы и попросить пользователя подтвердить, что они хотят выйти. Это мой код:Возврат в «главное меню» для программы мини-электронной почты

import smtplib 
import imaplib 
import email 

print 'Welcome to NhuMail' 
print '\n \nPlease enter your login information: \n' 
user = raw_input('Email User:') 
pw = raw_input("Password:") 


def check_mail(user, pw): 
    # Login to INBOX 
    imap = imaplib.IMAP4_SSL("imap.gmail.com", 993) 
    imap.login(user, pw) 
    imap.select('INBOX') 

    # Use search(), not status() 
    status, response = imap.search('INBOX', '(UNSEEN)') 
    unread_msg_nums = response[0].split() 

    # Print the count of all unread messages 
    print '\n\nYou have %s unread messages.' % (len(unread_msg_nums)) 

def read_mail(): 
    imap = imaplib.IMAP4_SSL("imap.gmail.com", 993) 
    imap.login(user, pw) 
    imap.list() 
    imap.select("inbox") 
    status, response = imap.search('INBOX', '(UNSEEN)') 
    unread_msg_nums = response[0].split() 
    result, data = imap.uid('search', None, "ALL") # search and return uids instead 
    latest_email_uid = data[0].split()[-1] 
    result, data = imap.uid('fetch', latest_email_uid, '(RFC822)') 
    raw_email = data[0][1] 


    email_message = email.message_from_string(raw_email) 

    print email_message['To'] 

    print email.utils.parseaddr(email_message['From']) # for parsing "Yuji Tomita" <[email protected]> 

    email_items = email_message.items() 
    # print all headers 
    print email_items[1] 
    print email_items[2] 
    print email_items[5] 
    print '\n' 



    b = email.message_from_string(raw_email) 
    if b.is_multipart(): 
     for payload in b.get_payload(): 
      # if payload.is_multipart(): ... 
      print payload.get_payload() 
     else: 
      print b.get_payload() 

def new_mail(): 
    from_add = user 
    to_add = raw_input('Enter TO address:') 
    msg = raw_input('Enter desired message:') 


    server = smtplib.SMTP('smtp.gmail.com:587') 
    server.starttls() 
    server.login(user,pw) 
    server.sendmail(from_add,to_add,msg) 

def exit_mail(): 
    confirm_exit = raw_input('Are you sure you want to exit? (Yes/No):') 
    server = smtplib.SMTP('smtp.gmail.com:587') 
    if confirm_exit == 'Yes': 
     server.quit() 
     print 'Nice Nhu-ing you! Come again soon :)' 
    elif confirm_exit == 'No': 
     return prompt 


def mail_options(): 
    prompt = raw_input('Say \'Nhu\' to compose a message \nOR \nSay \'Read\' to read unread message \nOR \nSay \'Escape\' to exit NhuMail: \n') 

    while True: 
     if prompt == 'Nhu': 
      new_mail() 
      return prompt 

     elif prompt == 'Read': 
      read_mail() 
      return prompt 

     elif prompt == 'Escape': 
      exit_mail() 
      break 

     else: 
      print 'You didn\'t enter one of the options!' 
      return prompt 


check_mail(user,pw) 
mail_options() 
+2

Конечно, программа заканчивается; последняя строка вашего кода - 'mail_options()'. Когда он вернется, программа закончится. Можете ли вы предоставить [MCVE] (http://stackoverflow.com/help/mcve)? – KSFT

+0

Вы когда-нибудь получали трассировку или ошибку? – Zizouz212

+0

Однако в 'mail_options()' существует бесконечный цикл. Но тогда вы можете использовать его только один раз, а затем он «зависает», потому что дополнительных подсказок нет. – Zizouz212

ответ

0

Похоже, вы хотите продолжать звонить mail_options(). Вы можете сделать это с помощью бесконечного цикла:

while True: 
    mail_options() 

Вы также можете поместить петлю внутри mail_options():

def mail_options(): 
    while True: 
     prompt = raw_input('Say \'Nhu\' to compose a message \nOR \nSay \'Read\' to read unread message \nOR \nSay \'Escape\' to exit NhuMail: \n') 
      while True: 
       if prompt == 'Nhu': 
        new_mail() 

       elif prompt == 'Read': 
        read_mail() 

       elif prompt == 'Escape': 
        exit_mail() 
        break 

       else: 
        print 'You didn\'t enter one of the options!' 
+0

Ударьте меня на одну секунду! – Zizouz212

+0

спасибо! Сейчас он работает :) –

0

Вопрос в вашей программе находится в mail_options(). У вас есть бесконечный цикл, который может работать только один раз, а затем выходит каждый раз из-за использования инструкции return. Сделайте бесконечный цикл, чтобы постоянно показывать mail_options(), и он должен исправить вашу проблему. Вы звоните только один раз, поэтому он выходит.

Вы можете сделать:

while True: 
    mail_options() 

Другим вариант будет просить подсказку внутри цикла, и избавления функции возврата заявлений.

def mail_options(): 
    while True: 
     prompt = raw_input('Say \'Nhu\' to compose a message \nOR \nSay \'Read\' to read unread message \nOR \nSay \'Escape\' to exit NhuMail: \n') 
     if prompt == 'Nhu': 
      new_mail() 

     elif prompt == 'Read': 
      read_mail() 

     elif prompt == 'Escape': 
      exit_mail() 
      return # Get out of the function. 

     else: 
      print 'You didn\'t enter one of the options!' 
+0

Как его назвать? – KSFT

+0

Было заявление 'return'. Поэтому, конечно, назовите его один раз, значит только одно. – Zizouz212

+0

Я знаю *, что * он только называет это одним. Вы сказали: «[его] называют это только однажды», хотя это и не имеет смысла. – KSFT

0

Попробуйте изменить mail_options() к этому:

def mail_options(): 
    while True: 
     prompt = raw_input('Say \'Nhu\' to compose a message \nOR \nSay \'Read\' to read unread message \nOR \nSay \'Escape\' to exit NhuMail: \n') 
     if prompt == 'Nhu': 
      new_mail() 

     elif prompt == 'Read': 
      read_mail() 

     elif prompt == 'Escape': 
      exit_mail() 
      break 

     else: 
      print 'You didn\'t enter one of the options!' 

Вы присутствуют подсказку один раз, а затем, как только вы получите их результат, вы возвращаете то, что они сказали после запуска указанной функции, а затем, потому что вы используете ключевое слово return, оно вырывается цикла и функции и выходит из программы.

+1

Как это отличается от моего ответа, кроме отсутствия объяснения? – KSFT

+0

Я был в процессе написания его, когда вы разместили ваши, и я не видел ... Кроме того, вы не избавились от операторов возврата, они все равно вырвались из цикла и скрипта (если вы не сделали свой первый вариант), но первый из них довольно грязный, ИМО –