UNPKG

galleon

Version:

A badass SMTP mail server built on Node to make your life simpler.

95 lines (81 loc) 2.98 kB
// Essentials var fs = require('fs'); var path = require('path'); var _ = require('lodash'); module.exports = function (_this, database, session, parsed, callback) { // Makes sure Email is parsed properly // Otherwise ignore if ( (!parsed) || (typeof (parsed) !== 'object') || (!parsed.envelopeTo) || (!_.isArray(parsed.envelopeTo)) || (!parsed.envelopeTo[0].address) || (!parsed.from) || (!_.isObject(parsed.from)) || (!session) || (!parsed.text && !parsed.html && !parsed.subject) /* Require at least a subject/text/html */ ) { _this.emit('ignored', session, parsed || {}, database); if (_this.environment.verbose) console.error("FAILED TO PARSE EMAIL"); return callback({ responseCode: 451, message: "local error in processing, E-MAIL is invalid." }); } // Formats from to -> Name <email> if (_.isPlainObject(parsed.from)) parsed.from = parsed.from.name + ' <' + parsed.from.address + '>'; else if (_.isArray(parsed.from)) parsed.from = parsed.from[0].name + ' <' + parsed.from[0].address + '>'; // Sets association to envelope's receiver parsed.associtaion = parsed.envelopeTo[0].address; // --------------------- // var email = { eID: session.eID, association: parsed.associtaion, sender: parsed.from, receiver: parsed.headers.to || parsed.associtaion, to: parsed.toAll, stamp: { sent: (new Date(parsed.date)), received: (new Date()) }, subject: parsed.subject, text: parsed.text, html: parsed.html, read: false, trash: false, dkim: (parsed.dkim === "pass"), spf: (parsed.spf === "pass"), spam: false, spamScore: 0, // STRING ENUM: ['pending', 'approved', 'denied'] state: 'pending' } // Load incoming modules _this.environment.modulator.launch('incoming', parsed.associtaion, email, parsed, function (error, _email, _ignore) { if (_this.environment.verbose) console.log("INCOMING MODULES LAUNCHED".green, arguments); // Ignore email if requested if (_ignore === true) return _this.emit('ignored', session, parsed, database); // Assign modified ~email~ object if provided if (!_email) _email = email; // Create a new mail in the database database.collections.mail.create(_email, function (error, model) { if (error) { console.error(error, 'error'); // Emits 'mail' event with - SMTP Session, Mail object, Raw content, Database failure & Database object _this.emit('mail', error, session, parsed, database); callback(error, session, parsed, database); } else { // Add attachments to Mail _this.attach(database, model.eID, parsed.attachments); // Emits 'mail' event with - SMTP Session, Mail object, Raw content, Database model & Database object _this.emit('mail', null, session, parsed, database); callback(null, session, parsed, database); } }); }) }