diff --git a/addons/fetchmail/fetchmail.py b/addons/fetchmail/fetchmail.py index 832a2ffd91024bd5ed16d61ec8f72e894675f090..564c1c11e5486b85379e388f9e1f4fde2e6f1b40 100644 --- a/addons/fetchmail/fetchmail.py +++ b/addons/fetchmail/fetchmail.py @@ -193,24 +193,27 @@ class email_server(osv.osv): msg['id'] = message_id msg['message-id'] = message_id + + def _decode_header(txt): + return ' '.join(map(lambda (x, y): unicode(x, y or 'ascii'), decode_header(txt))) if 'Subject' in fields: - msg['subject'] = ' '.join(map(lambda (x, y): unicode(x, y or 'ascii'), decode_header(msg_txt.get('Subject')))) + msg['subject'] = _decode_header(msg_txt.get('Subject')) if 'Content-Type' in fields: msg['content-type'] = msg_txt.get('Content-Type') if 'From' in fields: - msg['from'] = msg_txt.get('From') + msg['from'] = _decode_header(msg_txt.get('From')) if 'Delivered-To' in fields: - msg['to'] = msg_txt.get('Delivered-To') + msg['to'] = _decode_header(msg_txt.get('Delivered-To')) if 'Cc' in fields: - msg['cc'] = msg_txt.get('Cc') + msg['cc'] = _decode_header(msg_txt.get('Cc')) if 'Reply-To' in fields: - msg['reply'] = msg_txt.get('Reply-To') + msg['reply'] = _decode_header(msg_txt.get('Reply-To')) if 'Date' in fields: msg['date'] = msg_txt.get('Date') @@ -228,7 +231,10 @@ class email_server(osv.osv): msg['priority'] = msg_txt.get('X-priority', '3 (Normal)').split(' ')[0] if not msg_txt.is_multipart() or 'text/plain' in msg.get('content-type', None): + encoding = msg_txt.get_content_charset() msg['body'] = msg_txt.get_payload(decode=True) + if encoding: + msg['body'] = msg['body'].decode(encoding).encode('utf-8') attachents = {} if msg_txt.is_multipart() or 'multipart/alternative' in msg.get('content-type', None): @@ -238,29 +244,34 @@ class email_server(osv.osv): if part.get_content_maintype() == 'multipart': continue + encoding = part.get_content_charset() + if part.get_content_maintype()=='text': content = part.get_payload(decode=True) - if part.get_content_subtype() == 'html': - body = html2plaintext(content) - elif part.get_content_subtype() == 'plain': - body = content - filename = part.get_filename() if filename : - attachents[filename] = part.get_payload(decode=True) - + attachents[filename] = content + else: + if encoding: + content = unicode(content, encoding) + if part.get_content_subtype() == 'html': + body = html2plaintext(content) + elif part.get_content_subtype() == 'plain': + body = content elif part.get_content_maintype()=='application' or part.get_content_maintype()=='image' or part.get_content_maintype()=='text': filename = part.get_filename(); if filename : attachents[filename] = part.get_payload(decode=True) else: - body += part.get_payload(decode=True) + res = part.get_payload(decode=True) + if encoding: + res = res.decode(encoding).encode('utf-8') + + body += res msg['body'] = body msg['attachments'] = attachents - encoding = msg_txt.get_content_charset('utf-8') - msg['body'] = msg['body'].decode(encoding).encode('utf-8') res_id = False if msg.get('references', False):