File: pymailgui-products/unzipped/docetc/obsolete/obsolete--mailconfig-console0.py
""" ================================================================================ **NO LONGER USED** but retained for users who may be reliant on the prior console-based input model (e.g., by piping an account name in with os.popen). If this need this utility, rename this file dropping its "-console" part, after saving the newer GUI-based "mailconfig.py" under a different name. -------------------------------------------------------------------------------- Get default or account-specific mailconfig settings from this directory. In short: This module is imported by PyMailGui-PP4E/SharedNames.py when file PyMailGui-PP4E/PyMailGui.py's code is exec'd in-process by the launcher script, ./Launch_PyMailGUI.py. Other mailconfigs in the MailConfigs folder here import and override defaults from MailConfigs/_mailconfig.py, which is a copy of PyMailGui-PP4E/mailconfig.py. This avoids in-place PymailGui changes. When the launcher runs PyMailGUI: -The CWD is set to PyMailGui's (for relative file opens). -The launcher's dir is 1st on sys.path (for mailconfig and MailConfigs imports). -PyMailGui's dir is 2nd on sys.path (for all other imports). -In the standalone package, other PP4E imports are nested in PyMailGui's dir. How the launch process works: 1) Launch_PyMailGUI runs PyMailGui-PP4E/PyMailGui.py as inline code, after configuring sys.path to look here first, and setting CWD to PyMailGui's dir. 2) PyMailGui-PP4E code imports the mailconfig.py here (this file, in this dir), instead of the module of the same name in its own dir. 3) mailconfig.py (this) imports * from an account-specific mailconfig_XXX.py in MailConfigs, using a name XXX input by a user at the console (or a default). 4) Account-specific mailconfigs in MailConfigs import and customize settings in MailConfigs/_mailconfig.py - a copy of the PyMailGui-PP4E/mailconfig.py base. The net effect is to replace PyMailGui-PP4E/mailconfig.py with names imported by this file from account-specific modules in this folder's MailConfigs package. This may seem a bit of a hack, but it allows PyMailGUI to be run to select from 1 of N accounts unchanged; it was not originally coded for this use case. ================================================================================ """ # When this code runs on import, its folder is first on sys.path (for imports), # but CWD is PyMailGUI-PP4E (for relative file names); this doesn't open itself! # This also uses binary-mode files to ignore the Unicode encoding of base file, # "_X" variable names to avoid clashing with settings in mailconfig files, # exec() to run an import with a computed module name in this module's scope, # copystat() to copy base's modtime to avoid a .pyc recompile if hasn't changed. # An os.path.exists(_up + 'mailconfig_%s.py' % _acct) can't be used to detect # valid inputs: it's case-insensitive on Windows, but Python imports are not! import os, glob, shutil, sys, traceback # copy base file up to others _up = '..' + os.sep + 'MailConfigs' + os.sep # up: relative to CWD _base = open('mailconfig.py', 'rb') # base version, below _copy = open(_up + '_mailconfig.py', 'wb') # for others' defaults _copy.write(_base.read()) # bytewise file copy _copy.close() # close to ensure flush shutil.copystat('mailconfig.py', _up + '_mailconfig.py') # modtime for recompile # get module name and import * while True: try: _acct = input('Account name (Enter=default)? ') # "*", in "mailconfig_*.py" except (KeyboardInterrupt, EOFError): # on ctrl-c or ctrl-z/d sys.exit() if _acct and ('mailconfig_%s.py' % _acct) not in os.listdir(_up): # show valid options and go again _mods = glob.glob(_up + 'mailconfig_*.py') # Mar2016: split on just 1 "_" to allow >1 in acct name (arg #2) _keys = [_mod.split('_', 1)[1][:-3] for _mod in _mods] print('Invalid choice: must be one of', _keys) print('or Enter to use the base file, or Ctrl+C or EOF to exit this program.') continue try: if not _acct: # copy base's names into this from MailConfigs._mailconfig import * # via ".", sys.path[0] else: # copy acct's names into this exec('from MailConfigs.mailconfig_%s import *' % _acct) except: # any config file exc: display and exit print('Error in config file...\n') # or sys.exc_info()[0/1] traceback.print_exc() # or limit=-1 in 3.5+? input('\nPress Enter to close.') sys.exit() else: # configs imported okay: proceed break # though irrelevant in offline mode (imapfetch, save files) print('servers: %s, %s' % (popservername, smtpservername)) # user: mailtools