Use MailParser to decode charset
parent
a3e054e4b0
commit
db62cbbbeb
|
@ -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) {
|
||||
|
|
10
Syncer.js
10
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('<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 || '';
|
||||
|
|
11
SyncerWeb.js
11
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[^>]*>.*<\/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 ];
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in New Issue