From a233894e3c25204c33a203950f91a066cf7dc822 Mon Sep 17 00:00:00 2001 From: Youssef Raafat Date: Tue, 27 Aug 2019 11:33:13 +0200 Subject: [PATCH] [SERVER] Send Reminder Emails --- server/index.js | 30 ++++++++-- server/package-lock.json | 126 +++++++++++++++++++++++++++++++++++++++ server/package.json | 4 +- 3 files changed, 155 insertions(+), 5 deletions(-) diff --git a/server/index.js b/server/index.js index 72ebcf0..72db88c 100644 --- a/server/index.js +++ b/server/index.js @@ -1,3 +1,5 @@ +require("dotenv").config(); +var nodemailer = require("nodemailer"); var admin = require("firebase-admin"); var serviceAccount = require("./serviceAccountKey.json"); @@ -13,7 +15,19 @@ parentsRef.get().then(snapshot => { snapshot.forEach(parentDoc => sendEmail(parentDoc.data())); }); +var transporter = nodemailer.createTransport({ + service: "gmail", + host: "smtp.gmail.com", + port: 465, + secure: true, + auth: { + user: process.env.EMAIL, + pass: process.env.PASS + } +}); + function sendEmail(parent) { + for (const child of parent.children) { var birthDate = child.dateOfBirth._seconds; var now = Math.floor(Date.now() / 1000); @@ -38,10 +52,18 @@ function sendEmail(parent) { var isSecondReminder = 0 <= diff2 && diff2 <= threshold; if (isFirstReminder || isSecondReminder) { // Send Email - // var doseNumber = i - // var monthFromBirth = intervals[i] - // var daysUntilVaccination = isFirstReminder ? firstReminderDays : secondReminderDays - console.log(parent.id, "=>", "Email Sent!"); + var doseNumber = i + 1; + var monthFromBirth = intervals[i]; + var daysUntilVaccination = isFirstReminder + ? firstReminderDays + : secondReminderDays; + + var info = transporter.sendMail({ + from: process.env.EMAIL, + to: parent.email, + subject: `[Vaccination] Dose no. (${doseNumber}) to ${child.name}`, + text: `${monthFromBirth} months from birth, the child should be vaccinated in ${daysUntilVaccination} days.` + }); } } } diff --git a/server/package-lock.json b/server/package-lock.json index 0107e9f..4877f88 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -205,6 +205,11 @@ "event-target-shim": "^5.0.0" } }, + "addressparser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=" + }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -239,6 +244,36 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "optional": true }, + "buildmail": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-3.10.0.tgz", + "integrity": "sha1-xoJtcW55RbtvaxQ0tTmF4CmgMVk=", + "requires": { + "addressparser": "1.0.1", + "libbase64": "0.1.0", + "libmime": "2.1.0", + "libqp": "1.1.0", + "nodemailer-fetch": "1.6.0", + "nodemailer-shared": "1.1.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=" + }, + "libmime": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.0.tgz", + "integrity": "sha1-Ubx23iKDFh65BRxLyArtcT5P0c0=", + "requires": { + "iconv-lite": "0.4.13", + "libbase64": "0.1.0", + "libqp": "1.1.0" + } + } + } + }, "bun": { "version": "0.0.12", "resolved": "https://registry.npmjs.org/bun/-/bun-0.0.12.tgz", @@ -344,6 +379,14 @@ "streamsearch": "0.1.2" } }, + "dkim-signer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dkim-signer/-/dkim-signer-0.2.2.tgz", + "integrity": "sha1-qoHsBx7u02IngbqpIgRNeADl8wg=", + "requires": { + "libmime": "^2.0.3" + } + }, "dot-prop": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.1.0.tgz", @@ -353,6 +396,11 @@ "is-obj": "^2.0.0" } }, + "dotenv": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz", + "integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA==" + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -673,6 +721,11 @@ "debug": "^3.1.0" } }, + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -751,6 +804,26 @@ "safe-buffer": "^5.0.1" } }, + "libbase64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", + "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=" + }, + "libmime": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.3.tgz", + "integrity": "sha1-JQF8pataHpiq2+JyUBfPHUikKgw=", + "requires": { + "iconv-lite": "0.4.15", + "libbase64": "0.1.0", + "libqp": "1.1.0" + } + }, + "libqp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", + "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=" + }, "lodash.at": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz", @@ -817,6 +890,32 @@ "yallist": "^3.0.2" } }, + "mailcomposer": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-3.12.0.tgz", + "integrity": "sha1-nF4RiKqOHGLsi4a9Q0aBArY56Pk=", + "requires": { + "buildmail": "3.10.0", + "libmime": "2.1.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=" + }, + "libmime": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.0.tgz", + "integrity": "sha1-Ubx23iKDFh65BRxLyArtcT5P0c0=", + "requires": { + "iconv-lite": "0.4.13", + "libbase64": "0.1.0", + "libqp": "1.1.0" + } + } + } + }, "make-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", @@ -866,6 +965,24 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.4.tgz", "integrity": "sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA==" }, + "nodemailer": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.3.0.tgz", + "integrity": "sha512-TEHBNBPHv7Ie/0o3HXnb7xrPSSQmH1dXwQKRaMKDBGt/ZN54lvDVujP6hKkO/vjkIYL9rK8kHSG11+G42Nhxuw==" + }, + "nodemailer-fetch": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", + "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=" + }, + "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" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1023,6 +1140,15 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, + "sendmail": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sendmail/-/sendmail-1.6.1.tgz", + "integrity": "sha512-lIhvnjSi5e5jL8wA1GPP6j2QVlx6JOEfmdn0QIfmuJdmXYGmJ375kcOU0NSm/34J+nypm4sa1AXrYE5w3uNIIA==", + "requires": { + "dkim-signer": "0.2.2", + "mailcomposer": "3.12.0" + } + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", diff --git a/server/package.json b/server/package.json index 6355b1a..82197c4 100644 --- a/server/package.json +++ b/server/package.json @@ -20,6 +20,8 @@ }, "homepage": "https://github.com/MichelineMedhat/UAH2019#readme", "dependencies": { - "firebase-admin": "^8.4.0" + "dotenv": "^8.1.0", + "firebase-admin": "^8.4.0", + "nodemailer": "^6.3.0" } }