From db62cbbbeba884005897d3e2c6d3e869c436985e Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Wed, 5 Oct 2016 13:50:33 +0300 Subject: [PATCH] Use MailParser to decode charset --- ImapManager.js | 13 +------------ Syncer.js | 10 +++++++++- SyncerWeb.js | 11 ++++------- package.json | 3 ++- 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/ImapManager.js b/ImapManager.js index e3fed69..dfe0562 100644 --- a/ImapManager.js +++ b/ImapManager.js @@ -1,6 +1,5 @@ const gen = require('gen-thread'); const Imap = require('imap'); -const iconv = require('iconv-lite'); module.exports = ImapManager; @@ -225,17 +224,7 @@ ImapManager.prototype.parseMessage = function*(msg, seqnum) }); stream.once('end', function() { - var b = buffer.toString('utf8'); - if (b.indexOf('�') >= 0) - { - let enc = /Content-type:\s*[^;\n]*;\s*charset=(\S+)/i.exec(b); - enc = enc ? enc[1] : 'windows-1251'; - try { b = iconv.decode(buffer, enc); } - catch (e) {} - } - if (b.indexOf('\0') >= 0) - b = b.substr(0, b.indexOf('\0')); - msgrow.headers = b; + msgrow.headers = buffer; }); }); msg.once('attributes', function(a) { diff --git a/Syncer.js b/Syncer.js index 7018f02..b9e8528 100644 --- a/Syncer.js +++ b/Syncer.js @@ -3,6 +3,7 @@ const Imap = require('imap'); const ImapManager = require('./ImapManager.js'); const EventEmitter = require('events').EventEmitter; const MailParser = require('mailparser').MailParser; +const iconv = require('iconv-lite'); module.exports = Syncer; @@ -377,7 +378,7 @@ Syncer.prototype.saveMessages = function*(messages, boxId) Syncer.prototype.parseMsg = function*(msg) { - var parser = new MailParser({ streamAttachments: false, defaultCharset: 'utf-8' }); + var parser = new MailParser({ streamAttachments: false, defaultCharset: 'windows-1251' }); parser.once('end', gen.cb()); parser.write(msg); var [ obj ] = yield parser.end(); @@ -423,6 +424,13 @@ Syncer.prototype.addMessage = function*(boxId, msgrow, attrs) if (!header.date) header.date = new Date(attrs.date); + if (JSON.stringify(header).indexOf('�') >= 0) + { + // Charset error! + console.log(iconv.decode(msgrow.headers, 'cp1251')); + console.log(header); + } + delete msgrow.headers; msgrow.folder_id = boxId; msgrow.subject = header.subject || ''; diff --git a/SyncerWeb.js b/SyncerWeb.js index 84483ed..2b24203 100644 --- a/SyncerWeb.js +++ b/SyncerWeb.js @@ -124,7 +124,7 @@ SyncerWeb.prototype.get_message = function*(req, res) var srv = yield* this.syncer.imap.getConnection(msg.account_id, msg.folder_name); var [ upd ] = yield* this.syncer.imap.runFetch( srv, msg.uid, { bodies: '' }, - (messages, state) => getBody(this.pg, messages, msg.folder_id) + (messages, state) => this.getBody(messages, msg.folder_id) ); this.syncer.imap.releaseConnection(msg.account_id); return res.send({ msg: { ...msg, ...upd } }); @@ -200,19 +200,16 @@ function sanitizeHtml(html) return html; } -function* getBody(pg, messages, boxId) +SyncerWeb.prototype.getBody = function*(messages, boxId) { - var p = new MailParser({ streamAttachments: false, defaultCharset: 'windows-1251' }); for (var i = 0; i < messages.length; i++) { let msg = messages[i]; - p.on('end', gen.cb()); - p.write(msg[0].headers); - let [ obj ] = yield p.end(); + let obj = yield* this.syncer.parseMsg(msg[0].headers); obj.html = sanitizeHtml(obj.html); let upd = { body_text: obj.text||'', body_html: obj.html }; upd.body_html_text = obj.html.replace(/]*>.*<\/style\s*>|<\/?[^>]*>/g, ''); - yield pg.update('messages m', upd).where({ folder_id: boxId, uid: msg[0].uid }).run(gen.ef()); + yield this.pg.update('messages m', upd).where({ folder_id: boxId, uid: msg[0].uid }).run(gen.ef()); if (messages.length == 1) return [ upd ]; } diff --git a/package.json b/package.json index 3e1820a..3dea864 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "express-session": "latest", "iconv-lite": "latest", "imap": "latest", - "mailparser": "latest", + "mailparser": "git+https://github.com/vitalif/mailparser#master", + "mimelib": "git+https://github.com/vitalif/mimelib#master", "multer": "latest", "nodemailer": "latest", "pg": "latest",