├── .DS_Store ├── .gitignore ├── app.js ├── package-lock.json └── package.json /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trulymittal/gmail-api/47531b6738daab6cb0894040d37526a154c54101/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const nodemailer = require('nodemailer'); 2 | const { google } = require('googleapis'); 3 | 4 | // These id's and secrets should come from .env file. 5 | const CLIENT_ID = 'YOUR CLIENT ID'; 6 | const CLEINT_SECRET = 'YOUR CLIENT SECRET'; 7 | const REDIRECT_URI = 'https://developers.google.com/oauthplayground'; 8 | const REFRESH_TOKEN = 'YOUR REFRESH TOKEN'; 9 | 10 | const oAuth2Client = new google.auth.OAuth2( 11 | CLIENT_ID, 12 | CLEINT_SECRET, 13 | REDIRECT_URI 14 | ); 15 | oAuth2Client.setCredentials({ refresh_token: REFRESH_TOKEN }); 16 | 17 | async function sendMail() { 18 | try { 19 | const accessToken = await oAuth2Client.getAccessToken(); 20 | 21 | const transport = nodemailer.createTransport({ 22 | service: 'gmail', 23 | auth: { 24 | type: 'OAuth2', 25 | user: 'yours authorised email address', 26 | clientId: CLIENT_ID, 27 | clientSecret: CLEINT_SECRET, 28 | refreshToken: REFRESH_TOKEN, 29 | accessToken: accessToken, 30 | }, 31 | }); 32 | 33 | const mailOptions = { 34 | from: 'SENDER NAME ', 35 | to: 'to email address here', 36 | subject: 'Hello from gmail using API', 37 | text: 'Hello from gmail email using API', 38 | html: '

Hello from gmail email using API

', 39 | }; 40 | 41 | const result = await transport.sendMail(mailOptions); 42 | return result; 43 | } catch (error) { 44 | return error; 45 | } 46 | } 47 | 48 | sendMail() 49 | .then((result) => console.log('Email sent...', result)) 50 | .catch((error) => console.log(error.message)); 51 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gmail-api", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abort-controller": { 8 | "version": "3.0.0", 9 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 10 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 11 | "requires": { 12 | "event-target-shim": "^5.0.0" 13 | } 14 | }, 15 | "agent-base": { 16 | "version": "6.0.2", 17 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 18 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 19 | "requires": { 20 | "debug": "4" 21 | } 22 | }, 23 | "arrify": { 24 | "version": "2.0.1", 25 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", 26 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" 27 | }, 28 | "base64-js": { 29 | "version": "1.3.1", 30 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 31 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" 32 | }, 33 | "bignumber.js": { 34 | "version": "9.0.1", 35 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", 36 | "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" 37 | }, 38 | "buffer-equal-constant-time": { 39 | "version": "1.0.1", 40 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 41 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 42 | }, 43 | "debug": { 44 | "version": "4.2.0", 45 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", 46 | "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", 47 | "requires": { 48 | "ms": "2.1.2" 49 | } 50 | }, 51 | "ecdsa-sig-formatter": { 52 | "version": "1.0.11", 53 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 54 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 55 | "requires": { 56 | "safe-buffer": "^5.0.1" 57 | } 58 | }, 59 | "event-target-shim": { 60 | "version": "5.0.1", 61 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 62 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 63 | }, 64 | "extend": { 65 | "version": "3.0.2", 66 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 67 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 68 | }, 69 | "fast-text-encoding": { 70 | "version": "1.0.3", 71 | "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", 72 | "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" 73 | }, 74 | "gaxios": { 75 | "version": "4.0.1", 76 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.0.1.tgz", 77 | "integrity": "sha512-jOin8xRZ/UytQeBpSXFqIzqU7Fi5TqgPNLlUsSB8kjJ76+FiGBfImF8KJu++c6J4jOldfJUtt0YmkRj2ZpSHTQ==", 78 | "requires": { 79 | "abort-controller": "^3.0.0", 80 | "extend": "^3.0.2", 81 | "https-proxy-agent": "^5.0.0", 82 | "is-stream": "^2.0.0", 83 | "node-fetch": "^2.3.0" 84 | } 85 | }, 86 | "gcp-metadata": { 87 | "version": "4.2.1", 88 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.2.1.tgz", 89 | "integrity": "sha512-tSk+REe5iq/N+K+SK1XjZJUrFPuDqGZVzCy2vocIHIGmPlTGsa8owXMJwGkrXr73NO0AzhPW4MF2DEHz7P2AVw==", 90 | "requires": { 91 | "gaxios": "^4.0.0", 92 | "json-bigint": "^1.0.0" 93 | } 94 | }, 95 | "google-auth-library": { 96 | "version": "6.1.3", 97 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.3.tgz", 98 | "integrity": "sha512-m9mwvY3GWbr7ZYEbl61isWmk+fvTmOt0YNUfPOUY2VH8K5pZlAIWJjxEi0PqR3OjMretyiQLI6GURMrPSwHQ2g==", 99 | "requires": { 100 | "arrify": "^2.0.0", 101 | "base64-js": "^1.3.0", 102 | "ecdsa-sig-formatter": "^1.0.11", 103 | "fast-text-encoding": "^1.0.0", 104 | "gaxios": "^4.0.0", 105 | "gcp-metadata": "^4.2.0", 106 | "gtoken": "^5.0.4", 107 | "jws": "^4.0.0", 108 | "lru-cache": "^6.0.0" 109 | } 110 | }, 111 | "google-p12-pem": { 112 | "version": "3.0.3", 113 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz", 114 | "integrity": "sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA==", 115 | "requires": { 116 | "node-forge": "^0.10.0" 117 | } 118 | }, 119 | "googleapis": { 120 | "version": "63.0.0", 121 | "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-63.0.0.tgz", 122 | "integrity": "sha512-wixBalZFz9qLFJqKcEaKRAKuWAf20qw35/vVN/0ogfhIMlGuDUNE3groAPdaqAmaE3sTLSEe8+XRNIx3lxOhcQ==", 123 | "requires": { 124 | "google-auth-library": "^6.0.0", 125 | "googleapis-common": "^4.4.1" 126 | } 127 | }, 128 | "googleapis-common": { 129 | "version": "4.4.3", 130 | "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-4.4.3.tgz", 131 | "integrity": "sha512-W46WKCk3QtlCCfmZyQIH5zxmDOyeV5Qj+qs7nr2ox08eRkEJMWp6iwv542R/PsokXaGUSrmif4vCC4+rGzRSsQ==", 132 | "requires": { 133 | "extend": "^3.0.2", 134 | "gaxios": "^4.0.0", 135 | "google-auth-library": "^6.0.0", 136 | "qs": "^6.7.0", 137 | "url-template": "^2.0.8", 138 | "uuid": "^8.0.0" 139 | } 140 | }, 141 | "gtoken": { 142 | "version": "5.0.5", 143 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.5.tgz", 144 | "integrity": "sha512-wvjkecutFh8kVfbcdBdUWqDRrXb+WrgD79DBDEYf1Om8S1FluhylhtFjrL7Tx69vNhh259qA3Q1P4sPtb+kUYw==", 145 | "requires": { 146 | "gaxios": "^4.0.0", 147 | "google-p12-pem": "^3.0.3", 148 | "jws": "^4.0.0", 149 | "mime": "^2.2.0" 150 | } 151 | }, 152 | "https-proxy-agent": { 153 | "version": "5.0.0", 154 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 155 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 156 | "requires": { 157 | "agent-base": "6", 158 | "debug": "4" 159 | } 160 | }, 161 | "is-stream": { 162 | "version": "2.0.0", 163 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 164 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" 165 | }, 166 | "json-bigint": { 167 | "version": "1.0.0", 168 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", 169 | "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", 170 | "requires": { 171 | "bignumber.js": "^9.0.0" 172 | } 173 | }, 174 | "jwa": { 175 | "version": "2.0.0", 176 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", 177 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", 178 | "requires": { 179 | "buffer-equal-constant-time": "1.0.1", 180 | "ecdsa-sig-formatter": "1.0.11", 181 | "safe-buffer": "^5.0.1" 182 | } 183 | }, 184 | "jws": { 185 | "version": "4.0.0", 186 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", 187 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", 188 | "requires": { 189 | "jwa": "^2.0.0", 190 | "safe-buffer": "^5.0.1" 191 | } 192 | }, 193 | "lru-cache": { 194 | "version": "6.0.0", 195 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 196 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 197 | "requires": { 198 | "yallist": "^4.0.0" 199 | } 200 | }, 201 | "mime": { 202 | "version": "2.4.6", 203 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", 204 | "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" 205 | }, 206 | "ms": { 207 | "version": "2.1.2", 208 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 209 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 210 | }, 211 | "node-fetch": { 212 | "version": "2.6.1", 213 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 214 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 215 | }, 216 | "node-forge": { 217 | "version": "0.10.0", 218 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", 219 | "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" 220 | }, 221 | "nodemailer": { 222 | "version": "6.4.14", 223 | "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.14.tgz", 224 | "integrity": "sha512-0AQHOOT+nRAOK6QnksNaK7+5vjviVvEBzmZytKU7XSA+Vze2NLykTx/05ti1uJgXFTWrMq08u3j3x4r4OE6PAA==" 225 | }, 226 | "qs": { 227 | "version": "6.9.4", 228 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", 229 | "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" 230 | }, 231 | "safe-buffer": { 232 | "version": "5.2.1", 233 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 234 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 235 | }, 236 | "url-template": { 237 | "version": "2.0.8", 238 | "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", 239 | "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=" 240 | }, 241 | "uuid": { 242 | "version": "8.3.1", 243 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", 244 | "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" 245 | }, 246 | "yallist": { 247 | "version": "4.0.0", 248 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 249 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 250 | } 251 | } 252 | } 253 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gmail-api", 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 | "googleapis": "^63.0.0", 14 | "nodemailer": "^6.4.14" 15 | } 16 | } 17 | --------------------------------------------------------------------------------