{"id":48883189,"url":"https://github.com/weaponsforge/send-email","last_synced_at":"2026-04-16T04:03:45.552Z","repository":{"id":283928622,"uuid":"953280220","full_name":"weaponsforge/send-email","owner":"weaponsforge","description":"NPM CLI and library for sending text and HTML emails using Gmail SMTP with Google OAuth2","archived":false,"fork":false,"pushed_at":"2026-04-16T02:39:57.000Z","size":828,"stargazers_count":1,"open_issues_count":8,"forks_count":0,"subscribers_count":1,"default_branch":"dev","last_synced_at":"2026-04-16T03:27:25.433Z","etag":null,"topics":["cli","email","gmail-oauth2","hacktoberfest","nodejs","nodejs-cli","oauth2","send-email"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/@weaponsforge/sendemail","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/weaponsforge.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-23T01:23:14.000Z","updated_at":"2026-04-16T02:25:53.000Z","dependencies_parsed_at":"2025-03-23T05:23:21.007Z","dependency_job_id":"1181a263-3007-436e-90d5-d815bca2f71a","html_url":"https://github.com/weaponsforge/send-email","commit_stats":null,"previous_names":["weaponsforge/send-email"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/weaponsforge/send-email","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weaponsforge%2Fsend-email","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weaponsforge%2Fsend-email/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weaponsforge%2Fsend-email/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weaponsforge%2Fsend-email/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/weaponsforge","download_url":"https://codeload.github.com/weaponsforge/send-email/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weaponsforge%2Fsend-email/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31870517,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T15:24:51.572Z","status":"online","status_checked_at":"2026-04-16T02:00:06.042Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","email","gmail-oauth2","hacktoberfest","nodejs","nodejs-cli","oauth2","send-email"],"created_at":"2026-04-16T04:03:16.462Z","updated_at":"2026-04-16T04:03:45.522Z","avatar_url":"https://github.com/weaponsforge.png","language":"TypeScript","readme":"## @weaponsforge/sendemail\n\nNPM library and CLI for sending text and HTML emails using Gmail SMTP with Google OAuth2.\n\n\u003e [!TIP]\n\u003e - **Run via npx (no installation required)**\n\u003e   - Requirements: NodeJS LTS v24.11.0 or later\n\u003e   - Run `npx @weaponsforge/sendemail --help`\n\u003e\n\u003e - **Node.js package**\u003cbr\u003e\n\u003e    A Node.js package is available at https://www.npmjs.com/package/@weaponsforge/sendemail\n\u003e\n\u003e - **Pre-compiled Windows binaries**\u003cbr\u003e\n\u003e    Pre-compiled [Windows binaries](#️-building-the-windows-executable-file) are available for download in the latest [Releases](https://github.com/weaponsforge/send-email/releases) download page.\n\u003e\n\u003e - **Docker image**\u003cbr\u003e\n\u003e   A Docker image is available at https://hub.docker.com/r/weaponsforge/sendemail\n\n### Table of Contents\n\n- [Requirements](#-requirements)\n- [Quickstart](#-quickstart)\n- [Installation](#%EF%B8%8F-installation)\n- [Usage](#-usage)\n- [Alternate Usage](#alternate-usage)\n- [Code Samples](#-code-samples)\n- [Available Scripts](#-available-scripts)\n- [Docker Scripts](#-docker-scripts)\n- [Building the Windows Executable File](#️-building-the-windows-executable-file)\n- [Usage with GitHub Actions](#-usage-with-github-actions)\n\n## 📋 Requirements\n\n\u003cdetails\u003e\n\u003csummary\u003e👉 Click to expand the list of requirements\u003c/summary\u003e\n\n1. Windows 11/Linux OS\n2. NodeJS LTS v24.11.0 or higher\n   ```text\n   Recommended:\n   node: 24.11.0\n   npm: 11.6.1\n   ```\n3. Gmail Account\n   - Google Cloud Platform project configured with [OAuth2](https://developers.google.com/workspace/guides/configure-oauth-consent) settings and [credentials](https://developers.google.com/workspace/guides/manage-credentials)\n   - Read on the Google [Gmail](https://developers.google.com/gmail/api/guides), [SMTP and OAuth2 Setup](https://github.com/weaponsforge/email-sender?tab=readme-ov-file#using-the-oauth-20-playground) sections for more information\n\n### Core Libraries/Frameworks\n\n(Installed via npm)\n\n1. [googleapis](https://www.npmjs.com/package/googleapis) `v171.4.0` - Manages Gmail token access\n2. [nodemailer](https://www.npmjs.com/package/nodemailer) `v8.0.1` - Sends emails using various transport options\n3. [typescript](https://www.npmjs.com/package/typescript) `v5.9.3` - Compile-time error checker\n4. [tsx](https://www.npmjs.com/package/tsx) `v4.21.0` - Runs TS files in development mode\n5. [vitest](https://www.npmjs.com/package/vitest) `v4.0.18` - Runs tests\n6. [commander](https://www.npmjs.com/package/commander) `v14.0.3` - CLI library\n7. [sanitize-html](https://www.npmjs.com/package/sanitize-html) `v2.17.1` - Sanitizes WYSIWYG HTML input\n8. [zod](https://www.npmjs.com/package/zod) `v3.24.2` - Run-time input validation\n9. [ejs](https://www.npmjs.com/package/ejs) `v4.0.1` - Composes HTML with dynamic text content\n\n\u003c/details\u003e\n\u003cbr\u003e\n\n## Contributing\n\nWe welcome contributions! Please see [CONTRIBUTING.md](/CONTRIBUTING.md) and the [CODING STYLE](/docs/CODING_STYLE.md) for guidelines.\n\n## 🆕 Quickstart\n\n1. Create a `.env` file in the `/app` directory, replacing the contents of the `.env.example` file with actual values.\n   - See **Installation # 4** for more information about these environment variables.\n2. Install dependencies.\n   ```bash\n   cd app\n   npm install\n   ```\n3. Transpile to JavaScript.\n   ```bash\n   npm run transpile\n   ```\n4. Send a **text email** using the CLI, eg. using Bash:\n   ```bash\n   npm run sendemail -- text \\\n     -s \"You are Invited\" \\\n     -c \"Birthday party in December\" \\\n     -r a@gmail.com,b@gmail.com,c@gmail.com\n   ```\n\n   \u003e 💡 **TIP:** Use `sendemail:dev` to work on development mode without needing to run `\"npm run transpile\"`\n\n5. Send a **styled HTML email** using the CLI, eg. using Bash:\n   ```bash\n   npm run sendemail -- html \\\n     -s \"Reading Materials\" \\\n     -c \"Lorem ipsum dolor sit amet\" \"this is paragraph 1\" \"this is paragraph 2\" \\\n     -r test@gmail.com,one@gmail.com,two@gmail.com\n   ```\n\n   \u003e 💡 **TIP:** No transpilation needed with `\"sendemail:dev\"`\n\n6. Send **WYSIWYG** HTML content using the CLI, eg. using Bash:\u003cbr\u003e\n   _(Adjust `@/utils/config/sanitizeHtml.ts` to allow more styles.)_\n\n   ```bash\n   npm run sendemail -- html \\\n     -s \"WYSIWYG Email\" \\\n     -w \"\u003cdiv style='width:100px; height:100px; border:5px solid blue; border-radius: 3px; padding: 8px; text-align: center; background-color: azure;'\u003e\u003ch3\u003eHello, World\u003c/h3\u003e\u003c/div\u003e\" \\\n     -r \"tester@gmail.com\"\n   ```\n\n   \u003e 💡 **TIP:** Development mode via `\"sendemail:dev\"` skips transpilation\n\n## 🛠️ Installation\n\n1. Clone the repository.\u003cbr\u003e\n`git clone https://github.com/weaponsforge/send-email.git`\n\n2. Install dependencies.\u003cbr\u003e\n`npm install`\n\n3. Configure **OAuth2**. Get a refresh token from the Google [OAuth 2 Playground](https://developers.google.com/oauthplayground).\n   - Read on [Using the OAuth 2.0 Playground](https://github.com/weaponsforge/email-sender?tab=readme-ov-file#using-the-oauth-20-playground) for more information about generating a refresh token using the Google OAuth Playground.\n   - _(⚠️ **INFO:** This is an older note; some steps may vary in 2025)_\n\n4. Set up the environment variables. Create a `.env` file inside the **/app** directory with reference to the `.env.example` file.\n\n   \u003cdetails\u003e\n   \u003csummary\u003e👉 Click to view the environment variable definitions\u003c/summary\u003e\n\n   | Variable Name | Description |\n   | --- | --- |\n   | GOOGLE_USER_EMAIL | Your Google email that you've configured for Gmail SMTP and Google OAuth2. |\n   | GOOGLE_CLIENT_ID | Google OAuth2 client ID linked with your Google Cloud Platform project. |\n   | GOOGLE_CLIENT_SECRET | Google OAuth2 client secret associated with the `GOOGLE_CLIENT_ID`. |\n   | GOOGLE_REDIRECT_URI | Allowed Google API redirect URI. Its value is `https://developers.google.com/oauthplayground` by default. |\n   | GOOGLE_REFRESH_TOKEN | The initial (or any) refresh token obtained from the [OAuthPlayground](https://developers.google.com/oauthplayground).\u003cul\u003e\u003cli\u003eRead on [Using the OAuth 2.0 Playground](https://github.com/weaponsforge/email-sender?tab=readme-ov-file#using-the-oauth-20-playground) for more information about generating a refresh token using the Google OAuth Playground.\u003c/li\u003e\u003cli\u003e\u003cblockquote\u003e_(⚠️ **INFO:** This is an older note; some steps may vary this 2025)_\u003c/blockquote\u003e\u003c/li\u003e\u003c/ul\u003e |\n\n   \u003c/details\u003e\n\n## 🚀 Usage\n\n### Using Node\n\n1. Run a non-test TypeScript file inside the **/app/src** directory from the project's _**\"root directory\"**_. For example:\n\n   ```bash\n   cd app\n   npx tsx src/utils/sample.ts\n   ```\n\n2. Run compiled JavaScript code from the TypeScript files. For example:\n\n   ```bash\n   cd app\n   npm run transpile\n   node dist/utils/sample.js\n   ```\n\n3. See the [Available Scripts](#-available-scripts) section for more information.\n\n## ⚡Alternate Usage\n\n### Using Docker\n\n- **Build the image** (Run only once)\n   ```bash\n   docker compose build --no-cache\n   ```\n\n- **Run the container** (Run only once)\n   ```bash\n   docker compose up\n   ```\n\n- **Run an NPM script using Docker compose**\u003cbr\u003e\n   Ensure the Docker container is running (see **Run the container**)\n   ```bash\n   docker exec -it weaponsforge-sendemail-dev \u003cAVAILABLE_SCRIPT_OR_DOCKER_SCRIPT\u003e\n   ```\n\n- **Run an NPM script using only Docker**\u003cbr\u003e\n   Ensure the Docker container is running (see **Run the container**)\n   ```bash\n   docker run -it -v ${pwd}/app:/opt/app -v /opt/app/node_modules --rm weaponsforge/sendemail:dev \u003cAVAILABLE_SCRIPT_OR_DOCKER_SCRIPT\u003e\n   ```\n\n- **Run a non-test TS file using TypeScript Execute (tsx)**\u003cbr\u003e\n   (requires **Run an NPM script using Docker compose**)\n   ```bash\n   docker exec -it weaponsforge-sendemail-dev npx tsx /opt/app/src/\u003cPATH_TO_TS_FILE\u003e.ts\n   ```\n\n- See the [Available Scripts](#-available-scripts) and [Docker Scripts](#-docker-scripts) sections for more information.\n\n## 🧾 Code Samples\n\n### Send a Text-format Email\n\n**app/src/demo/sendEmail.ts**\n```typescript\nimport { send } from '@/lib/index.js'\n\nconst main = async () =\u003e {\n   await send({\n      recipient: 'tester@gmail.com',\n      subject: 'Test Message',\n      content: 'How are you?'\n   })\n}\n\nmain()\n```\n\n### Send an HTML-format Email\n\n**app/src/demo/sendHtml.ts**\n```typescript\nimport { buildHtml, send } from '@/lib/index.js'\n\nconst emails = ['tester@gmail.com', 'admin@gmail.com']\n\nconst main = async () =\u003e {\n   // Build the HTML email content\n   const emailContent = await buildHtml({\n      content: ['Lorem ipsum dolor sit amet...', 'paragraph #2', 'paragraph #3'],\n      recipients: emails,\n      sender: process.env.GOOGLE_USER_EMAIL\n   })\n\n   // Send the email\n   await send({\n      subject: 'Welcome Aboard!',\n      content: emailContent,\n      recipients: emails,\n      isHtml: true\n   })\n}\n\nmain()\n```\n\n\u003cbr\u003e\n\n## 📜 Available Scripts\n\nThese scripts, compatible with running in Node and Docker, run various TypeScript scripts and tests.\n\n\u003cdetails\u003e\n\u003csummary\u003e👉 Click to expand the list of available scripts\u003c/summary\u003e\n\n### A. Running the Codes ⚙️➡️\n\n### `npm run dev`\n\nRuns `vitest` in watch mode, watching file changes and errors to files linked with `*.test.ts` files.\n\n### `npm run watch`\n\nWatches file changes in `.ts` files using the `tsc --watch` option.\n\n### `npm run transpile`\n\nBuilds JavaScript, `.d.ts` declaration files, and map files from the TypeScript source files in the `/src` directory.\n\n### `npm run transpile:noemit`\n\nRuns type-checking without generating the JavaScript or declaration files from the TypeScript files in the `/src` and `__tests__` directories.\n\n### B. Testing 🚦✅\n\n### `npm run lint`\nLints TypeScript source codes.\n\n### `npm run lint:fix`\nFixes lint errors in TypeScript files.\n\n### `npm test`\n- Runs test scripts defined in `*.test.ts` files with coverage.\n- Generates a vitest test report into the **/html** directory.\n- Run `npm run report:view` to preview the generated report.\n\n### `npm run test:ui`\n\n- Runs test scripts defined in `*.test.ts` files with coverage.\n- Spawns a local report-like website showing each test's real-time status and coverage using vitest-ui\n- This script is similar to the vitest **`npm run dev`** script that watches for changes in the `*.test.ts` files but displays the result logs and coverage details in the local website rather than the command line.\n\n### `npm run report:view`\n\n\u003e **NOTE:** This script requires running `npm test` first to generate a test report into the **/html** directory\n\n- Spins up a local web server accessible at `http://localhost:4174/`\n- Serves the website contents of a test report from the **/html** directory\n\n### `npm run copy:files`\n\nCopies the EJS email template into the `/dist/templates` directory.\n\nThis script runs automatically after `\"npm run transpile\"`, copying the `\"/app/src/templates/email.ejs\"` to the `\"/dist/templates\"` directory.\n\n### `npm run info`\n\nLogs the installed Node.js and npm version, environment platform, architecture and V8 version.\n\n### C. CLI 💻\n\n### `npm start`\n\nShorthand for `\"npm run sendemail\"`\n\n### `npm run sendemail`\n\nSends text and HTML emails using the command line interface (CLI) with transpiled JavaScript.\n\n\u003e 💡 **IMPORTANT:**\n\u003e - This script requires running the `\"npm run transpile\"` script before usage.\n\u003e - If you want to run these without transpiling, append a `:dev` after the NPM script: `\"npm run sendemail:dev\"`\n\n#### CLI Usage\n\n- To view the list of available commands: `npm run sendemail help`\n   ```text\n   Usage: sendemail [options] [command]\n\n   CLI for sending text and HTML emails using Gmail SMTP and Google OAuth2\n\n   Options:\n   -V, --version   output the version number\n   -h, --help      display help for command\n\n   Commands:\n   text [options]  Send raw text email to one or multiple recipient/s\n   html [options]  Send paragraphs of text or WYSIWYG content as styled\n                     HTML email to one or multiple recipient/s.\n   help [command]  display help for command\n   ```\n- Append a double dash `--` to pass arguments to the CLI commands eg., (using Bash)\n   ```bash\n   npm run sendemail -- text \\\n     -s \"You are Invited\" \\\n     -c \"Birthday party in December\" \\\n     -r a@gmail.com,b@gmail.com,c@gmail.com\n   ```\n- View available options for the **sendemail text [options]** command.\n   ```bash\n   # Usage options for the send \"text\" email command\n   npm run sendemail help text\n   ```\n\n   ```text\n   Usage: sendemail text [options]\n\n   Send raw text email to one or multiple recipient/s\n\n   Options:\n   -s, --subject \u003ctitle\u003e      email subject or title enclosed in double-quotes\n   -c, --content \u003ctext\u003e       email text content enclosed in double-quotes\n   -e, --env [path]           path to .env file (optional)\n   -r, --recipients \u003cemails\u003e  comma-separated list of email addresses\n   -h, --help                 display help for command\n   ```\n\n- View available options for the **sendemail html [options]** command.\n   ```bash\n   # Usage options for the send \"html\" email command\n   npm run sendemail help html\n   ```\n\n   ```text\n   Usage: sendemail html [options]\n\n   Send paragraphs of text or WYSIWYG content as styled\n   HTML email to one or multiple recipient/s.\n\n   Options:\n   -s, --subject \u003ctitle\u003e      email subject or title enclosed in double-quotes\n   -r, --recipients \u003cemails\u003e  comma-separated list of email addresses\n   -c, --content \u003ctext...\u003e    whitespace-delimited text/paragraphs enclosed in double-quotes\n   -w, --wysiwyg [html]       optional HTML tags that form a WYSIWYG content enclosed in double-quotes, using inline CSS styles\n   -e, --env [path]           path to .env file (optional)\n   -h, --help                 display help for command\n   ```\n\n### `npm run sendemail:dev`\n\n- Sends an email using the command line interface (CLI) in development mode using TypeScript.\n- Append a double dash `--` to pass arguments to the CLI commands.\n- Usage: view the `\"npm run sendemail\"` script for more information. They share similar usage.\n  - \u003e 💡 **NOTE:** Append `:dev` in the script eg., `npm run sendemail:dev`\n\n\u003c/details\u003e\n\u003cbr\u003e\n\n## 📦 Docker Scripts\n\nThese scripts allow optional Docker-related processes, such as enabling file watching in Docker containers running in Windows WSL2 and others.\n\n\u003e [!TIP]\n\u003e Scripts with a `\":win\"` suffix indicate compatibility for Windows Docker running in WSL2.\n\n\u003cdetails\u003e\n\u003csummary\u003e👉 Click to expand the list of available scripts\u003c/summary\u003e\n\n### Docker run command\n\nRun the Docker containers first using options A or B.\n\n**A. Using Docker compose**\n\n```bash\ndocker compose build\ndocker compose up\n```\n\nUse the template:\n\n```bash\ndocker exec -it weaponsforge-sendemail-dev \u003cAVAILABLE_DOCKER_SCRIPT\u003e\n```\n\n**B. Using Only Docker (PowerShell)**\n\n`docker run -it -v ${pwd}/app:/opt/app -v /opt/app/node_modules --rm weaponsforge/sendemail:dev \u003cAVAILABLE_DOCKER_SCRIPT\u003e`\n\n### Scripts\n\n### `npm run docker:debug`\n\n1. Runs the `\"/src/utils/sample/sample.ts\"` script in containers with debugging enabled in VSCode by default.\n2. Replace the `\"/src/utils/sample/sample.ts\"` file path in the package.json file's `\"docker:debug\"` script with a target TypeScript file for debugging.\n3. Map port **`9229`** to enable debugging VSCode while running in Docker (PowerShell).\n   - (A. Using Docker compose):\u003cbr\u003e\n   `docker exec -it weaponsforge-sendemail-dev npm run docker:debug`\n   - (B. Using Only Docker (PowerShell))\u003cbr\u003e\n   `docker run -it -v ${pwd}/app:/opt/app -v /opt/app/node_modules -p 9229:9229 --rm weaponsforge/sendemail:dev npm run docker:debug`\n4. Launch the VSCode debugger using the following configuration:\n   ```json\n   {\n     \"version\": \"0.2.0\",\n     \"configurations\": [\n       {\n         \"type\": \"node\",\n         \"request\": \"attach\",\n         \"name\": \"Attach to Docker\",\n         \"address\": \"localhost\",\n         \"port\": 9229,\n         \"restart\": true,\n         \"skipFiles\": [\"\u003cnode_internals\u003e/**\"],\n         \"localRoot\": \"${workspaceFolder}/app\",\n         \"remoteRoot\": \"/opt/app\"\n       }\n     ]\n   }\n   ```\n\n### `npm run docker:test:ui`\n\n- Docker command counterpart of the `npm run test:ui` script,  compatible with containers running in **Linux** OS.\n- Runs test scripts defined in `*.test.ts` files in watch mode with coverage from a container.\n- Spawns a local report-like website showing each test's real-time status and coverage using vitest-ui accessible at `http://localhost:51204/__vitest__/`.\n\n### `npm run docker:report:view`\n\n\u003e **NOTE:** This script requires running `npm test` first to generate a test report into the **/html** directory\n\n- Docker command counterpart of the `npm run report:view` script.\n- Spins up a local web server accessible at `http://localhost:4174/`\n- Serves the website contents of a test report from the host's **/html** directory\n\n### `npm run docker:watch:win`\n\nWatches file changes in `.ts` files using the `tsc --watch` option with `dynamicPriorityPolling` in Docker containers running in Windows WSL2.\n\n### `npm run docker:dev:win`\n\n- Sets and exports the environment variables: `CHOKIDAR_USEPOLLING=1` and `CHOKIDAR_INTERVAL=1000`\n- Runs `vitest` in watch mode inside Docker containers running in Windows WSL2, watching file changes and errors to files linked with `*.test.ts` files.\n\n### `npm run docker:test:ui:win`\n\n- Sets and exports the environment variables: `CHOKIDAR_USEPOLLING=1` and `CHOKIDAR_INTERVAL=1000`\n- Runs test scripts defined in `*.test.ts` files in watch mode with coverage inside Docker containers running in **Windows WSL2**.\n- Spawns a local report-like website showing each test's real-time status and coverage using vitest-ui accessible at `http://localhost:51204/__vitest__/`.\n\n\u003c/details\u003e\n\u003cbr\u003e\n\n## 🏗️ Building the Windows Executable File\n\nThis project packages the CLI app into a **Windows (.exe)** Node Single Executable Application [(SEA)](https://nodejs.org/api/single-executable-applications.html) file into `\"/app/build/sendemail.exe\"` using esbuild and postject.\n\n**Using Node**\n\nRun the Bash script using GitBash when working in a Windows OS.\n\n```bash\nchmod u+x ./app/scripts/build-sea-win.sh\n./app/scripts/build-sea-win.sh\n```\n\n**Using Docker**\n\nThese steps need to have the Docker container up and running first (`\"docker compose up\"`).\n\n```bash\ndocker exec -it weaponsforge-sendemail-dev sh ./scripts/build-sea-win.sh\n```\n\n### Using the Executable File\n\n- Refer to [Available Scripts - C. CLI](#-available-scripts) for CLI argument syntax. When running the executable directly, invoke it without npm (no `\"--\"` needed), for example:\n   ```bash\n   sendemail text -s \"You are Invited\" -c \"Birthday party\" -r a@gmail.com,b@gmail.com\n   ```\n\n\u003cbr\u003e\n\n## 🚀 Usage with GitHub Actions\n\n### Deployment to Docker Hub\n\nThis repository deploys the latest development Docker image `weaponsforge/sendemail` to Docker Hub on the **creation of new Tags/Releases from the `main` branch** with GitHub Actions. Supply the following GitHub Secrets and Variable to enable deployment to Docker Hub. It requires a Docker Hub account.\n\nThe Docker Hub image is available at:\n\nhttps://hub.docker.com/r/weaponsforge/sendemail\n\n### GitHub Secrets and Variables\n\n#### GitHub Secrets\n\n| GitHub Secret Name | Description |\n| --- | --- |\n| DOCKERHUB_USERNAME | Docker Hub username |\n| DOCKERHUB_TOKEN | Deploy token for the Docker Hub account |\n\n#### GitHub Variables\n\n| GitHub Variable Name | Description |\n| --- | --- |\n| DOCKERHUB_USERNAME | Docker Hub username |\n\n\u003cbr\u003e\n\n## References\n\n- Gmail API \u003csup\u003e[[1]](https://developers.google.com/gmail/api/guides) [[2]](https://github.com/googleapis/google-api-nodejs-client)\u003c/sup\u003e\n- Gmail Quickstart \u003csup\u003e[[3]](https://developers.google.com/gmail/api/quickstart/js)\u003c/sup\u003e\n- AMP for Gmail \u003csup\u003e[[4]](https://developers.google.com/gmail/ampemail)\u003c/sup\u003e\n- Google Workspace Guide \u003csup\u003e[[5]](https://developers.google.com/workspace/guides/get-started)\u003c/sup\u003e\n\n@weaponsforge\u003cbr\u003e\n20250323\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fweaponsforge%2Fsend-email","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fweaponsforge%2Fsend-email","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fweaponsforge%2Fsend-email/lists"}