mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
fix(Email Trigger (IMAP) Node): Handle gb2312 encoding correctly
This commit is contained in:
parent
d165b33cea
commit
31755ca568
|
@ -136,7 +136,7 @@ export class ImapSimple extends EventEmitter {
|
||||||
|
|
||||||
const data = result.parts[0].body as string;
|
const data = result.parts[0].body as string;
|
||||||
const encoding = part.encoding.toUpperCase();
|
const encoding = part.encoding.toUpperCase();
|
||||||
resolve(PartData.fromData(data, encoding));
|
resolve(PartData.fromData(data, encoding, part.params?.charset));
|
||||||
};
|
};
|
||||||
|
|
||||||
const fetchOnError = (error: Error) => {
|
const fetchOnError = (error: Error) => {
|
||||||
|
|
|
@ -7,8 +7,8 @@ import * as uuencode from 'uuencode';
|
||||||
export abstract class PartData {
|
export abstract class PartData {
|
||||||
constructor(readonly buffer: Buffer) {}
|
constructor(readonly buffer: Buffer) {}
|
||||||
|
|
||||||
toString() {
|
toString(charset?: string) {
|
||||||
return this.buffer.toString();
|
return iconvlite.decode(this.buffer, charset ?? 'utf-8');
|
||||||
}
|
}
|
||||||
|
|
||||||
static fromData(data: string, encoding: string, charset?: string): PartData {
|
static fromData(data: string, encoding: string, charset?: string): PartData {
|
||||||
|
@ -44,10 +44,25 @@ export class Base64PartData extends PartData {
|
||||||
}
|
}
|
||||||
|
|
||||||
export class QuotedPrintablePartData extends PartData {
|
export class QuotedPrintablePartData extends PartData {
|
||||||
|
static ansiBuffer(data: string): Buffer {
|
||||||
|
const decoded = qp.decode(data);
|
||||||
|
const arr = [];
|
||||||
|
for (let index = 0; index < decoded.length; index++) {
|
||||||
|
arr.push(decoded.charCodeAt(index));
|
||||||
|
}
|
||||||
|
return Buffer.from(arr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static utf8Buffer(data: string): Buffer {
|
||||||
|
return Buffer.from(utf8.decode(qp.decode(data)));
|
||||||
|
}
|
||||||
|
|
||||||
constructor(data: string, charset?: string) {
|
constructor(data: string, charset?: string) {
|
||||||
const decoded =
|
const decoded =
|
||||||
charset?.toUpperCase() === 'UTF-8' ? utf8.decode(qp.decode(data)) : qp.decode(data);
|
charset?.toUpperCase() === 'UTF-8'
|
||||||
super(Buffer.from(decoded));
|
? QuotedPrintablePartData.utf8Buffer(data)
|
||||||
|
: QuotedPrintablePartData.ansiBuffer(data);
|
||||||
|
super(decoded);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,14 @@ describe('QuotedPrintablePartData', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('QuotedPrintableGB2312PartData', () => {
|
||||||
|
it('should correctly decode quoted-printable data', () => {
|
||||||
|
const data = '=C4=E3=BA=C3=A3=AC =CA=C0=BD=E7=A3=A1'; // '你好, 世界!' in quoted-printable with gb2312 encoding
|
||||||
|
const partData = new QuotedPrintablePartData(data, 'gb2312');
|
||||||
|
expect(partData.toString('gb2312')).toBe('你好, 世界!');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('SevenBitPartData', () => {
|
describe('SevenBitPartData', () => {
|
||||||
it('should correctly decode 7bit data', () => {
|
it('should correctly decode 7bit data', () => {
|
||||||
const data = 'Hello, world!';
|
const data = 'Hello, world!';
|
||||||
|
|
|
@ -321,7 +321,7 @@ export class EmailReadImapV2 implements INodeType {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const partData = await connection.getPartData(message, part);
|
const partData = await connection.getPartData(message, part);
|
||||||
return partData.toString();
|
return partData.toString(part.params?.charset);
|
||||||
} catch {
|
} catch {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue