├── .gitignore ├── mailer.js ├── package-lock.json ├── package.json ├── readme.md └── server.js /.gitignore: -------------------------------------------------------------------------------- 1 | #ignore node_modules 2 | node_modules -------------------------------------------------------------------------------- /mailer.js: -------------------------------------------------------------------------------- 1 | const { google } = require("googleapis"); 2 | const nodemailer = require("nodemailer"); 3 | 4 | /*POPULATE BELOW FIELDS WITH YOUR CREDETIALS*/ 5 | 6 | const CLIENT_ID = "ENTER_YOUR_CLIENT_ID"; 7 | const CLIENT_SECRET = "ENTER_YOUR_CLIENT_SECRET"; 8 | const REFRESH_TOKEN = "ENTER_YOUR_REFRESH_TOKEN"; 9 | const REDIRECT_URI = "https://developers.google.com/oauthplayground"; //DONT EDIT THIS 10 | const MY_EMAIL = "ENTER_YOUR_EMAIL_ID"; 11 | 12 | /*POPULATE ABOVE FIELDS WITH YOUR CREDETIALS*/ 13 | 14 | const oAuth2Client = new google.auth.OAuth2( 15 | CLIENT_ID, 16 | CLIENT_SECRET, 17 | REDIRECT_URI 18 | ); 19 | 20 | oAuth2Client.setCredentials({ refresh_token: REFRESH_TOKEN }); 21 | 22 | //YOU CAN PASS MORE ARGUMENTS TO THIS FUNCTION LIKE CC, TEMPLATES, ATTACHMENTS ETC. IM JUST KEEPING IT SIMPLE 23 | const sendTestEmail = async (to) => { 24 | const ACCESS_TOKEN = await oAuth2Client.getAccessToken(); 25 | const transport = nodemailer.createTransport({ 26 | service: "gmail", 27 | auth: { 28 | type: "OAuth2", 29 | user: MY_EMAIL, 30 | clientId: CLIENT_ID, 31 | clientSecret: CLIENT_SECRET, 32 | refreshToken: REFRESH_TOKEN, 33 | accessToken: ACCESS_TOKEN, 34 | }, 35 | tls: { 36 | rejectUnauthorized: true, 37 | }, 38 | }); 39 | 40 | //EMAIL OPTIONS 41 | const from = MY_EMAIL; 42 | const subject = "🌻 This Is Sent By NodeMailer 🌻"; 43 | const html = ` 44 |

Hey ${to},

45 |

🌻 This Is A Test Mail Sent By NodeMailer 🌻

46 |

Thank you

47 | `; 48 | return new Promise((resolve, reject) => { 49 | transport.sendMail({ from, subject, to, html }, (err, info) => { 50 | if (err) reject(err); 51 | resolve(info); 52 | }); 53 | }); 54 | }; 55 | 56 | module.exports = { sendTestEmail }; 57 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodemailer", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "nodemailer", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "express": "^4.18.2", 13 | "google-auth-library": "^8.9.0", 14 | "googleapis": "^120.0.0", 15 | "nodemailer": "^6.9.3" 16 | } 17 | }, 18 | "node_modules/accepts": { 19 | "version": "1.3.8", 20 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 21 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 22 | "dependencies": { 23 | "mime-types": "~2.1.34", 24 | "negotiator": "0.6.3" 25 | }, 26 | "engines": { 27 | "node": ">= 0.6" 28 | } 29 | }, 30 | "node_modules/agent-base": { 31 | "version": "6.0.2", 32 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 33 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 34 | "dependencies": { 35 | "debug": "4" 36 | }, 37 | "engines": { 38 | "node": ">= 6.0.0" 39 | } 40 | }, 41 | "node_modules/agent-base/node_modules/debug": { 42 | "version": "4.3.4", 43 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 44 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 45 | "dependencies": { 46 | "ms": "2.1.2" 47 | }, 48 | "engines": { 49 | "node": ">=6.0" 50 | }, 51 | "peerDependenciesMeta": { 52 | "supports-color": { 53 | "optional": true 54 | } 55 | } 56 | }, 57 | "node_modules/agent-base/node_modules/ms": { 58 | "version": "2.1.2", 59 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 60 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 61 | }, 62 | "node_modules/array-flatten": { 63 | "version": "1.1.1", 64 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 65 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 66 | }, 67 | "node_modules/arrify": { 68 | "version": "2.0.1", 69 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", 70 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", 71 | "engines": { 72 | "node": ">=8" 73 | } 74 | }, 75 | "node_modules/base64-js": { 76 | "version": "1.5.1", 77 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 78 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 79 | "funding": [ 80 | { 81 | "type": "github", 82 | "url": "https://github.com/sponsors/feross" 83 | }, 84 | { 85 | "type": "patreon", 86 | "url": "https://www.patreon.com/feross" 87 | }, 88 | { 89 | "type": "consulting", 90 | "url": "https://feross.org/support" 91 | } 92 | ] 93 | }, 94 | "node_modules/bignumber.js": { 95 | "version": "9.1.1", 96 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", 97 | "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", 98 | "engines": { 99 | "node": "*" 100 | } 101 | }, 102 | "node_modules/body-parser": { 103 | "version": "1.20.1", 104 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 105 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 106 | "dependencies": { 107 | "bytes": "3.1.2", 108 | "content-type": "~1.0.4", 109 | "debug": "2.6.9", 110 | "depd": "2.0.0", 111 | "destroy": "1.2.0", 112 | "http-errors": "2.0.0", 113 | "iconv-lite": "0.4.24", 114 | "on-finished": "2.4.1", 115 | "qs": "6.11.0", 116 | "raw-body": "2.5.1", 117 | "type-is": "~1.6.18", 118 | "unpipe": "1.0.0" 119 | }, 120 | "engines": { 121 | "node": ">= 0.8", 122 | "npm": "1.2.8000 || >= 1.4.16" 123 | } 124 | }, 125 | "node_modules/buffer-equal-constant-time": { 126 | "version": "1.0.1", 127 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 128 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" 129 | }, 130 | "node_modules/bytes": { 131 | "version": "3.1.2", 132 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 133 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 134 | "engines": { 135 | "node": ">= 0.8" 136 | } 137 | }, 138 | "node_modules/call-bind": { 139 | "version": "1.0.2", 140 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 141 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 142 | "dependencies": { 143 | "function-bind": "^1.1.1", 144 | "get-intrinsic": "^1.0.2" 145 | }, 146 | "funding": { 147 | "url": "https://github.com/sponsors/ljharb" 148 | } 149 | }, 150 | "node_modules/content-disposition": { 151 | "version": "0.5.4", 152 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 153 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 154 | "dependencies": { 155 | "safe-buffer": "5.2.1" 156 | }, 157 | "engines": { 158 | "node": ">= 0.6" 159 | } 160 | }, 161 | "node_modules/content-type": { 162 | "version": "1.0.5", 163 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 164 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 165 | "engines": { 166 | "node": ">= 0.6" 167 | } 168 | }, 169 | "node_modules/cookie": { 170 | "version": "0.5.0", 171 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 172 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 173 | "engines": { 174 | "node": ">= 0.6" 175 | } 176 | }, 177 | "node_modules/cookie-signature": { 178 | "version": "1.0.6", 179 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 180 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 181 | }, 182 | "node_modules/debug": { 183 | "version": "2.6.9", 184 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 185 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 186 | "dependencies": { 187 | "ms": "2.0.0" 188 | } 189 | }, 190 | "node_modules/depd": { 191 | "version": "2.0.0", 192 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 193 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 194 | "engines": { 195 | "node": ">= 0.8" 196 | } 197 | }, 198 | "node_modules/destroy": { 199 | "version": "1.2.0", 200 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 201 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 202 | "engines": { 203 | "node": ">= 0.8", 204 | "npm": "1.2.8000 || >= 1.4.16" 205 | } 206 | }, 207 | "node_modules/ecdsa-sig-formatter": { 208 | "version": "1.0.11", 209 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 210 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 211 | "dependencies": { 212 | "safe-buffer": "^5.0.1" 213 | } 214 | }, 215 | "node_modules/ee-first": { 216 | "version": "1.1.1", 217 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 218 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 219 | }, 220 | "node_modules/encodeurl": { 221 | "version": "1.0.2", 222 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 223 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 224 | "engines": { 225 | "node": ">= 0.8" 226 | } 227 | }, 228 | "node_modules/escape-html": { 229 | "version": "1.0.3", 230 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 231 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 232 | }, 233 | "node_modules/etag": { 234 | "version": "1.8.1", 235 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 236 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 237 | "engines": { 238 | "node": ">= 0.6" 239 | } 240 | }, 241 | "node_modules/express": { 242 | "version": "4.18.2", 243 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 244 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 245 | "dependencies": { 246 | "accepts": "~1.3.8", 247 | "array-flatten": "1.1.1", 248 | "body-parser": "1.20.1", 249 | "content-disposition": "0.5.4", 250 | "content-type": "~1.0.4", 251 | "cookie": "0.5.0", 252 | "cookie-signature": "1.0.6", 253 | "debug": "2.6.9", 254 | "depd": "2.0.0", 255 | "encodeurl": "~1.0.2", 256 | "escape-html": "~1.0.3", 257 | "etag": "~1.8.1", 258 | "finalhandler": "1.2.0", 259 | "fresh": "0.5.2", 260 | "http-errors": "2.0.0", 261 | "merge-descriptors": "1.0.1", 262 | "methods": "~1.1.2", 263 | "on-finished": "2.4.1", 264 | "parseurl": "~1.3.3", 265 | "path-to-regexp": "0.1.7", 266 | "proxy-addr": "~2.0.7", 267 | "qs": "6.11.0", 268 | "range-parser": "~1.2.1", 269 | "safe-buffer": "5.2.1", 270 | "send": "0.18.0", 271 | "serve-static": "1.15.0", 272 | "setprototypeof": "1.2.0", 273 | "statuses": "2.0.1", 274 | "type-is": "~1.6.18", 275 | "utils-merge": "1.0.1", 276 | "vary": "~1.1.2" 277 | }, 278 | "engines": { 279 | "node": ">= 0.10.0" 280 | } 281 | }, 282 | "node_modules/extend": { 283 | "version": "3.0.2", 284 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 285 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 286 | }, 287 | "node_modules/fast-text-encoding": { 288 | "version": "1.0.6", 289 | "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", 290 | "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" 291 | }, 292 | "node_modules/finalhandler": { 293 | "version": "1.2.0", 294 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 295 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 296 | "dependencies": { 297 | "debug": "2.6.9", 298 | "encodeurl": "~1.0.2", 299 | "escape-html": "~1.0.3", 300 | "on-finished": "2.4.1", 301 | "parseurl": "~1.3.3", 302 | "statuses": "2.0.1", 303 | "unpipe": "~1.0.0" 304 | }, 305 | "engines": { 306 | "node": ">= 0.8" 307 | } 308 | }, 309 | "node_modules/forwarded": { 310 | "version": "0.2.0", 311 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 312 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 313 | "engines": { 314 | "node": ">= 0.6" 315 | } 316 | }, 317 | "node_modules/fresh": { 318 | "version": "0.5.2", 319 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 320 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 321 | "engines": { 322 | "node": ">= 0.6" 323 | } 324 | }, 325 | "node_modules/function-bind": { 326 | "version": "1.1.1", 327 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 328 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 329 | }, 330 | "node_modules/gaxios": { 331 | "version": "5.1.3", 332 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", 333 | "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", 334 | "dependencies": { 335 | "extend": "^3.0.2", 336 | "https-proxy-agent": "^5.0.0", 337 | "is-stream": "^2.0.0", 338 | "node-fetch": "^2.6.9" 339 | }, 340 | "engines": { 341 | "node": ">=12" 342 | } 343 | }, 344 | "node_modules/gcp-metadata": { 345 | "version": "5.3.0", 346 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", 347 | "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", 348 | "dependencies": { 349 | "gaxios": "^5.0.0", 350 | "json-bigint": "^1.0.0" 351 | }, 352 | "engines": { 353 | "node": ">=12" 354 | } 355 | }, 356 | "node_modules/get-intrinsic": { 357 | "version": "1.2.1", 358 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", 359 | "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", 360 | "dependencies": { 361 | "function-bind": "^1.1.1", 362 | "has": "^1.0.3", 363 | "has-proto": "^1.0.1", 364 | "has-symbols": "^1.0.3" 365 | }, 366 | "funding": { 367 | "url": "https://github.com/sponsors/ljharb" 368 | } 369 | }, 370 | "node_modules/google-auth-library": { 371 | "version": "8.9.0", 372 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", 373 | "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", 374 | "dependencies": { 375 | "arrify": "^2.0.0", 376 | "base64-js": "^1.3.0", 377 | "ecdsa-sig-formatter": "^1.0.11", 378 | "fast-text-encoding": "^1.0.0", 379 | "gaxios": "^5.0.0", 380 | "gcp-metadata": "^5.3.0", 381 | "gtoken": "^6.1.0", 382 | "jws": "^4.0.0", 383 | "lru-cache": "^6.0.0" 384 | }, 385 | "engines": { 386 | "node": ">=12" 387 | } 388 | }, 389 | "node_modules/google-p12-pem": { 390 | "version": "4.0.1", 391 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", 392 | "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", 393 | "dependencies": { 394 | "node-forge": "^1.3.1" 395 | }, 396 | "bin": { 397 | "gp12-pem": "build/src/bin/gp12-pem.js" 398 | }, 399 | "engines": { 400 | "node": ">=12.0.0" 401 | } 402 | }, 403 | "node_modules/googleapis": { 404 | "version": "120.0.0", 405 | "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-120.0.0.tgz", 406 | "integrity": "sha512-Reo5PpERv0Df/L8Jx8CrPHMI3oEXmPBDHLXCY12biXUtveVgWVEoQN4Inn/85+eoNRsDiVyeEH/MjAa3hPHHrA==", 407 | "dependencies": { 408 | "google-auth-library": "^8.0.2", 409 | "googleapis-common": "^6.0.0" 410 | }, 411 | "engines": { 412 | "node": ">=12.0.0" 413 | } 414 | }, 415 | "node_modules/googleapis-common": { 416 | "version": "6.0.4", 417 | "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-6.0.4.tgz", 418 | "integrity": "sha512-m4ErxGE8unR1z0VajT6AYk3s6a9gIMM6EkDZfkPnES8joeOlEtFEJeF8IyZkb0tjPXkktUfYrE4b3Li1DNyOwA==", 419 | "dependencies": { 420 | "extend": "^3.0.2", 421 | "gaxios": "^5.0.1", 422 | "google-auth-library": "^8.0.2", 423 | "qs": "^6.7.0", 424 | "url-template": "^2.0.8", 425 | "uuid": "^9.0.0" 426 | }, 427 | "engines": { 428 | "node": ">=12.0.0" 429 | } 430 | }, 431 | "node_modules/gtoken": { 432 | "version": "6.1.2", 433 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", 434 | "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", 435 | "dependencies": { 436 | "gaxios": "^5.0.1", 437 | "google-p12-pem": "^4.0.0", 438 | "jws": "^4.0.0" 439 | }, 440 | "engines": { 441 | "node": ">=12.0.0" 442 | } 443 | }, 444 | "node_modules/has": { 445 | "version": "1.0.3", 446 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 447 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 448 | "dependencies": { 449 | "function-bind": "^1.1.1" 450 | }, 451 | "engines": { 452 | "node": ">= 0.4.0" 453 | } 454 | }, 455 | "node_modules/has-proto": { 456 | "version": "1.0.1", 457 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 458 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 459 | "engines": { 460 | "node": ">= 0.4" 461 | }, 462 | "funding": { 463 | "url": "https://github.com/sponsors/ljharb" 464 | } 465 | }, 466 | "node_modules/has-symbols": { 467 | "version": "1.0.3", 468 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 469 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 470 | "engines": { 471 | "node": ">= 0.4" 472 | }, 473 | "funding": { 474 | "url": "https://github.com/sponsors/ljharb" 475 | } 476 | }, 477 | "node_modules/http-errors": { 478 | "version": "2.0.0", 479 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 480 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 481 | "dependencies": { 482 | "depd": "2.0.0", 483 | "inherits": "2.0.4", 484 | "setprototypeof": "1.2.0", 485 | "statuses": "2.0.1", 486 | "toidentifier": "1.0.1" 487 | }, 488 | "engines": { 489 | "node": ">= 0.8" 490 | } 491 | }, 492 | "node_modules/https-proxy-agent": { 493 | "version": "5.0.1", 494 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 495 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 496 | "dependencies": { 497 | "agent-base": "6", 498 | "debug": "4" 499 | }, 500 | "engines": { 501 | "node": ">= 6" 502 | } 503 | }, 504 | "node_modules/https-proxy-agent/node_modules/debug": { 505 | "version": "4.3.4", 506 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 507 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 508 | "dependencies": { 509 | "ms": "2.1.2" 510 | }, 511 | "engines": { 512 | "node": ">=6.0" 513 | }, 514 | "peerDependenciesMeta": { 515 | "supports-color": { 516 | "optional": true 517 | } 518 | } 519 | }, 520 | "node_modules/https-proxy-agent/node_modules/ms": { 521 | "version": "2.1.2", 522 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 523 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 524 | }, 525 | "node_modules/iconv-lite": { 526 | "version": "0.4.24", 527 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 528 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 529 | "dependencies": { 530 | "safer-buffer": ">= 2.1.2 < 3" 531 | }, 532 | "engines": { 533 | "node": ">=0.10.0" 534 | } 535 | }, 536 | "node_modules/inherits": { 537 | "version": "2.0.4", 538 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 539 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 540 | }, 541 | "node_modules/ipaddr.js": { 542 | "version": "1.9.1", 543 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 544 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 545 | "engines": { 546 | "node": ">= 0.10" 547 | } 548 | }, 549 | "node_modules/is-stream": { 550 | "version": "2.0.1", 551 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 552 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 553 | "engines": { 554 | "node": ">=8" 555 | }, 556 | "funding": { 557 | "url": "https://github.com/sponsors/sindresorhus" 558 | } 559 | }, 560 | "node_modules/json-bigint": { 561 | "version": "1.0.0", 562 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", 563 | "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", 564 | "dependencies": { 565 | "bignumber.js": "^9.0.0" 566 | } 567 | }, 568 | "node_modules/jwa": { 569 | "version": "2.0.0", 570 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", 571 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", 572 | "dependencies": { 573 | "buffer-equal-constant-time": "1.0.1", 574 | "ecdsa-sig-formatter": "1.0.11", 575 | "safe-buffer": "^5.0.1" 576 | } 577 | }, 578 | "node_modules/jws": { 579 | "version": "4.0.0", 580 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", 581 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", 582 | "dependencies": { 583 | "jwa": "^2.0.0", 584 | "safe-buffer": "^5.0.1" 585 | } 586 | }, 587 | "node_modules/lru-cache": { 588 | "version": "6.0.0", 589 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 590 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 591 | "dependencies": { 592 | "yallist": "^4.0.0" 593 | }, 594 | "engines": { 595 | "node": ">=10" 596 | } 597 | }, 598 | "node_modules/media-typer": { 599 | "version": "0.3.0", 600 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 601 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 602 | "engines": { 603 | "node": ">= 0.6" 604 | } 605 | }, 606 | "node_modules/merge-descriptors": { 607 | "version": "1.0.1", 608 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 609 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 610 | }, 611 | "node_modules/methods": { 612 | "version": "1.1.2", 613 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 614 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 615 | "engines": { 616 | "node": ">= 0.6" 617 | } 618 | }, 619 | "node_modules/mime": { 620 | "version": "1.6.0", 621 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 622 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 623 | "bin": { 624 | "mime": "cli.js" 625 | }, 626 | "engines": { 627 | "node": ">=4" 628 | } 629 | }, 630 | "node_modules/mime-db": { 631 | "version": "1.52.0", 632 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 633 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 634 | "engines": { 635 | "node": ">= 0.6" 636 | } 637 | }, 638 | "node_modules/mime-types": { 639 | "version": "2.1.35", 640 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 641 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 642 | "dependencies": { 643 | "mime-db": "1.52.0" 644 | }, 645 | "engines": { 646 | "node": ">= 0.6" 647 | } 648 | }, 649 | "node_modules/ms": { 650 | "version": "2.0.0", 651 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 652 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 653 | }, 654 | "node_modules/negotiator": { 655 | "version": "0.6.3", 656 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 657 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 658 | "engines": { 659 | "node": ">= 0.6" 660 | } 661 | }, 662 | "node_modules/node-fetch": { 663 | "version": "2.6.12", 664 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", 665 | "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", 666 | "dependencies": { 667 | "whatwg-url": "^5.0.0" 668 | }, 669 | "engines": { 670 | "node": "4.x || >=6.0.0" 671 | }, 672 | "peerDependencies": { 673 | "encoding": "^0.1.0" 674 | }, 675 | "peerDependenciesMeta": { 676 | "encoding": { 677 | "optional": true 678 | } 679 | } 680 | }, 681 | "node_modules/node-forge": { 682 | "version": "1.3.1", 683 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", 684 | "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", 685 | "engines": { 686 | "node": ">= 6.13.0" 687 | } 688 | }, 689 | "node_modules/nodemailer": { 690 | "version": "6.9.3", 691 | "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.3.tgz", 692 | "integrity": "sha512-fy9v3NgTzBngrMFkDsKEj0r02U7jm6XfC3b52eoNV+GCrGj+s8pt5OqhiJdWKuw51zCTdiNR/IUD1z33LIIGpg==", 693 | "engines": { 694 | "node": ">=6.0.0" 695 | } 696 | }, 697 | "node_modules/object-inspect": { 698 | "version": "1.12.3", 699 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 700 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 701 | "funding": { 702 | "url": "https://github.com/sponsors/ljharb" 703 | } 704 | }, 705 | "node_modules/on-finished": { 706 | "version": "2.4.1", 707 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 708 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 709 | "dependencies": { 710 | "ee-first": "1.1.1" 711 | }, 712 | "engines": { 713 | "node": ">= 0.8" 714 | } 715 | }, 716 | "node_modules/parseurl": { 717 | "version": "1.3.3", 718 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 719 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 720 | "engines": { 721 | "node": ">= 0.8" 722 | } 723 | }, 724 | "node_modules/path-to-regexp": { 725 | "version": "0.1.7", 726 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 727 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 728 | }, 729 | "node_modules/proxy-addr": { 730 | "version": "2.0.7", 731 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 732 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 733 | "dependencies": { 734 | "forwarded": "0.2.0", 735 | "ipaddr.js": "1.9.1" 736 | }, 737 | "engines": { 738 | "node": ">= 0.10" 739 | } 740 | }, 741 | "node_modules/qs": { 742 | "version": "6.11.0", 743 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 744 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 745 | "dependencies": { 746 | "side-channel": "^1.0.4" 747 | }, 748 | "engines": { 749 | "node": ">=0.6" 750 | }, 751 | "funding": { 752 | "url": "https://github.com/sponsors/ljharb" 753 | } 754 | }, 755 | "node_modules/range-parser": { 756 | "version": "1.2.1", 757 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 758 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 759 | "engines": { 760 | "node": ">= 0.6" 761 | } 762 | }, 763 | "node_modules/raw-body": { 764 | "version": "2.5.1", 765 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 766 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 767 | "dependencies": { 768 | "bytes": "3.1.2", 769 | "http-errors": "2.0.0", 770 | "iconv-lite": "0.4.24", 771 | "unpipe": "1.0.0" 772 | }, 773 | "engines": { 774 | "node": ">= 0.8" 775 | } 776 | }, 777 | "node_modules/safe-buffer": { 778 | "version": "5.2.1", 779 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 780 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 781 | "funding": [ 782 | { 783 | "type": "github", 784 | "url": "https://github.com/sponsors/feross" 785 | }, 786 | { 787 | "type": "patreon", 788 | "url": "https://www.patreon.com/feross" 789 | }, 790 | { 791 | "type": "consulting", 792 | "url": "https://feross.org/support" 793 | } 794 | ] 795 | }, 796 | "node_modules/safer-buffer": { 797 | "version": "2.1.2", 798 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 799 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 800 | }, 801 | "node_modules/send": { 802 | "version": "0.18.0", 803 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 804 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 805 | "dependencies": { 806 | "debug": "2.6.9", 807 | "depd": "2.0.0", 808 | "destroy": "1.2.0", 809 | "encodeurl": "~1.0.2", 810 | "escape-html": "~1.0.3", 811 | "etag": "~1.8.1", 812 | "fresh": "0.5.2", 813 | "http-errors": "2.0.0", 814 | "mime": "1.6.0", 815 | "ms": "2.1.3", 816 | "on-finished": "2.4.1", 817 | "range-parser": "~1.2.1", 818 | "statuses": "2.0.1" 819 | }, 820 | "engines": { 821 | "node": ">= 0.8.0" 822 | } 823 | }, 824 | "node_modules/send/node_modules/ms": { 825 | "version": "2.1.3", 826 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 827 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 828 | }, 829 | "node_modules/serve-static": { 830 | "version": "1.15.0", 831 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 832 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 833 | "dependencies": { 834 | "encodeurl": "~1.0.2", 835 | "escape-html": "~1.0.3", 836 | "parseurl": "~1.3.3", 837 | "send": "0.18.0" 838 | }, 839 | "engines": { 840 | "node": ">= 0.8.0" 841 | } 842 | }, 843 | "node_modules/setprototypeof": { 844 | "version": "1.2.0", 845 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 846 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 847 | }, 848 | "node_modules/side-channel": { 849 | "version": "1.0.4", 850 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 851 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 852 | "dependencies": { 853 | "call-bind": "^1.0.0", 854 | "get-intrinsic": "^1.0.2", 855 | "object-inspect": "^1.9.0" 856 | }, 857 | "funding": { 858 | "url": "https://github.com/sponsors/ljharb" 859 | } 860 | }, 861 | "node_modules/statuses": { 862 | "version": "2.0.1", 863 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 864 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 865 | "engines": { 866 | "node": ">= 0.8" 867 | } 868 | }, 869 | "node_modules/toidentifier": { 870 | "version": "1.0.1", 871 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 872 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 873 | "engines": { 874 | "node": ">=0.6" 875 | } 876 | }, 877 | "node_modules/tr46": { 878 | "version": "0.0.3", 879 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 880 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 881 | }, 882 | "node_modules/type-is": { 883 | "version": "1.6.18", 884 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 885 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 886 | "dependencies": { 887 | "media-typer": "0.3.0", 888 | "mime-types": "~2.1.24" 889 | }, 890 | "engines": { 891 | "node": ">= 0.6" 892 | } 893 | }, 894 | "node_modules/unpipe": { 895 | "version": "1.0.0", 896 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 897 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 898 | "engines": { 899 | "node": ">= 0.8" 900 | } 901 | }, 902 | "node_modules/url-template": { 903 | "version": "2.0.8", 904 | "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", 905 | "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" 906 | }, 907 | "node_modules/utils-merge": { 908 | "version": "1.0.1", 909 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 910 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 911 | "engines": { 912 | "node": ">= 0.4.0" 913 | } 914 | }, 915 | "node_modules/uuid": { 916 | "version": "9.0.0", 917 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", 918 | "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", 919 | "bin": { 920 | "uuid": "dist/bin/uuid" 921 | } 922 | }, 923 | "node_modules/vary": { 924 | "version": "1.1.2", 925 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 926 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 927 | "engines": { 928 | "node": ">= 0.8" 929 | } 930 | }, 931 | "node_modules/webidl-conversions": { 932 | "version": "3.0.1", 933 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 934 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 935 | }, 936 | "node_modules/whatwg-url": { 937 | "version": "5.0.0", 938 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 939 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 940 | "dependencies": { 941 | "tr46": "~0.0.3", 942 | "webidl-conversions": "^3.0.0" 943 | } 944 | }, 945 | "node_modules/yallist": { 946 | "version": "4.0.0", 947 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 948 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 949 | } 950 | } 951 | } 952 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodemailer", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "express": "^4.18.2", 14 | "google-auth-library": "^8.9.0", 15 | "googleapis": "^120.0.0", 16 | "nodemailer": "^6.9.3" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ![Logo](https://i.ibb.co/1RGz0VH/PIM-2.jpg) 4 | 5 | # nodemailer-gmail-Oauth2 6 | 7 | Using nodemailer to send mail using gmail but with a more secured approach using Google Oauth2. 8 | 9 | 10 | ## Run Locally 11 | 12 | Clone the project 13 | 14 | ```bash 15 | git clone https://github.com/ProgrammingInBlood/nodemailer-gmail-Oauth2 16 | ``` 17 | 18 | Go to the project directory 19 | 20 | ```bash 21 | cd nodemailer-gmail-Oauth2 22 | ``` 23 | 24 | Install dependencies 25 | 26 | ```bash 27 | npm install 28 | ``` 29 | 30 | Start the server 31 | 32 | ```bash 33 | node server.js 34 | ``` 35 | 36 | ## Demo Video For How to Genrate Keys 37 | [](https://www.youtube.com/watch?v=k-6KFSnaFTU "Nodemailer | Send Email using Gmail with OAuth | Node.js") 38 | 39 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | //create express server 2 | const express = require("express"); 3 | const app = express(); 4 | const port = 3010; 5 | const { sendTestEmail } = require("./mailer"); 6 | 7 | app.get("/", (req, res) => { 8 | res.send("Run /send-email to send test email"); 9 | }); 10 | 11 | /*POPULATE SENDER_EMAIL_ID*/ 12 | const SENDER_EMAIL_ID = "EMAIL_ID"; 13 | 14 | app.get("/send-email", async (_, res) => { 15 | try { 16 | if (SENDER_EMAIL_ID === "EMAIL_ID") { 17 | throw new Error( 18 | "Please update SENDER_EMAIL_ID with your email id in server.js" 19 | ); 20 | } 21 | const info = await sendTestEmail(SENDER_EMAIL_ID); 22 | res.send(info); 23 | } catch (error) { 24 | res.send(error); 25 | } 26 | }); 27 | 28 | app.listen(port, () => { 29 | console.log(`Server listening on port ${port}`); 30 | }); 31 | --------------------------------------------------------------------------------