def MailSource(session, my_config): # FIXME: check the plugin and instanciate the right kind of mail source # for this config section. if my_config.protocol in ('mbox', 'maildir', 'local'): from mailpile.mail_source.local import LocalMailSource return LocalMailSource(session, my_config) elif my_config.protocol in ('imap', 'imap_ssl', 'imap_tls'): from mailpile.mail_source.imap import ImapMailSource return ImapMailSource(session, my_config) elif my_config.protocol in ('pop3', 'pop3_ssl'): from mailpile.mail_source.pop3 import Pop3MailSource return Pop3MailSource(session, my_config) raise ValueError( _('Unknown mail source protocol: %s') % my_config.protocol)
def migrate_mailboxes(session): config = session.config # FIXME: This should be using mailpile.vfs.FilePath # FIXME: Link new mail sources to a profile... any profile? def _common_path(paths): common_head, junk = os.path.split(paths[0]) for path in paths: head, junk = os.path.split(path) while (common_head and common_head != '/' and head and head != '/' and head != common_head): # First we try shortening the target path... while head and head != '/' and head != common_head: head, junk = os.path.split(head) # If that failed, lop one off the common path and try again if head != common_head: common_head, junk = os.path.split(common_head) head, junk = os.path.split(path) return common_head mailboxes = [] thunderbird = [] spam_tids = [tag._key for tag in config.get_tags(type='spam')] trash_tids = [tag._key for tag in config.get_tags(type='trash')] inbox_tids = [tag._key for tag in config.get_tags(type='inbox')] # Iterate through config.sys.mailbox, sort mailboxes by type for mbx_id, path, src in config.get_mailboxes(with_mail_source=False): if (path.startswith('src:') or config.is_editable_mailbox(mbx_id)): continue elif 'thunderbird' in path.lower(): thunderbird.append((mbx_id, path)) else: mailboxes.append((mbx_id, path)) if thunderbird: # Create basic mail source... if 'tbird' not in config.sources: config.sources['tbird'] = { 'name': 'Thunderbird', 'protocol': 'mbox', } config.sources.tbird.discovery.create_tag = True config.sources.tbird.discovery.policy = 'read' config.sources.tbird.discovery.process_new = True tbird_src = LocalMailSource(session, config.sources.tbird) # Configure discovery policy? root = _common_path([path for mbx_id, path in thunderbird]) if 'thunderbird' in root.lower(): # FIXME: This is wrong, we should create a mailbox entry # with the policy 'watch'. tbird_src.my_config.discovery.path = root # Take over all the mailboxes for mbx_id, path in thunderbird: mbx = tbird_src.take_over_mailbox(mbx_id) if 'inbox' in path.lower(): mbx.apply_tags.extend(inbox_tids) elif 'spam' in path.lower() or 'junk' in path.lower(): mbx.apply_tags.extend(spam_tids) elif 'trash' in path.lower(): mbx.apply_tags.extend(trash_tids) tbird_src.my_config.discovery.policy = 'unknown' for name, proto, description, cls in ( ('mboxes', 'local', 'Local mailboxes', LocalMailSource), ): if mailboxes: # Create basic mail source... if name not in config.sources: config.sources[name] = { 'name': description, 'protocol': proto } config.sources[name].discovery.create_tag = False config.sources[name].discovery.policy = 'read' config.sources[name].discovery.process_new = True config.sources[name].discovery.apply_tags = inbox_tids[:] src = cls(session, config.sources[name]) for mbx_id, path in mailboxes: mbx = src.take_over_mailbox(mbx_id) config.sources[name].discovery.policy = 'unknown' return True