diff --git a/examples/smtp-appender.js b/examples/smtp-appender.js index cf6f520..3274516 100644 --- a/examples/smtp-appender.js +++ b/examples/smtp-appender.js @@ -9,7 +9,7 @@ log4js.configure({ type: 'console' }, mail: { - type: 'smtp', + type: '@log4js-node/smtp', recipients: 'logfilerecipient@logging.com', sendInterval: 5, transport: 'SMTP', diff --git a/lib/appenders/smtp.js b/lib/appenders/smtp.js deleted file mode 100644 index d2fe8f4..0000000 --- a/lib/appenders/smtp.js +++ /dev/null @@ -1,148 +0,0 @@ -'use strict'; - -/** - * This appender has been deprecated. - * Updates and bug fixes should be made against https://github.com/log4js-node/smtp - */ - -const mailer = require('nodemailer'); -const os = require('os'); - -/** - * SMTP Appender. Sends logging events using SMTP protocol. - * It can either send an email on each event or group several - * logging events gathered during specified interval. - * - * @param _config appender configuration data - * config.sendInterval time between log emails (in seconds), if 0 - * then every event sends an email - * config.shutdownTimeout time to give up remaining emails (in seconds; defaults to 5). - * @param _layout a function that takes a logevent and returns a string (defaults to basicLayout). - */ -function smtpAppender(config, layout, subjectLayout) { - if (!config.attachment) { - config.attachment = {}; - } - - config.attachment.enable = !!config.attachment.enable; - config.attachment.message = config.attachment.message || 'See logs as attachment'; - config.attachment.filename = config.attachment.filename || 'default.log'; - - const sendInterval = config.sendInterval * 1000 || 0; - const shutdownTimeout = ('shutdownTimeout' in config ? config.shutdownTimeout : 5) * 1000; - const transport = mailer.createTransport(getTransportOptions()); - const logEventBuffer = []; - - let unsentCount = 0; - let sendTimer; - - function sendBuffer() { - if (logEventBuffer.length > 0) { - const firstEvent = logEventBuffer[0]; - let body = ''; - const count = logEventBuffer.length; - while (logEventBuffer.length > 0) { - body += `${layout(logEventBuffer.shift(), config.timezoneOffset)}\n`; - } - - const msg = { - to: config.recipients, - subject: config.subject || subjectLayout(firstEvent), - headers: { Hostname: os.hostname() } - }; - - if (config.attachment.enable === true) { - msg[config.html ? 'html' : 'text'] = config.attachment.message; - msg.attachments = [ - { - filename: config.attachment.filename, - contentType: 'text/x-log', - content: body - } - ]; - } else { - msg[config.html ? 'html' : 'text'] = body; - } - - if (config.sender) { - msg.from = config.sender; - } - transport.sendMail(msg, (error) => { - if (error) { - console.error('log4js.smtpAppender - Error happened', error); - } - transport.close(); - unsentCount -= count; - }); - } - } - - function getTransportOptions() { - let options = null; - if (config.SMTP) { - options = config.SMTP; - } else if (config.transport) { - options = config.transport.options || {}; - options.transport = config.transport.plugin || 'smtp'; - } - return options; - } - - function scheduleSend() { - if (!sendTimer) { - sendTimer = setTimeout(() => { - sendTimer = null; - sendBuffer(); - }, sendInterval); - } - } - - function shutdown(cb) { - if (shutdownTimeout > 0) { - setTimeout(() => { - if (sendTimer) { - clearTimeout(sendTimer); - } - - sendBuffer(); - }, shutdownTimeout); - } - - (function checkDone() { - if (unsentCount > 0) { - setTimeout(checkDone, 100); - } else { - cb(); - } - }()); - } - - const appender = (loggingEvent) => { - unsentCount++; // eslint-disable-line no-plusplus - logEventBuffer.push(loggingEvent); - if (sendInterval > 0) { - scheduleSend(); - } else { - sendBuffer(); - } - }; - - appender.shutdown = shutdown; - - // trigger a deprecation warning. - appender.deprecated = '@logj4s-node/smtp'; - - return appender; -} - -function configure(config, layouts) { - const subjectLayout = layouts.messagePassThroughLayout; - let layout = layouts.basicLayout; - if (config.layout) { - layout = layouts.layout(config.layout.type, config.layout); - } - return smtpAppender(config, layout, subjectLayout); -} - - -module.exports.configure = configure; diff --git a/package-lock.json b/package-lock.json index 5f529a9..cd167a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2317,306 +2317,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nodemailer": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz", - "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=", - "optional": true, - "requires": { - "libmime": "3.0.0", - "mailcomposer": "4.0.1", - "nodemailer-direct-transport": "3.3.2", - "nodemailer-shared": "1.1.0", - "nodemailer-smtp-pool": "2.8.2", - "nodemailer-smtp-transport": "2.7.2", - "socks": "1.1.9" - }, - "dependencies": { - "libmime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", - "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", - "requires": { - "iconv-lite": "0.4.15", - "libbase64": "0.1.0", - "libqp": "1.1.0" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" - }, - "libbase64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", - "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=" - }, - "libqp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", - "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=" - } - } - }, - "mailcomposer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz", - "integrity": "sha1-DhxEsqB890DuF9wUm6AJ8Zyt/rQ=", - "optional": true, - "requires": { - "buildmail": "4.0.1", - "libmime": "3.0.0" - }, - "dependencies": { - "buildmail": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz", - "integrity": "sha1-h393OLeHKYccmhBeO4N9K+EaenI=", - "optional": true, - "requires": { - "addressparser": "1.0.1", - "libbase64": "0.1.0", - "libmime": "3.0.0", - "libqp": "1.1.0", - "nodemailer-fetch": "1.6.0", - "nodemailer-shared": "1.1.0", - "punycode": "1.4.1" - }, - "dependencies": { - "addressparser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", - "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=", - "optional": true - }, - "libbase64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", - "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", - "optional": true - }, - "libqp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", - "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", - "optional": true - }, - "nodemailer-fetch": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", - "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", - "optional": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "optional": true - } - } - } - } - }, - "nodemailer-direct-transport": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz", - "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=", - "optional": true, - "requires": { - "nodemailer-shared": "1.1.0", - "smtp-connection": "2.12.0" - }, - "dependencies": { - "smtp-connection": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", - "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", - "optional": true, - "requires": { - "httpntlm": "1.6.1", - "nodemailer-shared": "1.1.0" - }, - "dependencies": { - "httpntlm": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", - "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", - "optional": true, - "requires": { - "httpreq": ">=0.4.22", - "underscore": "~1.7.0" - }, - "dependencies": { - "httpreq": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", - "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", - "optional": true - }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "optional": true - } - } - } - } - } - } - }, - "nodemailer-shared": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", - "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", - "requires": { - "nodemailer-fetch": "1.6.0" - }, - "dependencies": { - "nodemailer-fetch": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", - "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=" - } - } - }, - "nodemailer-smtp-pool": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz", - "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=", - "optional": true, - "requires": { - "nodemailer-shared": "1.1.0", - "nodemailer-wellknown": "0.1.10", - "smtp-connection": "2.12.0" - }, - "dependencies": { - "nodemailer-wellknown": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", - "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", - "optional": true - }, - "smtp-connection": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", - "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", - "optional": true, - "requires": { - "httpntlm": "1.6.1", - "nodemailer-shared": "1.1.0" - }, - "dependencies": { - "httpntlm": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", - "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", - "optional": true, - "requires": { - "httpreq": ">=0.4.22", - "underscore": "~1.7.0" - }, - "dependencies": { - "httpreq": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", - "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", - "optional": true - }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "optional": true - } - } - } - } - } - } - }, - "nodemailer-smtp-transport": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz", - "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=", - "optional": true, - "requires": { - "nodemailer-shared": "1.1.0", - "nodemailer-wellknown": "0.1.10", - "smtp-connection": "2.12.0" - }, - "dependencies": { - "nodemailer-wellknown": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", - "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", - "optional": true - }, - "smtp-connection": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", - "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", - "optional": true, - "requires": { - "httpntlm": "1.6.1", - "nodemailer-shared": "1.1.0" - }, - "dependencies": { - "httpntlm": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", - "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", - "optional": true, - "requires": { - "httpreq": ">=0.4.22", - "underscore": "~1.7.0" - }, - "dependencies": { - "httpreq": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", - "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", - "optional": true - }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "optional": true - } - } - } - } - } - } - }, - "socks": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz", - "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=", - "optional": true, - "requires": { - "ip": "^1.1.2", - "smart-buffer": "^1.0.4" - }, - "dependencies": { - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "optional": true - }, - "smart-buffer": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", - "optional": true - } - } - } - } - }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", diff --git a/package.json b/package.json index ebfdb1b..292ba5c 100644 --- a/package.json +++ b/package.json @@ -33,9 +33,8 @@ "commitmsg": "validate-commit-msg", "posttest": "npm run clean", "pretest": "eslint 'lib/**/*.js' 'test/**/*.js'", - "test": "tap 'test/tap/**/*.js'", + "test": "tap 'test/tap/**/*.js' --cov", "typings": "tsc -p types/tsconfig.json", - "coverage": "tap 'test/tap/**/*.js' --cov", "codecov": "tap 'test/tap/**/*.js' --cov --coverage-report=lcov && codecov" }, "directories": { @@ -64,7 +63,6 @@ "validate-commit-msg": "^2.14.0" }, "optionalDependencies": { - "nodemailer": "^2.5.0", "redis": "^2.7.1", "slack-node": "~0.2.0", "axios": "^0.15.3", diff --git a/test/tap/smtpAppender-test.js b/test/tap/smtpAppender-test.js deleted file mode 100644 index 4aad5df..0000000 --- a/test/tap/smtpAppender-test.js +++ /dev/null @@ -1,280 +0,0 @@ -'use strict'; - -const test = require('tap').test; -const realLayouts = require('../../lib/layouts'); -const sandbox = require('@log4js-node/sandboxed-module'); - -function setupLogging(category, options, errorOnSend) { - const msgs = []; - - const fakeMailer = { - createTransport: function (name, opts) { - return { - config: opts, - sendMail: function (msg, callback) { - if (errorOnSend) { - callback({ message: errorOnSend }); - return; - } - msgs.push(msg); - callback(null, true); - }, - close: function () { - } - }; - } - }; - - const fakeLayouts = { - layout: function (type, config) { - this.type = type; - this.config = config; - return realLayouts.messagePassThroughLayout; - }, - basicLayout: realLayouts.basicLayout, - messagePassThroughLayout: realLayouts.messagePassThroughLayout - }; - - const fakeConsole = { - log: () => {}, - errors: [], - error: function (msg, value) { - this.errors.push({ msg: msg, value: value }); - } - }; - - const log4js = sandbox.require('../../lib/log4js', { - requires: { - nodemailer: fakeMailer, - './layouts': fakeLayouts - }, - globals: { - console: fakeConsole - } - }); - - options.type = 'smtp'; - log4js.configure({ - appenders: { - smtp: options - }, - categories: { default: { appenders: ['smtp'], level: 'trace' } } - }); - - return { - logger: log4js.getLogger(category), - mailer: fakeMailer, - layouts: fakeLayouts, - console: fakeConsole, - results: msgs - }; -} - -function checkMessages(assert, result, sender, subject) { - for (let i = 0; i < result.results.length; ++i) { - assert.equal(result.results[i].from, sender); - assert.equal(result.results[i].to, 'recipient@domain.com'); - assert.equal(result.results[i].subject, subject ? subject : `Log event #${i + 1}`); // eslint-disable-line - assert.ok(new RegExp(`.+Log event #${i + 1}\n$`).test(result.results[i].text)); - } -} - -test('log4js smtpAppender', (batch) => { - batch.test('minimal config', (t) => { - const setup = setupLogging('minimal config', { - recipients: 'recipient@domain.com', - SMTP: { - port: 25, - auth: { - user: 'user@domain.com' - } - } - }); - setup.logger.info('Log event #1'); - - t.equal(setup.results.length, 1, 'should be one message only'); - checkMessages(t, setup); - t.end(); - }); - - batch.test('fancy config', (t) => { - const setup = setupLogging('fancy config', { - recipients: 'recipient@domain.com', - sender: 'sender@domain.com', - subject: 'This is subject', - SMTP: { - port: 25, - auth: { - user: 'user@domain.com' - } - } - }); - setup.logger.info('Log event #1'); - - t.equal(setup.results.length, 1, 'should be one message only'); - checkMessages(t, setup, 'sender@domain.com', 'This is subject'); - t.end(); - }); - - batch.test('config with layout', (t) => { - const setup = setupLogging('config with layout', { - layout: { - type: 'tester' - } - }); - t.equal(setup.layouts.type, 'tester', 'should configure layout'); - t.end(); - }); - - batch.test('separate email for each event', (t) => { - const setup = setupLogging('separate email for each event', { - recipients: 'recipient@domain.com', - SMTP: { - port: 25, - auth: { - user: 'user@domain.com' - } - } - }); - setTimeout(() => { - setup.logger.info('Log event #1'); - }, 0); - setTimeout(() => { - setup.logger.info('Log event #2'); - }, 500); - setTimeout(() => { - setup.logger.info('Log event #3'); - }, 1100); - setTimeout(() => { - t.equal(setup.results.length, 3, 'there should be three messages'); - checkMessages(t, setup); - t.end(); - }, 3000); - }); - - batch.test('multiple events in one email', (t) => { - const setup = setupLogging('multiple events in one email', { - recipients: 'recipient@domain.com', - sendInterval: 1, - SMTP: { - port: 25, - auth: { - user: 'user@domain.com' - } - } - }); - setTimeout(() => { - setup.logger.info('Log event #1'); - }, 0); - setTimeout(() => { - setup.logger.info('Log event #2'); - }, 100); - setTimeout(() => { - setup.logger.info('Log event #3'); - }, 1500); - setTimeout(() => { - t.equal(setup.results.length, 2, 'there should be two messages'); - t.equal(setup.results[0].to, 'recipient@domain.com'); - t.equal(setup.results[0].subject, 'Log event #1'); - t.equal( - setup.results[0].text.match(new RegExp('.+Log event #[1-2]$', 'gm')).length, - 2 - ); - t.equal(setup.results[1].to, 'recipient@domain.com'); - t.equal(setup.results[1].subject, 'Log event #3'); - t.ok(/.+Log event #3\n$/.test(setup.results[1].text)); - t.end(); - }, 3000); - }); - - batch.test('error when sending email', (t) => { - const setup = setupLogging('error when sending email', { - recipients: 'recipient@domain.com', - sendInterval: 0, - SMTP: { port: 25, auth: { user: 'user@domain.com' } } - }, 'oh noes'); - - setup.logger.info('This will break'); - - t.test('should be logged to console', (assert) => { - assert.equal(setup.console.errors.length, 1); - assert.equal(setup.console.errors[0].msg, 'log4js.smtpAppender - Error happened'); - assert.equal(setup.console.errors[0].value.message, 'oh noes'); - assert.end(); - }); - t.end(); - }); - - batch.test('transport full config', (t) => { - const setup = setupLogging('transport full config', { - recipients: 'recipient@domain.com', - transport: { - plugin: 'sendmail', - options: { - path: '/usr/sbin/sendmail' - } - } - }); - setup.logger.info('Log event #1'); - - t.equal(setup.results.length, 1, 'should be one message only'); - checkMessages(t, setup); - t.end(); - }); - - batch.test('transport no-options config', (t) => { - const setup = setupLogging('transport no-options config', { - recipients: 'recipient@domain.com', - transport: { - plugin: 'sendmail' - } - }); - setup.logger.info('Log event #1'); - - t.equal(setup.results.length, 1, 'should be one message only'); - checkMessages(t, setup); - t.end(); - }); - - batch.test('transport no-plugin config', (t) => { - const setup = setupLogging('transport no-plugin config', { - recipients: 'recipient@domain.com', - transport: {} - }); - setup.logger.info('Log event #1'); - - t.equal(setup.results.length, 1, 'should be one message only'); - checkMessages(t, setup); - t.end(); - }); - - batch.test('attachment config', (t) => { - const setup = setupLogging('attachment config', { - recipients: 'recipient@domain.com', - attachment: { - enable: true - }, - SMTP: { - port: 25, - auth: { - user: 'user@domain.com' - } - } - }); - setup.logger.info('Log event #1'); - - t.test('message should contain proper data', (assert) => { - assert.equal(setup.results.length, 1); - assert.equal(setup.results[0].attachments.length, 1); - const attachment = setup.results[0].attachments[0]; - assert.equal(setup.results[0].text, 'See logs as attachment'); - assert.equal(attachment.filename, 'default.log'); - assert.equal(attachment.contentType, 'text/x-log'); - assert.ok(new RegExp(`.+Log event #${1}\n$`).test(attachment.content)); - assert.end(); - }); - t.end(); - }); - - batch.end(); -});