From 3e6cc2042b72c085b8d0979f389229108a74e1d3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 2 Oct 2010 12:30:30 -0600 Subject: [PATCH] Fix #7029 (Error while sending book to e-mail) --- src/calibre/__init__.py | 18 ++++++++++++++++++ src/calibre/gui2/device.py | 8 ++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 16aaab73dd..0579c75eea 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -455,6 +455,24 @@ def prepare_string_for_xml(raw, attribute=False): def isbytestring(obj): return isinstance(obj, (str, bytes)) +def force_unicode(obj, enc=preferred_encoding): + if isbytestring(obj): + try: + obj = obj.decode(enc) + except: + try: + obj = obj.decode(filesystem_encoding if enc == + preferred_encoding else preferred_encoding) + except: + try: + obj = obj.decode('utf-8') + except: + obj = repr(obj) + if isbytestring(obj): + obj = obj.decode('utf-8') + return obj + + def human_readable(size): """ Convert a size in bytes into a human readable form """ divisor, suffix = 1, "B" diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 254c62e48c..211104816a 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -23,7 +23,7 @@ from calibre.gui2 import config, error_dialog, Dispatcher, dynamic, \ warning_dialog, \ question_dialog, info_dialog, choose_dir from calibre.ebooks.metadata import authors_to_string -from calibre import preferred_encoding, prints +from calibre import preferred_encoding, prints, force_unicode from calibre.utils.filenames import ascii_filename from calibre.devices.errors import FreeSpaceError from calibre.utils.smtp import compose_mail, sendmail, extract_email_address, \ @@ -964,12 +964,12 @@ class DeviceMixin(object): # {{{ for jobname, exception, tb in results: title = jobname.partition(':')[-1] if exception is not None: - errors.append([title, exception, tb]) + errors.append(list(map(force_unicode, [title, exception, tb]))) else: good.append(title) if errors: - errors = '\n'.join([ - '%s\n\n%s\n%s\n' % + errors = u'\n'.join([ + u'%s\n\n%s\n%s\n' % (title, e, tb) for \ title, e, tb in errors ])