Added mail resend utility
Signed-off-by: James Ketrenos <james_git@ketrenos.com>
This commit is contained in:
parent
17678350fc
commit
2aeb733b2c
163
util/resend.js
Normal file
163
util/resend.js
Normal file
@ -0,0 +1,163 @@
|
||||
"use strict";
|
||||
|
||||
const config = require("config"),
|
||||
crypto = require("crypto"),
|
||||
hb = require("handlebars");
|
||||
|
||||
const basePath = "/" + config.get("basePath").replace(/^\/+/, "").replace(/\/+$/, "") + "/";
|
||||
|
||||
const req = {
|
||||
hostname: "ketrenos.com",
|
||||
protocol: "https",
|
||||
data: {
|
||||
basePath: (basePath == "//") ? "/" : basePath
|
||||
}
|
||||
};
|
||||
|
||||
const app = req.app = {
|
||||
get: function(key) {
|
||||
return req.data[key];
|
||||
},
|
||||
set: function(key, value) {
|
||||
req.data[key] = value;
|
||||
return value;
|
||||
}
|
||||
};
|
||||
|
||||
if (config.has("admin.mail") &&
|
||||
config.has("smtp.host") &&
|
||||
config.has("smtp.sender")) {
|
||||
app.set("transporter", require("nodemailer").createTransport({
|
||||
host: config.get("smtp.host"),
|
||||
pool: true,
|
||||
port: config.has("smtp.port") ? config.get("smtp.port") : 25
|
||||
}));
|
||||
} else {
|
||||
console.log("SMTP disabled. To enable SMTP, configure admin.mail, smtp.host, and smtp.sender");
|
||||
}
|
||||
|
||||
const templates = {
|
||||
"html": [
|
||||
"<p>Hello {{username}},</p>",
|
||||
"",
|
||||
"<p>Welcome to <b>ketrenos.com</b>. You are almost done creating your account. ",
|
||||
"Before you can access the system, you must verify your email address.</p>",
|
||||
"",
|
||||
"<p>To do so, simply access this link:</p>",
|
||||
"<p><a href=\"{{url}}{{secret}}\">VERIFY {{mail}} ADDRESS</a></p>",
|
||||
"",
|
||||
"<p>Sincerely,</p>",
|
||||
"<p>James</p>"
|
||||
].join("\n"),
|
||||
"text": [
|
||||
"Hello {{username}},",
|
||||
"",
|
||||
"Welcome to ketrenos.com. You are almost done creating your account. ",
|
||||
"Before you can access the system, you must verify your email address.",
|
||||
"",
|
||||
"To do so, simply access this link:",
|
||||
"",
|
||||
"{{url}}{{secret}}",
|
||||
"",
|
||||
"Sincerely,",
|
||||
"James"
|
||||
].join("\n")
|
||||
};
|
||||
|
||||
require("../server/db/users").then(function(db) {
|
||||
const userDB = db;
|
||||
let user = null;
|
||||
|
||||
return userDB.sequelize.query("SELECT * FROM users WHERE id=:id", {
|
||||
replacements: {
|
||||
id: process.argv[2]
|
||||
},
|
||||
type: userDB.Sequelize.QueryTypes.SELECT,
|
||||
raw: true
|
||||
}).then(function(results) {
|
||||
if (results.length != 1) {
|
||||
return ("User not found.");
|
||||
}
|
||||
|
||||
user = results[0];
|
||||
}).then(function() {
|
||||
return userDB.sequelize.query("DELETE FROM authentications WHERE userId=:id", {
|
||||
replacements: {
|
||||
id: user.id
|
||||
}
|
||||
});
|
||||
}).then(function() {
|
||||
return new Promise(function(resolve, reject) {
|
||||
crypto.randomBytes(16, function(error, buffer) {
|
||||
if (error) {
|
||||
return reject(error);
|
||||
}
|
||||
return resolve(buffer.toString('hex'));
|
||||
});
|
||||
});
|
||||
}).then(function(secret) {
|
||||
return userDB.sequelize.query("INSERT INTO authentications " +
|
||||
"(userId,issued,key,type) VALUES " +
|
||||
"(:userId,CURRENT_TIMESTAMP,:key,'account-setup')", {
|
||||
replacements: {
|
||||
key: secret,
|
||||
userId: user.id
|
||||
}
|
||||
}).then(function() {
|
||||
return secret;
|
||||
}).catch(function(error) {
|
||||
console.log(error);
|
||||
throw error;
|
||||
});
|
||||
}).then(function(secret) {
|
||||
const transporter = req.app.get("transporter");
|
||||
if (!transporter) {
|
||||
console.log("Not sending VERIFY email; SMTP not configured.");
|
||||
return;
|
||||
}
|
||||
|
||||
let data = {
|
||||
username: user.displayName,
|
||||
mail: user.mail,
|
||||
secret: secret,
|
||||
url: req.protocol + "://" + req.hostname + req.app.get("basePath")
|
||||
}, envelope = {
|
||||
to: data.mail,
|
||||
from: config.get("smtp.sender"),
|
||||
subject: "Request to ketrenos.com create account for '" + data.username + "'",
|
||||
cc: "",
|
||||
bcc: config.get("admin.mail"),
|
||||
text: hb.compile(templates.text)(data),
|
||||
html: hb.compile(templates.html)(data)
|
||||
};
|
||||
return new Promise(function (resolve, reject) {
|
||||
let attempts = 10;
|
||||
|
||||
function send(envelope) {
|
||||
/* Rate limit to ten per second */
|
||||
transporter.sendMail(envelope, function (error, info) {
|
||||
if (!error) {
|
||||
console.log('Message sent: ' + info.response);
|
||||
return resolve();
|
||||
}
|
||||
|
||||
if (attempts == 0) {
|
||||
console.log("Error sending email: ", error);
|
||||
return reject(error);
|
||||
}
|
||||
|
||||
attempts--;
|
||||
console.log("Unable to send mail. Trying again in 100ms (" + attempts + " attempts remain): ", error);
|
||||
setTimeout(send.bind(undefined, envelope), 100);
|
||||
});
|
||||
}
|
||||
|
||||
send(envelope);
|
||||
}).then(function() {
|
||||
process.exit(0);
|
||||
});
|
||||
}).catch(function(error) {
|
||||
console.log("Error creating account: ", error);
|
||||
});
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user