mirror of
				https://bitbucket.org/jsuto/piler.git
				synced 2025-10-31 12:12:27 +01:00 
			
		
		
		
	imapfetch.py can read imap connection from import table
Signed-off-by: Janos SUTO <sj@acts.hu>
This commit is contained in:
		| @@ -1,14 +1,32 @@ | ||||
| #!/usr/bin/python3 | ||||
| # -*- coding: utf-8 -*- | ||||
|  | ||||
| import MySQLdb as dbapi | ||||
| import argparse | ||||
| import configparser | ||||
| import imaplib | ||||
| import re | ||||
| import sys | ||||
|  | ||||
| opts = {} | ||||
| INBOX = 'INBOX' | ||||
|  | ||||
|  | ||||
| def read_options(filename="", opts={}): | ||||
|     s = "[piler]\n" + open(filename, 'r').read() | ||||
|     config = configparser.ConfigParser() | ||||
|     config.read_string(s) | ||||
|  | ||||
|     if config.has_option('piler', 'mysqlhost'): | ||||
|         opts['dbhost'] = config.get('piler', 'mysqlhost') | ||||
|     else: | ||||
|         opts['dbhost'] = 'localhost' | ||||
|  | ||||
|     opts['username'] = config.get('piler', 'mysqluser') | ||||
|     opts['password'] = config.get('piler', 'mysqlpwd') | ||||
|     opts['database'] = config.get('piler', 'mysqldb') | ||||
|  | ||||
|  | ||||
| def read_folder_list(conn): | ||||
|     result = [] | ||||
|  | ||||
| @@ -34,11 +52,13 @@ def read_folder_list(conn): | ||||
|  | ||||
|  | ||||
| def process_folder(conn, folder): | ||||
|     print("Processing {}".format(folder)) | ||||
|     if opts['verbose']: | ||||
|         print("Processing {}".format(folder)) | ||||
|  | ||||
|     rc, data = conn.select(folder) | ||||
|     n = int(data[0]) | ||||
|     print("Folder {} has {} messages".format(folder, n)) | ||||
|     if opts['verbose']: | ||||
|         print("Folder {} has {} messages".format(folder, n)) | ||||
|  | ||||
|     if n > 0: | ||||
|         rc, data = conn.search(None, 'ALL') | ||||
| @@ -46,39 +66,71 @@ def process_folder(conn, folder): | ||||
|             rc, data = conn.fetch(num, '(RFC822)') | ||||
|             if opts['verbose']: | ||||
|                 print(rc, num) | ||||
|             opts['counter'] = opts['counter'] + 1 | ||||
|             opts['counter'] += 1 | ||||
|             with open("{}.eml".format(opts['counter']), "wb") as f: | ||||
|                 f.write(data[0][1]) | ||||
|  | ||||
|  | ||||
| def main(): | ||||
|     parser = argparse.ArgumentParser() | ||||
|     parser.add_argument("-s", "--server", type=str, help="imap server", required=True) | ||||
|     parser.add_argument("-c", "--config", type=str, help="piler.conf path", | ||||
|                         default="/etc/piler/piler.conf") | ||||
|     parser.add_argument("-s", "--server", type=str, help="imap server") | ||||
|     parser.add_argument("-P", "--port", type=int, help="port number", default=143) | ||||
|     parser.add_argument("-u", "--user", type=str, help="imap user", required=True) | ||||
|     parser.add_argument("-p", "--password", type=str, help="imap password", | ||||
|                         required=True) | ||||
|     parser.add_argument("-u", "--user", type=str, help="imap user") | ||||
|     parser.add_argument("-p", "--password", type=str, help="imap password") | ||||
|     parser.add_argument("-x", "--skip-list", type=str, help="IMAP folders to skip", | ||||
|                         default="junk,trash,spam,draft") | ||||
|     parser.add_argument("-f", "--folders", type=str, | ||||
|                         help="Comma separated list of IMAP folders to download") | ||||
|     parser.add_argument("-i", "--import-from-table", help="Read imap conn data from import table", action='store_true') | ||||
|     parser.add_argument("-v", "--verbose", help="verbose mode", action='store_true') | ||||
|  | ||||
|     args = parser.parse_args() | ||||
|  | ||||
|     print(args) | ||||
|     if not bool(args.import_from_table or args.server): | ||||
|         print("Please specify either --import-from-table or --server <imap host>") | ||||
|         sys.exit(1) | ||||
|  | ||||
|     opts['skip_folders'] = args.skip_list.split(',') | ||||
|     opts['verbose'] = args.verbose | ||||
|     opts['counter'] = 0 | ||||
|     opts['db'] = None | ||||
|  | ||||
|     server = '' | ||||
|     user = '' | ||||
|     password = '' | ||||
|  | ||||
|     if args.import_table: | ||||
|         read_options(args.config, opts) | ||||
|         try: | ||||
|             opts['db'] = dbapi.connect(opts['dbhost'], opts['username'], | ||||
|                                        opts['password'], opts['database']) | ||||
|  | ||||
|             cursor = opts['db'].cursor() | ||||
|             cursor.execute("SELECT server, username, password FROM import WHERE started=0") | ||||
|  | ||||
|             row = cursor.fetchone() | ||||
|             if row: | ||||
|                 (server, user, password) = row | ||||
|  | ||||
|         except dbapi.DatabaseError as e: | ||||
|             print("Error %s" % e) | ||||
|     else: | ||||
|         server = args.server | ||||
|         user = args.user | ||||
|         password = args.password | ||||
|  | ||||
|     if opts['verbose']: | ||||
|         print("Skipped folder list: {}".format(opts['skip_folders'])) | ||||
|  | ||||
|     if args.port == 993: | ||||
|         conn = imaplib.IMAP4_SSL(args.server) | ||||
|         conn = imaplib.IMAP4_SSL(server) | ||||
|     else: | ||||
|         conn = imaplib.IMAP4(args.server) | ||||
|         conn = imaplib.IMAP4(server) | ||||
|  | ||||
|     conn.login(args.user, args.password) | ||||
|     conn.login(user, password) | ||||
|     conn.select() | ||||
|  | ||||
|     if args.folders: | ||||
| @@ -94,6 +146,10 @@ def main(): | ||||
|  | ||||
|     conn.close() | ||||
|  | ||||
|     if opts['db']: | ||||
|         opts['db'].close() | ||||
|  | ||||
|     print("Processed {} messages".format(opts['counter'])) | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user