Start sending verification emails
Finally!
This commit is contained in:
parent
a381077b83
commit
fb76433250
3 changed files with 111 additions and 6 deletions
|
@ -30,6 +30,7 @@
|
||||||
"dotenv": "^10.0.0",
|
"dotenv": "^10.0.0",
|
||||||
"express": "^4.17.2",
|
"express": "^4.17.2",
|
||||||
"knex": "^0.95.15",
|
"knex": "^0.95.15",
|
||||||
|
"nodemailer": "^6.7.2",
|
||||||
"sqlite3": "^5.0.2",
|
"sqlite3": "^5.0.2",
|
||||||
"twing": "^5.1.0"
|
"twing": "^5.1.0"
|
||||||
}
|
}
|
||||||
|
|
111
server/index.js
111
server/index.js
|
@ -1,4 +1,5 @@
|
||||||
const express = require('express')
|
const express = require('express')
|
||||||
|
const nodemailer = require('nodemailer')
|
||||||
const bodyParser = require('body-parser')
|
const bodyParser = require('body-parser')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const { URLSafeTimedSerializer } = require("@constemi/itsdangerjs")
|
const { URLSafeTimedSerializer } = require("@constemi/itsdangerjs")
|
||||||
|
@ -30,6 +31,53 @@ if (process.env.CROWDFUNDING_SITE_SECRET_KEY) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set up nodemailer (if configured)
|
||||||
|
let mailer
|
||||||
|
let emailFrom
|
||||||
|
if (
|
||||||
|
!!process.env.CROWDFUNDING_SITE_EMAIL_HOST &&
|
||||||
|
!!process.env.CROWDFUNDING_SITE_EMAIL_USER &&
|
||||||
|
!!process.env.CROWDFUNDING_SITE_EMAIL_PASSWORD
|
||||||
|
) {
|
||||||
|
mailer = nodemailer.createTransport({
|
||||||
|
host: process.env.CROWDFUNDING_SITE_EMAIL_HOST,
|
||||||
|
port: process.env.CROWDFUNDING_SITE_EMAIL_PORT || 587,
|
||||||
|
secure: process.env.CROWDFUNDING_SITE_EMAIL_SECURE == 'false' ? false : true,
|
||||||
|
auth: {
|
||||||
|
user: process.env.CROWDFUNDING_SITE_EMAIL_USER,
|
||||||
|
pass: process.env.CROWDFUNDING_SITE_EMAIL_PASSWORD,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!!process.env.CROWDFUNDING_SITE_EMAIL_FROM) {
|
||||||
|
emailFrom = process.env.CROWDFUNDING_SITE_EMAIL_FROM
|
||||||
|
} else {
|
||||||
|
emailFrom = process.env.CROWDFUNDING_SITE_EMAIL_USER
|
||||||
|
console.warn(`No "From" address set! Using ${emailFrom} as a default.`)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log("Email has not been configured! Some features won't work properly until this is set up :/")
|
||||||
|
}
|
||||||
|
|
||||||
|
async function sendMail(message) {
|
||||||
|
if (DEBUG || !mailer) {
|
||||||
|
console.log(`\n\n-------------------------- BEGIN EMAIL --------------------------\n`)
|
||||||
|
console.log(`From: ${message.from}\nTo:${message.to}\nSubject:${message.subject||'(no subject)'}\n\n${message.text}`)
|
||||||
|
console.log(`\n--------------------------- END EMAIL ---------------------------`)
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
let receipt = await mailer.sendMail({
|
||||||
|
from: message.from || emailFrom,
|
||||||
|
to: message.to,
|
||||||
|
subject: message.subject,
|
||||||
|
text: message.text,
|
||||||
|
html: message.html,
|
||||||
|
})
|
||||||
|
|
||||||
|
return receipt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// get goal details
|
// get goal details
|
||||||
const goalPeople = Number(process.env.CROWDFUNDING_SITE_GOAL_PEOPLE) || 750
|
const goalPeople = Number(process.env.CROWDFUNDING_SITE_GOAL_PEOPLE) || 750
|
||||||
const goalRupees = Number(process.env.CROWDFUNDING_SITE_GOAL_RUPEES) || 500000
|
const goalRupees = Number(process.env.CROWDFUNDING_SITE_GOAL_RUPEES) || 500000
|
||||||
|
@ -234,14 +282,14 @@ router.post('/pledge', async (req, res) => {
|
||||||
existingPledge = await (Pledge
|
existingPledge = await (Pledge
|
||||||
.query({
|
.query({
|
||||||
where: {
|
where: {
|
||||||
'email': req.query.email,
|
'email': pledge.get('email'),
|
||||||
'amount': amount,
|
'amount': pledge.get('amount'),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.orderBy('created_at', 'DESC')
|
.orderBy('created_at', 'DESC')
|
||||||
.fetch())
|
.fetch())
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
if (e.name == 'EmptyResponse' && DEBUG) {
|
if (e.message == 'EmptyResponse' && DEBUG) {
|
||||||
console.debug('No existing pledge')
|
console.debug('No existing pledge')
|
||||||
} else {
|
} else {
|
||||||
console.warn(`Weird error happened: ${e}`)
|
console.warn(`Weird error happened: ${e}`)
|
||||||
|
@ -252,9 +300,27 @@ router.post('/pledge', async (req, res) => {
|
||||||
let serialiser = URLSafeTimedSerializer(secretKey, pledge.get('email'))
|
let serialiser = URLSafeTimedSerializer(secretKey, pledge.get('email'))
|
||||||
let verificationLink = `${req.protocol}://${req.hostname}/verify?email=${encodeURIComponent(pledge.get('email'))}&key=${encodeURIComponent(serialiser.dumps(pledge.get('amount')))}`
|
let verificationLink = `${req.protocol}://${req.hostname}/verify?email=${encodeURIComponent(pledge.get('email'))}&key=${encodeURIComponent(serialiser.dumps(pledge.get('amount')))}`
|
||||||
|
|
||||||
// TODO: send out the email, along with existing pledge deets
|
// send out the email, along with existing pledge deets
|
||||||
console.debug(`Verification link generated: ${verificationLink}`)
|
console.debug(`Verification link generated: ${verificationLink}`)
|
||||||
|
|
||||||
|
let text = `Hi ${pledge.get('name')},
|
||||||
|
Thank you so much for your pledge of ₹${Number(pledge.get('amount')).toLocaleString('en-IN')} to Snipette!
|
||||||
|
To finish the pledge, please verify your email by clicking the link below:
|
||||||
|
|
||||||
|
${verificationLink}
|
||||||
|
|
||||||
|
If you have any questions, don't hesitate to reach out: you can drop a line
|
||||||
|
anytime to editors@snipettemag.com.
|
||||||
|
|
||||||
|
Thanks,
|
||||||
|
The Snipette Team`
|
||||||
|
|
||||||
|
let receipt = await sendMail({
|
||||||
|
to: req.body.email,
|
||||||
|
subject: `Finish ${existingPledge ? 'updating' : 'saving'} your pledge to Snipette`,
|
||||||
|
text: text,
|
||||||
|
})
|
||||||
|
|
||||||
res.send("Thank you! We're still working on setting up this website, so as you can see this page doesn't look great at the moment, but we will be sending you a confirmation email in a few days. Watch out for an email from editors@snipettemag.com, and if it doesn't reach, check your spam box :P")
|
res.send("Thank you! We're still working on setting up this website, so as you can see this page doesn't look great at the moment, but we will be sending you a confirmation email in a few days. Watch out for an email from editors@snipettemag.com, and if it doesn't reach, check your spam box :P")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -331,8 +397,41 @@ router.get('/verify', async (req, res) => {
|
||||||
// save the new pledge
|
// save the new pledge
|
||||||
await newPledge.save()
|
await newPledge.save()
|
||||||
|
|
||||||
// dummy message
|
// send the confirmation email
|
||||||
res.send('all done (not)')
|
let text = `Hi ${pledge.get('name')},
|
||||||
|
Your pledge of ₹${Number(pledge.get('amount')).toLocaleString('en-IN')} to Snipette Analog has been saved!
|
||||||
|
|
||||||
|
Thank you so much for your support. Once we hit our goals, we will contact
|
||||||
|
you to make the final payment. Meanwhile, here are the details of your
|
||||||
|
pledge for reference:
|
||||||
|
|
||||||
|
Name: ${pledge.get('name')}
|
||||||
|
Pledge amount: ${Number(pledge.get('amount')).toLocaleString('en-IN')}${pledge.overseas ? ' (plus $25 for shipping)' : ''}
|
||||||
|
Email: ${pledge.get('email')}
|
||||||
|
Phone: ${pledge.get('phone') || 'not provided'}
|
||||||
|
|
||||||
|
Extra message:
|
||||||
|
${pledge.get('other_message') || '[no message sent]'}
|
||||||
|
|
||||||
|
We will attempt to contact you ${pledge.get('retry_times') <= 1 ? 'only once' : String(pledge.get('retry_times')) + ' times'} before giving up.
|
||||||
|
|
||||||
|
You can update your pledge by going to the crowdfunding homepage and saving
|
||||||
|
a pledge with the same email address as you used before.
|
||||||
|
|
||||||
|
If you have any questions, don't hesitate to reach out: you can drop a line
|
||||||
|
anytime to editors@snipettemag.com.
|
||||||
|
|
||||||
|
Thanks,
|
||||||
|
The Snipette Team`
|
||||||
|
|
||||||
|
let receipt = await sendMail({
|
||||||
|
to: pledge.get('email'),
|
||||||
|
subject: `Your pledge has been saved!`,
|
||||||
|
text: text,
|
||||||
|
})
|
||||||
|
|
||||||
|
// Send confirmation message
|
||||||
|
res.send('Thank you! Your pledge has been saved. Watch out for the confirmation email in your inbox :)')
|
||||||
})
|
})
|
||||||
|
|
||||||
router.use(express.static('dist'))
|
router.use(express.static('dist'))
|
||||||
|
|
|
@ -3958,6 +3958,11 @@ node-releases@^2.0.1:
|
||||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5"
|
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5"
|
||||||
integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==
|
integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==
|
||||||
|
|
||||||
|
nodemailer@^6.7.2:
|
||||||
|
version "6.7.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.7.2.tgz#44b2ad5f7ed71b7067f7a21c4fedabaec62b85e0"
|
||||||
|
integrity sha512-Dz7zVwlef4k5R71fdmxwR8Q39fiboGbu3xgswkzGwczUfjp873rVxt1O46+Fh0j1ORnAC6L9+heI8uUpO6DT7Q==
|
||||||
|
|
||||||
nodemon@^2.0.15:
|
nodemon@^2.0.15:
|
||||||
version "2.0.15"
|
version "2.0.15"
|
||||||
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e"
|
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e"
|
||||||
|
|
Loading…
Reference in a new issue