From 160b3397f3121c9808beb88827278937220020f5 Mon Sep 17 00:00:00 2001 From: Florin Boariu Date: Thu, 11 Apr 2019 10:30:58 +0200 Subject: [PATCH] When piping imapcli output, an exception is raised if emails contain non-8-bit characters (e.g. utf-8 encoding). This does NOT happen during regular usage, only during pipe usage. The reason is that /dev/stdout, the device usually used for output, is essentially just an 8-bit character output device. This patch fixes this by explicitlyu converting everyting to utf-8 before it is being written to /dev/stdout. --- examples/multimailboxsearch.py | 4 ++-- examples/summary.py | 4 ++-- imap_cli/fetch.py | 4 ++-- imap_cli/list_mail.py | 4 ++-- imap_cli/scripts/imap_shell.py | 10 +++++----- imap_cli/search.py | 4 ++-- imap_cli/summary.py | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/examples/multimailboxsearch.py b/examples/multimailboxsearch.py index a847bbc..6af7f11 100644 --- a/examples/multimailboxsearch.py +++ b/examples/multimailboxsearch.py @@ -53,7 +53,7 @@ def main(): if len(mail_set) > 0: sys.stdout.write(u'{} Directory\n'.format( - directory_status['directory'])) + directory_status['directory']).encode('UTF-8')) for mail_info in search.fetch_mails_info(imap_account, mail_set=mail_set): @@ -64,7 +64,7 @@ def main(): sys.stdout.write(format_string.format( mail_info['uid'], mail_info['from'], - mail_info['subject'])) + mail_info['subject']).encode('UTF-8')) imap_cli.disconnect(imap_account) except KeyboardInterrupt: log.info('Interrupt by user, exiting') diff --git a/examples/summary.py b/examples/summary.py index c5ac970..2c037f1 100644 --- a/examples/summary.py +++ b/examples/summary.py @@ -42,7 +42,7 @@ def main(): for directory_status in sorted(imap_cli.status(imap_account), key=lambda obj: obj['directory']): if int(directory_status['unseen']) > 0: - sys.stdout.write(directory_status['directory']) + sys.stdout.write(directory_status['directory'].encode('UTF-8')) sys.stdout.write('\n') imap_cli.change_dir(imap_account, @@ -62,7 +62,7 @@ def main(): sys.stdout.write(format_string.format( mail_info['uid'], mail_info['from'], - mail_info['subject'])) + mail_info['subject']).encode('UTF-8')) imap_cli.disconnect(imap_account) except KeyboardInterrupt: log.info('Interrupt by user, exiting') diff --git a/imap_cli/fetch.py b/imap_cli/fetch.py index 37fe85c..2206a80 100644 --- a/imap_cli/fetch.py +++ b/imap_cli/fetch.py @@ -201,7 +201,7 @@ def main(): if len(args['']) == 0: args[''] = sys.stdin.read().strip().split() if len(args['']) == 0: - sys.stderr.write('\n'.join(__doc__.split('\n')[2:])) + sys.stderr.write('\n'.join(__doc__.split('\n')[2:]).encode('UTF-8')) return 1 conf = config.new_context_from_file(args['--config-file'], section='imap') @@ -220,7 +220,7 @@ def main(): return 1 for fetched_mail in fetched_mails: - sys.stdout.write(display(fetched_mail)) + sys.stdout.write(display(fetched_mail).encode('UTF-8')) imap_cli.disconnect(imap_account) except KeyboardInterrupt: diff --git a/imap_cli/list_mail.py b/imap_cli/list_mail.py index e6b6e0d..425a4df 100644 --- a/imap_cli/list_mail.py +++ b/imap_cli/list_mail.py @@ -79,7 +79,7 @@ def main(): for mail_info in search.fetch_mails_info(imap_account, limit=limit): sys.stdout.write( - display_conf['format_list'].format(**mail_info)) + display_conf['format_list'].format(**mail_info).encode('UTF-8')) sys.stdout.write('\n') else: threads = search.fetch_threads(imap_account, limit=limit) @@ -88,7 +88,7 @@ def main(): imap_account, mail_tree, format_thread=display_conf['format_thread']): - sys.stdout.write(output) + sys.stdout.write(output.encode('UTF-8')) sys.stdout.write('\n') imap_cli.disconnect(imap_account) except KeyboardInterrupt: diff --git a/imap_cli/scripts/imap_shell.py b/imap_cli/scripts/imap_shell.py index 34d3b52..ddd4433 100644 --- a/imap_cli/scripts/imap_shell.py +++ b/imap_cli/scripts/imap_shell.py @@ -107,7 +107,7 @@ def do_list(self, arg): u'UID : {:<10} From : {:<40.40} Subject : {:.50}\n'.format( mail_info['uid'], mail_info['from'], - mail_info['subject'])) + mail_info['subject']).encode('UTF-8')) def do_mv(self, arg): '''Move mail from one mailbox to another.''' @@ -167,7 +167,7 @@ def do_read(self, arg): temp_file.close() else: - sys.stdout.write(fetch.display(fetched_mail)) + sys.stdout.write(fetch.display(fetched_mail).encode('UTF-8')) def do_search(self, arg): '''Search mail.''' @@ -217,7 +217,7 @@ def do_search(self, arg): u'UID : {:<10} From : {:<40.40} Subject : {:.50}\n'.format( mail_info['uid'], mail_info['from'], - mail_info['subject'])) + mail_info['subject']).encode('UTF-8')) def do_status(self, arg): 'Print status of all IMAP folder in this account' @@ -229,7 +229,7 @@ def do_status(self, arg): directory_status['directory'], directory_status['unseen'], directory_status['recent'], - directory_status['count'])) + directory_status['count']).encode('UTF-8')) def do_unseen(self, arg): '''List Unseen mail (equivalent to "search -t unseen").''' @@ -245,7 +245,7 @@ def do_unseen(self, arg): u'UID : {:<10} From : {:<40.40} Subject : {:.50}\n'.format( mail_info['uid'], mail_info['from'], - mail_info['subject'])) + mail_info['subject']).encode('UTF-8')) def emptyline(self): pass diff --git a/imap_cli/search.py b/imap_cli/search.py index f77d279..292a2f7 100644 --- a/imap_cli/search.py +++ b/imap_cli/search.py @@ -479,7 +479,7 @@ def main(): for mail_info in fetch_mails_info(imap_account, limit=limit, mail_set=mail_set): sys.stdout.write( - display_conf['format_list'].format(**mail_info)) + display_conf['format_list'].format(**mail_info).encode('UTF-8')) sys.stdout.write('\n') else: threads = fetch_threads(imap_account, limit=limit, @@ -488,7 +488,7 @@ def main(): for output in display_mail_tree( imap_account, mail_tree, format_thread=display_conf['format_thread']): - sys.stdout.write(output) + sys.stdout.write(output.encode('UTF-8')) sys.stdout.write('\n') imap_cli.disconnect(imap_account) diff --git a/imap_cli/summary.py b/imap_cli/summary.py index 35c3952..bb75439 100644 --- a/imap_cli/summary.py +++ b/imap_cli/summary.py @@ -58,7 +58,7 @@ def main(): for directory_status in sorted(imap_cli.status(imap_account), key=lambda obj: obj['directory']): sys.stdout.write( - display_conf['format_status'].format(**directory_status)) + display_conf['format_status'].format(**directory_status).encode('UTF-8')) sys.stdout.write('\n') except KeyboardInterrupt: log.info('Interrupt by user, exiting')