Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
this.headerBytes += headerPos;
break;
} else if (pr1 === 0x0d && pr2 === 0x0a) {
this.headersParsed = true;
headerPos = i - lblen + 1;
this.headerBytes += headerPos;
break;
}
}
}
if (this.headersParsed) {
this.headerChunks.push(data.slice(0, headerPos));
this.rawHeaders = Buffer.concat(this.headerChunks, this.headerBytes);
this.headerChunks = null;
this.headers = new Headers(this.rawHeaders);
this.emit('headers', this.headers);
if (data.length - 1 > headerPos) {
const chunk = data.slice(headerPos);
// this would be the first chunk of data sent downstream
// from now on we keep header and body separated until final delivery
setImmediate(() => this.push(chunk));
}
return false;
}
this.headerBytes += data.length;
this.headerChunks.push(data);
// store last 4 bytes to catch header break
this._updateLastBytes(data);
_flush(callback) {
if (this.headerChunks) {
// all chunks are checked but we did not find where the body starts
// so emit all we got as headers and push empty line as body
this.headersParsed = true;
// add header terminator
this.headerChunks.push(Buffer.from('\r\n\r\n'));
this.headerBytes += 4;
// join all chunks into a header block
this.rawHeaders = Buffer.concat(this.headerChunks, this.headerBytes);
this.headers = new Headers(this.rawHeaders);
this.emit('headers', this.headers);
this.headerChunks = null;
// this is our body
this.push(Buffer.from('\r\n'));
}
callback();
}
}
const _getRfc822HtmlAndTextBody = function(body, callback) {
var rfc_body_info = { 'html' : '', 'text' : '' };
var rfc_822_node = _getFirstNodeOfType(body, 'message/rfc822');
let splitter = new Splitter();
// handle parsed data
splitter.on('data', data => {
switch (data.type) {
case 'node':
var headers = data.getHeaders().toString('utf8').split(' ');
var content_type_index = headers.indexOf('Content-Type:');
// if we have a content_type, then the next index is the value
var content_type = content_type_index > -1 ? headers[content_type_index+1] : null;
// if we've encountered either content type, set it to collect the result
collect_html = content_type === 'text/html;'
collect_text = content_type === 'text/plain;'
message.meta = message.meta || {};
message.headers = message.headers || [];
let time = (typeof message.meta.time === 'number' && message.meta.time) || Date.now();
message.logId = id;
message.logSeq = seq;
message.seqTo = seqTo;
message.logEntries = logEntries;
message.created = new Date(time).toISOString();
if (message.meta.expiresAfter) {
message.meta.expiresAfter = new Date(message.meta.expiresAfter).toISOString();
}
let headers = new mailsplit.Headers(message.meta.headers || []);
message.subject = headers.getFirst('subject');
try {
message.subject = libmime.decodeWords(message.subject);
} catch (E) {
// ignore
}
if (message.meta.spam && message.meta.spam.default) {
message.spamStatus = true;
switch (message.meta.spam.default.action) {
case 'no action':
message.spamLabel = 'success';
message.spamText = 'Clean';
break;
case 'reject':
message.spamLabel = 'danger';
const getHeadersFromEmailFile = pathtoemail => {
const Splitter = require('mailsplit').Splitter;
const splitter = new Splitter();
const emailFileStream = fs.createReadStream(pathtoemail);
let headers;
let isFirst = true;
return new Promise(resolve => {
splitter.on('data', data => {
if (data.type === 'node' && isFirst) {
headers = `${data.getHeaders()}`;
isFirst = false;
}
});
splitter.on('error', () =>
resolve({ error: true, message: `Failed to split file: ${pathtoemail}` })
);
splitter.on('end', () => resolve({ error: false, message: headers }));
emailFileStream.pipe(splitter);
});