Merge pull request #161 from mozilla/write-to-disk

feat(mailer): Add the `write-to-disk.js` script.

r=@philbooth
This commit is contained in:
Shane Tomlinson 2016-05-25 10:26:37 +01:00
Родитель 9178b37da9 4a30c795d2
Коммит 3054217c1f
5 изменённых файлов: 142 добавлений и 2 удалений

1
.gitignore поставляемый
Просмотреть файл

@ -1,3 +1,4 @@
node_modules
server.pot
*.log
.mail_output

Просмотреть файл

@ -79,7 +79,7 @@ module.exports = function (grunt) {
* Gruntfile causes an error and should contain no strings
* bin/server.js extracts "/", so it is excluded.
*/
exclude: /(node_modules|test|Gruntfile|bin)/,
exclude: /(node_modules|test|Gruntfile|bin|scripts)/,
'output-dir': __dirname,
'output': 'server.pot',
'join-existing': true,

Просмотреть файл

@ -42,6 +42,7 @@
"husky": "0.10.2",
"jsxgettext-recursive": "0.0.5",
"load-grunt-tasks": "3.3.0",
"mkdirp": "0.5.1",
"proxyquire": "1.7.4",
"simplesmtp": "0.3.32",
"sinon": "1.17.3",

138
scripts/write-to-disk.js Normal file
Просмотреть файл

@ -0,0 +1,138 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/**
* Write emails to disk. Output is written to ./.mail_output/<email type>.html
*
* Usage:
* node ./scripts/write-to-disk.js <email type>
*
* Where <email type> is one of:
* all
* newDeviceLoginEmail
* passwordChangedEmail
* passwordResetEmail
* passwordResetRequiredEmail
* postVerifyEmail
* recoveryEmail
* suspiciousLocationEmail
* unlockEmail
* verificationReminderEmail:first
* verificationReminderEmail:second
* verifyEmail
* verifyLoginEmail
*
* Emails that are written to disk can be previewed in Firefox
* to give a rough idea of how they would render in real life.
*/
var P = require('bluebird')
var config = require('../config')
var createMailer = require('../index')
var fs = require('fs')
var log = require('../log')('server')
var mkdirp = require('mkdirp')
var path = require('path')
var OUTPUT_DIRECTORY = path.join(__dirname, '..', '.mail_output')
var messageToSend = process.argv[2] || ''
var mailSender = {
sendMail: function (emailConfig, done) {
var htmlOutputPath = getEmailOutputPath(emailConfig.subject, 'html')
fs.writeFileSync(htmlOutputPath, emailConfig.html)
var textOutputPath = getEmailOutputPath(emailConfig.subject, 'txt')
fs.writeFileSync(textOutputPath, emailConfig.text)
done(null)
},
close: function () {}
}
createMailer(log, config.getProperties(), mailSender)
.then((mailer) => {
checkMessageType(mailer, messageToSend)
ensureTargetDirectoryExists()
return sendMails(mailer, getMessageTypesToWrite(mailer, messageToSend))
})
.then(() => {
console.info('done') //eslint-disable-line no-console
})
function getEmailOutputPath(subject, extension) {
var outputFilename = subject.replace(/\s+/g, '_') + '.' + extension
return path.join(OUTPUT_DIRECTORY, outputFilename)
}
function sendMails(mailer, messagesToSend) {
return P.all(messagesToSend.map(sendMail.bind(null, mailer)))
}
function sendMail(mailer, messageToSend) {
var parts = messageToSend.split(':')
var messageType = parts[0]
var messageSubType = parts[1]
var message = {
acceptLanguage: 'en',
code: 'ae35999f861ffc81d594034eb4560af8',
email: 'testuser@testuser.com',
locations: [],
redirectTo: 'https://redirect.com/',
resume: 'eyJjYW1wYWlnbiI6bnVsbCwiZW50cnlwb2ludCI6bnVsbCwiZmxvd0lkIjoiM2Q1ODZiNzY4Mzc2NGJhOWFiNzhkMzMxMTdjZDU4Y2RmYjk3Mzk5MWU5NTk0NjgxODBlMDUyMmY2MThhNmEyMSIsInJlc2V0UGFzc3dvcmRDb25maXJtIjp0cnVlLCJ1bmlxdWVVc2VySWQiOiI1ODNkOGFlYS00NzU3LTRiZTQtYWJlNC0wZWQ2NWZhY2Y2YWQiLCJ1dG1DYW1wYWlnbiI6bnVsbCwidXRtQ29udGVudCI6bnVsbCwidXRtTWVkaXVtIjpudWxsLCJ1dG1Tb3VyY2UiOm51bGwsInV0bVRlcm0iOm51bGx9',
service: 'sync',
token: '47b22cd271963448cf36da95cccfcfb342b5693d66f58aa635f9a95579431002',
type: messageSubType,
uaBrowser: 'Firefox',
uaBrowserVersion: '47',
uaOS: 'Mac OSX',
uaOSVersion: '10.11',
uid: '6510cb04abd742c6b3e4abefc7e39c9f'
}
return mailer[messageType](message)
}
function checkMessageType(mailer, messageToSend) {
var messageTypes = getMailerMessageTypes(mailer)
messageTypes.push('all')
if (messageTypes.indexOf(messageToSend) === -1) {
console.error('invalid message name: `' + messageToSend + '`\n' + //eslint-disable-line no-console
'choose from: ' + messageTypes.join(', '))
process.exit(1)
}
}
function getMailerMessageTypes(mailer) {
var messageTypes = []
for (var key in mailer) {
if (typeof mailer[key] === 'function' && ! /^_/.test(key) && /Email$/.test(key)) {
messageTypes.push(key)
}
}
return messageTypes.sort()
}
function getMessageTypesToWrite(mailer, messageToSend) {
if (messageToSend === 'all') {
return getMailerMessageTypes(mailer)
} else {
return [messageToSend]
}
}
function ensureTargetDirectoryExists() {
mkdirp.sync(OUTPUT_DIRECTORY)
}

Просмотреть файл

@ -10,7 +10,7 @@ module.exports = function (grunt) {
eslintrc: '.eslintrc'
},
app: [
'*.js', 'bin/*.js', 'tasks/*.js', 'templates/*.js', 'test/**/*.js'
'*.js', 'bin/*.js', 'tasks/*.js', 'templates/*.js', 'test/**/*.js', 'scripts/**/*.js'
]
})
}