linagora-rse
Version:
125 lines (100 loc) • 3.27 kB
JavaScript
;
var MailParser = require('mailparser').MailParser;
var mongoose = require('mongoose');
var EmailMessage = mongoose.model('EmailMessage');
var emailHelpers = require('../../helpers/email');
var attachmentsModule = require('./attachments');
var logger = require('../logger');
var pubsub = require('../../core').pubsub.local;
var topic = pubsub.topic('message:stored');
var q = require('q');
/**
*
* @param {Stream} stream
* @param {Object} author
* @param {Array} shares
* @param {Function} callback
*/
function saveEmail(stream, author, shares, callback) {
var attachments = [];
if (!stream) {
return callback(new Error('email stream is required'));
}
if (!author) {
return callback(new Error('Author is required'));
}
var mailparser = new MailParser({streamAttachments: true});
mailparser.on('end', function(mail_object) {
logger.debug('Parsed email', mail_object);
q.all(attachments).then(function(attachmentModels) {
var mail = new EmailMessage();
if (!mail_object) {
return callback(new Error('Can not parse email'));
}
mail.parsedHeaders = {};
if (mail_object.to) {
mail.parsedHeaders.to = mail_object.to;
}
if (mail_object.from && mail_object.from.length > 0) {
mail.parsedHeaders.from = mail_object.from[0];
}
if (mail_object.cc) {
mail.parsedHeaders.cc = mail_object.cc;
}
if (mail_object.bcc) {
mail.parsedHeaders.bcc = mail_object.bcc;
}
if (mail_object.date) {
mail.parsedHeaders.date = mail_object.date;
}
if (mail_object.subject) {
mail.parsedHeaders.subject = mail_object.subject;
}
mail.author = author;
mail.headers = emailHelpers.formatHeaders(mail_object.headers);
mail.body = {};
mail.body.text = mail_object.text;
mail.body.html = mail_object.html;
if (shares) {
mail.shares = shares;
}
attachmentModels.forEach(function(model) {
mail.attachments.push(model);
});
return mail.save(function(err, response) {
if (!err) {
topic.publish(response);
logger.info('Added new message in database:', { _id: response._id.toString() });
} else {
logger.warn('Error while trying to add a new emailmessage in database:', err.message);
}
callback(err, response);
}, function(err) {
return callback(err);
});
}, function(err) {
return callback(err);
});
});
mailparser.on('attachment', function(attachment) {
logger.debug('Got attachment', attachment);
var d = q.defer();
attachments.push(d.promise);
var metaData = {
name: attachment.fileName,
contentType: attachment.contentType,
length: attachment.length,
creator: {objectType: 'user', id: author._id}
};
attachmentsModule.storeAttachment(metaData, attachment.stream, {chunk_size: 10}, function(err, attachmentModel) {
if (err) {
d.reject(err);
logger.debug('Error while saving attachment.', err);
} else {
d.resolve(attachmentModel);
}
});
});
stream.pipe(mailparser);
}
module.exports.saveEmail = saveEmail;