Use MailParser to decode charset
parent
a3e054e4b0
commit
db62cbbbeb
|
@ -1,6 +1,5 @@
|
||||||
const gen = require('gen-thread');
|
const gen = require('gen-thread');
|
||||||
const Imap = require('imap');
|
const Imap = require('imap');
|
||||||
const iconv = require('iconv-lite');
|
|
||||||
|
|
||||||
module.exports = ImapManager;
|
module.exports = ImapManager;
|
||||||
|
|
||||||
|
@ -225,17 +224,7 @@ ImapManager.prototype.parseMessage = function*(msg, seqnum)
|
||||||
});
|
});
|
||||||
stream.once('end', function()
|
stream.once('end', function()
|
||||||
{
|
{
|
||||||
var b = buffer.toString('utf8');
|
msgrow.headers = buffer;
|
||||||
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;
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
msg.once('attributes', function(a) {
|
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 ImapManager = require('./ImapManager.js');
|
||||||
const EventEmitter = require('events').EventEmitter;
|
const EventEmitter = require('events').EventEmitter;
|
||||||
const MailParser = require('mailparser').MailParser;
|
const MailParser = require('mailparser').MailParser;
|
||||||
|
const iconv = require('iconv-lite');
|
||||||
|
|
||||||
module.exports = Syncer;
|
module.exports = Syncer;
|
||||||
|
|
||||||
|
@ -377,7 +378,7 @@ Syncer.prototype.saveMessages = function*(messages, boxId)
|
||||||
|
|
||||||
Syncer.prototype.parseMsg = function*(msg)
|
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.once('end', gen.cb());
|
||||||
parser.write(msg);
|
parser.write(msg);
|
||||||
var [ obj ] = yield parser.end();
|
var [ obj ] = yield parser.end();
|
||||||
|
@ -423,6 +424,13 @@ Syncer.prototype.addMessage = function*(boxId, msgrow, attrs)
|
||||||
if (!header.date)
|
if (!header.date)
|
||||||
header.date = new Date(attrs.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;
|
delete msgrow.headers;
|
||||||
msgrow.folder_id = boxId;
|
msgrow.folder_id = boxId;
|
||||||
msgrow.subject = header.subject || '';
|
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 srv = yield* this.syncer.imap.getConnection(msg.account_id, msg.folder_name);
|
||||||
var [ upd ] = yield* this.syncer.imap.runFetch(
|
var [ upd ] = yield* this.syncer.imap.runFetch(
|
||||||
srv, msg.uid, { bodies: '' },
|
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);
|
this.syncer.imap.releaseConnection(msg.account_id);
|
||||||
return res.send({ msg: { ...msg, ...upd } });
|
return res.send({ msg: { ...msg, ...upd } });
|
||||||
|
@ -200,19 +200,16 @@ function sanitizeHtml(html)
|
||||||
return 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++)
|
for (var i = 0; i < messages.length; i++)
|
||||||
{
|
{
|
||||||
let msg = messages[i];
|
let msg = messages[i];
|
||||||
p.on('end', gen.cb());
|
let obj = yield* this.syncer.parseMsg(msg[0].headers);
|
||||||
p.write(msg[0].headers);
|
|
||||||
let [ obj ] = yield p.end();
|
|
||||||
obj.html = sanitizeHtml(obj.html);
|
obj.html = sanitizeHtml(obj.html);
|
||||||
let upd = { body_text: obj.text||'', body_html: obj.html };
|
let upd = { body_text: obj.text||'', body_html: obj.html };
|
||||||
upd.body_html_text = obj.html.replace(/<style[^>]*>.*<\/style\s*>|<\/?[^>]*>/g, '');
|
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)
|
if (messages.length == 1)
|
||||||
return [ upd ];
|
return [ upd ];
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,8 @@
|
||||||
"express-session": "latest",
|
"express-session": "latest",
|
||||||
"iconv-lite": "latest",
|
"iconv-lite": "latest",
|
||||||
"imap": "latest",
|
"imap": "latest",
|
||||||
"mailparser": "latest",
|
"mailparser": "git+https://github.com/vitalif/mailparser#master",
|
||||||
|
"mimelib": "git+https://github.com/vitalif/mimelib#master",
|
||||||
"multer": "latest",
|
"multer": "latest",
|
||||||
"nodemailer": "latest",
|
"nodemailer": "latest",
|
||||||
"pg": "latest",
|
"pg": "latest",
|
||||||
|
|
Loading…
Reference in New Issue