[FIX] mail_thread: save attachment from mail in same encoding
Steps to reproduce:
- Configure incoming mail server and set it to create X record
on incoming mails (X can be any model with a chatter)
- Create a CSV file and set the encoding to UTF-16
- Send the CSV file through Gmail to the Odoo instance
- Go to model X and open the created record
- In the chatter, click/download the CSV file
- Open the downloaded file with Geany (or any file editor that can
show the file encoding)
Issue:
The file encoding is not the same as the original file (utf-8 instead
of utf-16).
Working with Outlook.
Cause:
The difference between Outlook and Gmail is that Gmail provides the
charset of the file.
The content of the mail is retrieved using `email` python lib.
The lib will try to retrieve the charset of the file and fallback
on `ASCII` if not available, then return the decode content.
```python
def get_text_content(msg, errors='replace'):
content = msg.get_payload(decode=True)
charset = msg.get_param('charset', 'ASCII')
return content.decode(charset, errors=errors)
```
Example:
content = b'd\x00a\x00,\x00,\x00,\......'
Outlook:
charset = 'ASCII'
return => 'd\x00a\x00,\x00,\x00...'
Gmail:
charset = 'UTF-16LE'
return => 'da,,,,,\n,,,,,\....'
In the post process of the attachment, the content is encoded in
'utf-8' (to then encoded in base64) before creating the attachment
record.
Content encoded to 'utf-8':
Outlook: b'd\x00a\x00,\x00,\x00...'
Gmail: b'da,,,,,\n,,,,,\n....'
Therefore, when writing the file on the disk, the encoding is based
on the binary content.
Solution:
When parsing the mail, add the encoding charset to the `info` variable.
Then, when creating the attachment, use the charset in `info` (or
fallback on 'utf'8' if no charset set) to encode the content.
opw-3089009
closes odoo/odoo#118694
X-original-commit: 2d1b13e68d8bb204ecfe12a9d3db519c4264592c
Signed-off-by: Nicolas Lempereur (nle) <nle@odoo.com>
Signed-off-by: Nasreddin Boulif (bon) <bon@odoo.com>
This commit is contained in:
@@ -214,6 +214,39 @@ Content-Type: text/html;
|
||||
--Apple-Mail=_9331E12B-8BD2-4EC7-B53E-01F3FBEC9227--
|
||||
"""
|
||||
|
||||
MAIL_FILE_ENCODING = """MIME-Version: 1.0
|
||||
Date: Sun, 26 Mar 2023 05:23:22 +0200
|
||||
Message-ID: {msg_id}
|
||||
Subject: {subject}
|
||||
From: "Sylvie Lelitre" <test.sylvie.lelitre@agrolait.com>
|
||||
To: groups@test.com
|
||||
Content-Type: multipart/mixed; boundary="000000000000b951de05f7c47a9e"
|
||||
|
||||
--000000000000b951de05f7c47a9e
|
||||
Content-Type: multipart/alternative; boundary="000000000000b951da05f7c47a9c"
|
||||
|
||||
--000000000000b951da05f7c47a9c
|
||||
Content-Type: text/plain; charset="UTF-8"
|
||||
|
||||
Test Body
|
||||
|
||||
--000000000000b951da05f7c47a9c
|
||||
Content-Type: text/html; charset="UTF-8"
|
||||
|
||||
<div dir="ltr">Test Body</div>
|
||||
|
||||
--000000000000b951da05f7c47a9c--
|
||||
--000000000000b951de05f7c47a9e
|
||||
Content-Type: text/plain; name="test.txt"{charset}
|
||||
Content-Disposition: attachment; filename="test.txt"
|
||||
Content-Transfer-Encoding: base64
|
||||
X-Attachment-Id: f_lfosfm0l0
|
||||
Content-ID: <f_lfosfm0l0>
|
||||
|
||||
{content}
|
||||
|
||||
--000000000000b951de05f7c47a9e--
|
||||
"""
|
||||
|
||||
MAIL_MULTIPART_BINARY_OCTET_STREAM = """X-Original-To: raoul@grosbedon.fr
|
||||
Delivered-To: raoul@grosbedon.fr
|
||||
|
||||
Reference in New Issue
Block a user