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



[Home page] Books Code Blog Python Author Train Find ©M.Lutz