Use MailParser to decode charset

master
Vitaliy Filippov 2016-10-05 13:50:33 +03:00
parent a3e054e4b0
commit db62cbbbeb
4 changed files with 16 additions and 21 deletions

View File

@ -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('<27>') >= 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) {

View File

@ -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('<27>') >= 0)
{
// Charset error!
console.log(iconv.decode(msgrow.headers, 'cp1251'));
console.log(header);
}
delete msgrow.headers;
msgrow.folder_id = boxId;
msgrow.subject = header.subject || '';

View File

@ -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[^>]*>.*<\/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 ];
}

View File

@ -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",