mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-07-13 03:27:39 +03:00
Support UTF8 in EML files #662
This commit is contained in:
parent
31aaf80f00
commit
bc5194a494
1 changed files with 17 additions and 4 deletions
|
|
@ -2,7 +2,9 @@
|
||||||
const
|
const
|
||||||
// RFC2045
|
// RFC2045
|
||||||
QPDecodeIn = /=([0-9A-F]{2})/g,
|
QPDecodeIn = /=([0-9A-F]{2})/g,
|
||||||
QPDecodeOut = (...args) => String.fromCharCode(parseInt(args[1], 16));
|
QPDecodeOut = (...args) => String.fromCharCode(parseInt(args[1], 16)),
|
||||||
|
|
||||||
|
utf8To16 = data => new TextDecoder().decode(Uint8Array.from(data, c => c.charCodeAt(0)));
|
||||||
|
|
||||||
export function ParseMime(text)
|
export function ParseMime(text)
|
||||||
{
|
{
|
||||||
|
|
@ -43,11 +45,12 @@ export function ParseMime(text)
|
||||||
// charset = this.header('content-type')?.params.charset,
|
// charset = this.header('content-type')?.params.charset,
|
||||||
encoding = this.headerValue('content-transfer-encoding');
|
encoding = this.headerValue('content-transfer-encoding');
|
||||||
if ('quoted-printable' == encoding) {
|
if ('quoted-printable' == encoding) {
|
||||||
body = body.replace(/=\r?\n/g, '').replace(QPDecodeIn, QPDecodeOut);
|
body = utf8To16(body.replace(/=\r?\n/g, '').replace(QPDecodeIn, QPDecodeOut));
|
||||||
} else if ('base64' == encoding) {
|
} else if ('base64' == encoding) {
|
||||||
body = atob(body.replace(/\r?\n/g, ''));
|
body = utf8To16(atob(body.replace(/\r?\n/g, '')));
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
// TODO: convert charsets other then utf8
|
||||||
try {
|
try {
|
||||||
// https://developer.mozilla.org/en-US/docs/Web/API/Encoding_API/Encodings
|
// https://developer.mozilla.org/en-US/docs/Web/API/Encoding_API/Encodings
|
||||||
return new TextDecoder(charset).decode(Uint8Array.from(body, c => c.charCodeAt(0)));
|
return new TextDecoder(charset).decode(Uint8Array.from(body, c => c.charCodeAt(0)));
|
||||||
|
|
@ -111,8 +114,18 @@ export function ParseMime(text)
|
||||||
[...header.matchAll(/;\s*([^;=]+)=\s*"?([^;"]+)"?/g)].forEach(param =>
|
[...header.matchAll(/;\s*([^;=]+)=\s*"?([^;"]+)"?/g)].forEach(param =>
|
||||||
params[param[1].trim().toLowerCase()] = param[2].trim()
|
params[param[1].trim().toLowerCase()] = param[2].trim()
|
||||||
);
|
);
|
||||||
|
// encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
|
||||||
|
match[2] = match[2].trim().replace(/=\?([^?]+)\?(B|Q)\?(.+?)\?=/g, (m, charset, encoding, text) => {
|
||||||
|
m = decodeURIComponent(
|
||||||
|
'B' == encoding ? escape(atob(text))
|
||||||
|
// else 'Q'
|
||||||
|
: text.replace(/=([A-Z0-9]{2})/, '%$1')
|
||||||
|
);
|
||||||
|
// TODO: convert when charset != utf-8
|
||||||
|
return m;
|
||||||
|
});
|
||||||
headers[match[1].trim().toLowerCase()] = {
|
headers[match[1].trim().toLowerCase()] = {
|
||||||
value: match[2].trim(),
|
value: match[2],
|
||||||
params: params
|
params: params
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue