Skip to content

Feat/mailer smtp provider - #437

Closed
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider
Closed

Feat/mailer smtp provider#437
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider

Conversation

@NasroelLah

@NasroelLahNasroelLah commented Jul 31, 2026

Copy link
Copy Markdown

Summary by cubic

Introduced a pluggable mailer with MAILER_PROVIDER (ses, smtp, usesend) and refactored platform emails to use it. Default behavior is preserved: self-hosted stays on legacy SES; cloud continues using useSend.

  • New Features

    • Added resolveMailerTransport with cached getMailerTransport() and transports for SES, SMTP, and useSend.
    • New env vars for SMTP: MAILER_SMTP_HOST, MAILER_SMTP_PORT, MAILER_SMTP_USER, MAILER_SMTP_PASS, MAILER_SMTP_SECURE.
    • Exported getSesClient and implemented direct SES sending via @aws-sdk/client-sesv2 + nodemailer.
    • Unit tests for all transports and resolver; Docker SaaS env examples updated.
  • Migration

    • Set MAILER_PROVIDER to ses, smtp, or usesend.
    • Ensure FROM_EMAIL is set for all providers.
    • For SMTP, set MAILER_SMTP_HOST, MAILER_SMTP_USER, MAILER_SMTP_PASS (PORT defaults to 587; SECURE true if 465 or explicitly "true").
    • For SES, configure AWS_* and AWS_DEFAULT_REGION.
    • For useSend, provide USESEND_API_KEY or UNSEND_API_KEY.
    • If MAILER_PROVIDER is unset, no changes required (backward-compatible defaults).

Written for commit e260105. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added configurable email delivery through Amazon SES, SMTP, UseSend, or legacy delivery.
    • Added SMTP settings for host, port, security mode, username, and password.
    • Supports selecting the email provider through environment configuration.
    • Preserves existing delivery behavior when no provider is specified.
  • Documentation
    • Added production configuration templates and deployment settings for email providers.
    • Documented SaaS deployment support for SMTP and UseSend services.

@vercel

vercelBot commented Jul 31, 2026

Copy link
Copy Markdown

@NasroelLah is attempting to deploy a commit to the kmkoushik's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Adds a configurable mailer abstraction supporting SES, SMTP, UseSend, and legacy SES transports. Provider resolution validates configuration, applies cloud or self-hosted defaults, and caches the selected transport. Existing mailer functions delegate delivery through this abstraction. The change also adds provider-specific unit tests, environment mappings, SES client export access, SaaS Docker configuration, and design/implementation documentation.

Possibly related PRs

  • usesend/useSend#196: Shares the mailer entry point and preserves template-based OTP and team-invite delivery.
  • usesend/useSend#375: Shares the mail delivery flow used by domain-verification notifications.
  • usesend/useSend#401: Shares environment and SES client changes used by the mailer refactor.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly identifies the mailer SMTP provider work, which is a central part of the pull request.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

apps/web/src/env.js

ESLint skipped: missing config or dependency (missing-dependency). The ESLint configuration references a package that is not available in the sandbox.

apps/web/src/server/aws/ses.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

apps/web/src/server/mailer.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

  • 12 others

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@NasroelLahNasroelLah reopened this Jul 31, 2026
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:02
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:04
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:04

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
apps/web/src/server/mailer/providers/resolve.ts (1)

5-9: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use the ~/ alias for app-source imports.

  • apps/web/src/server/mailer/providers/resolve.ts#L5-L9: replace provider and type relative imports with ~/server/mailer/providers/....
  • apps/web/src/server/mailer.ts#L4-L4: import the resolver from ~/server/mailer/providers/resolve.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/web/src/server/mailer/providers/resolve.ts` around lines 5 - 9, Replace
the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/src/env.js`:
- Around line 78-83: Update the MAILER_SMTP_PORT and MAILER_SMTP_SECURE schemas
in the environment validation configuration to reject non-numeric or
out-of-range ports, allowing only 1 through 65535, and to accept secure-mode
values only when exactly true or false. Add or update environment validation
tests covering invalid port and TLS values while preserving valid configuration
behavior.
In `@docker/prod/compose.saas.yml`:
- Around line 132-134: Update the SMTP TLS volume mounts in the compose
configuration to use the configurable LETSENCRYPT_LIVE_DIR value instead of the
hard-coded pintesia.com path, and reference the standard LetsEncrypt privkey.pem
and fullchain.pem files. Add
LETSENCRYPT_LIVE_DIR=/etc/letsencrypt/live/<your-mail-domain> to
docker/prod/.env.example-saas.
In `@docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md`:
- Line 7: Align the mailer architecture around `resolveMailerTransport` and
`LegacySesTransport`: either make the resolver depend only on `(provider,
isCloud)` and inject Legacy SES dependencies through its constructor, or revise
the plan text to accurately describe the existing `env` and module-dependency
usage. Keep the documented architecture and implementation consistent.
---
Nitpick comments:
In `@apps/web/src/server/mailer/providers/resolve.ts`:
- Around line 5-9: Replace the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e995a4ff-0cef-44fc-966f-712175654947

📥 Commits

Reviewing files that changed from the base of the PR and between bd83535 and e260105.

📒 Files selected for processing (19)
  • apps/web/src/env.js
  • apps/web/src/server/aws/ses.ts
  • apps/web/src/server/mailer.ts
  • apps/web/src/server/mailer.unit.test.ts
  • apps/web/src/server/mailer/providers/legacy-ses.ts
  • apps/web/src/server/mailer/providers/legacy-ses.unit.test.ts
  • apps/web/src/server/mailer/providers/resolve.ts
  • apps/web/src/server/mailer/providers/resolve.unit.test.ts
  • apps/web/src/server/mailer/providers/ses.ts
  • apps/web/src/server/mailer/providers/ses.unit.test.ts
  • apps/web/src/server/mailer/providers/smtp.ts
  • apps/web/src/server/mailer/providers/smtp.unit.test.ts
  • apps/web/src/server/mailer/providers/types.ts
  • apps/web/src/server/mailer/providers/usesend.ts
  • apps/web/src/server/mailer/providers/usesend.unit.test.ts
  • docker/prod/.env.example-saas
  • docker/prod/compose.saas.yml
  • docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
  • docs/superpowers/specs/2026-07-30-mailer-smtp-provider-design.md

Comment threadapps/web/src/env.js
Comment threaddocker/prod/compose.saas.yml
Comment threaddocs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@NasroelLah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Feat/mailer smtp provider by NasroelLah · Pull Request #437 · usesend/useSend · GitHub
Skip to content

Feat/mailer smtp provider - #437

Closed
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider
Closed

Feat/mailer smtp provider#437
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider

Conversation

@NasroelLah

@NasroelLahNasroelLah commented Jul 31, 2026

Copy link
Copy Markdown

Summary by cubic

Introduced a pluggable mailer with MAILER_PROVIDER (ses, smtp, usesend) and refactored platform emails to use it. Default behavior is preserved: self-hosted stays on legacy SES; cloud continues using useSend.

  • New Features

    • Added resolveMailerTransport with cached getMailerTransport() and transports for SES, SMTP, and useSend.
    • New env vars for SMTP: MAILER_SMTP_HOST, MAILER_SMTP_PORT, MAILER_SMTP_USER, MAILER_SMTP_PASS, MAILER_SMTP_SECURE.
    • Exported getSesClient and implemented direct SES sending via @aws-sdk/client-sesv2 + nodemailer.
    • Unit tests for all transports and resolver; Docker SaaS env examples updated.
  • Migration

    • Set MAILER_PROVIDER to ses, smtp, or usesend.
    • Ensure FROM_EMAIL is set for all providers.
    • For SMTP, set MAILER_SMTP_HOST, MAILER_SMTP_USER, MAILER_SMTP_PASS (PORT defaults to 587; SECURE true if 465 or explicitly "true").
    • For SES, configure AWS_* and AWS_DEFAULT_REGION.
    • For useSend, provide USESEND_API_KEY or UNSEND_API_KEY.
    • If MAILER_PROVIDER is unset, no changes required (backward-compatible defaults).

Written for commit e260105. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added configurable email delivery through Amazon SES, SMTP, UseSend, or legacy delivery.
    • Added SMTP settings for host, port, security mode, username, and password.
    • Supports selecting the email provider through environment configuration.
    • Preserves existing delivery behavior when no provider is specified.
  • Documentation
    • Added production configuration templates and deployment settings for email providers.
    • Documented SaaS deployment support for SMTP and UseSend services.

@vercel

vercelBot commented Jul 31, 2026

Copy link
Copy Markdown

@NasroelLah is attempting to deploy a commit to the kmkoushik's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Adds a configurable mailer abstraction supporting SES, SMTP, UseSend, and legacy SES transports. Provider resolution validates configuration, applies cloud or self-hosted defaults, and caches the selected transport. Existing mailer functions delegate delivery through this abstraction. The change also adds provider-specific unit tests, environment mappings, SES client export access, SaaS Docker configuration, and design/implementation documentation.

Possibly related PRs

  • usesend/useSend#196: Shares the mailer entry point and preserves template-based OTP and team-invite delivery.
  • usesend/useSend#375: Shares the mail delivery flow used by domain-verification notifications.
  • usesend/useSend#401: Shares environment and SES client changes used by the mailer refactor.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly identifies the mailer SMTP provider work, which is a central part of the pull request.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

apps/web/src/env.js

ESLint skipped: missing config or dependency (missing-dependency). The ESLint configuration references a package that is not available in the sandbox.

apps/web/src/server/aws/ses.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

apps/web/src/server/mailer.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

  • 12 others

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@NasroelLahNasroelLah reopened this Jul 31, 2026
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:02
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:04
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:04

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
apps/web/src/server/mailer/providers/resolve.ts (1)

5-9: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use the ~/ alias for app-source imports.

  • apps/web/src/server/mailer/providers/resolve.ts#L5-L9: replace provider and type relative imports with ~/server/mailer/providers/....
  • apps/web/src/server/mailer.ts#L4-L4: import the resolver from ~/server/mailer/providers/resolve.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/web/src/server/mailer/providers/resolve.ts` around lines 5 - 9, Replace
the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/src/env.js`:
- Around line 78-83: Update the MAILER_SMTP_PORT and MAILER_SMTP_SECURE schemas
in the environment validation configuration to reject non-numeric or
out-of-range ports, allowing only 1 through 65535, and to accept secure-mode
values only when exactly true or false. Add or update environment validation
tests covering invalid port and TLS values while preserving valid configuration
behavior.
In `@docker/prod/compose.saas.yml`:
- Around line 132-134: Update the SMTP TLS volume mounts in the compose
configuration to use the configurable LETSENCRYPT_LIVE_DIR value instead of the
hard-coded pintesia.com path, and reference the standard LetsEncrypt privkey.pem
and fullchain.pem files. Add
LETSENCRYPT_LIVE_DIR=/etc/letsencrypt/live/<your-mail-domain> to
docker/prod/.env.example-saas.
In `@docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md`:
- Line 7: Align the mailer architecture around `resolveMailerTransport` and
`LegacySesTransport`: either make the resolver depend only on `(provider,
isCloud)` and inject Legacy SES dependencies through its constructor, or revise
the plan text to accurately describe the existing `env` and module-dependency
usage. Keep the documented architecture and implementation consistent.
---
Nitpick comments:
In `@apps/web/src/server/mailer/providers/resolve.ts`:
- Around line 5-9: Replace the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e995a4ff-0cef-44fc-966f-712175654947

📥 Commits

Reviewing files that changed from the base of the PR and between bd83535 and e260105.

📒 Files selected for processing (19)
  • apps/web/src/env.js
  • apps/web/src/server/aws/ses.ts
  • apps/web/src/server/mailer.ts
  • apps/web/src/server/mailer.unit.test.ts
  • apps/web/src/server/mailer/providers/legacy-ses.ts
  • apps/web/src/server/mailer/providers/legacy-ses.unit.test.ts
  • apps/web/src/server/mailer/providers/resolve.ts
  • apps/web/src/server/mailer/providers/resolve.unit.test.ts
  • apps/web/src/server/mailer/providers/ses.ts
  • apps/web/src/server/mailer/providers/ses.unit.test.ts
  • apps/web/src/server/mailer/providers/smtp.ts
  • apps/web/src/server/mailer/providers/smtp.unit.test.ts
  • apps/web/src/server/mailer/providers/types.ts
  • apps/web/src/server/mailer/providers/usesend.ts
  • apps/web/src/server/mailer/providers/usesend.unit.test.ts
  • docker/prod/.env.example-saas
  • docker/prod/compose.saas.yml
  • docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
  • docs/superpowers/specs/2026-07-30-mailer-smtp-provider-design.md

Comment threadapps/web/src/env.js
Comment threaddocker/prod/compose.saas.yml
Comment threaddocs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@NasroelLah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Feat/mailer smtp provider by NasroelLah · Pull Request #437 · usesend/useSend · GitHub
Skip to content

Feat/mailer smtp provider - #437

Closed
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider
Closed

Feat/mailer smtp provider#437
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider

Conversation

@NasroelLah

@NasroelLahNasroelLah commented Jul 31, 2026

Copy link
Copy Markdown

Summary by cubic

Introduced a pluggable mailer with MAILER_PROVIDER (ses, smtp, usesend) and refactored platform emails to use it. Default behavior is preserved: self-hosted stays on legacy SES; cloud continues using useSend.

  • New Features

    • Added resolveMailerTransport with cached getMailerTransport() and transports for SES, SMTP, and useSend.
    • New env vars for SMTP: MAILER_SMTP_HOST, MAILER_SMTP_PORT, MAILER_SMTP_USER, MAILER_SMTP_PASS, MAILER_SMTP_SECURE.
    • Exported getSesClient and implemented direct SES sending via @aws-sdk/client-sesv2 + nodemailer.
    • Unit tests for all transports and resolver; Docker SaaS env examples updated.
  • Migration

    • Set MAILER_PROVIDER to ses, smtp, or usesend.
    • Ensure FROM_EMAIL is set for all providers.
    • For SMTP, set MAILER_SMTP_HOST, MAILER_SMTP_USER, MAILER_SMTP_PASS (PORT defaults to 587; SECURE true if 465 or explicitly "true").
    • For SES, configure AWS_* and AWS_DEFAULT_REGION.
    • For useSend, provide USESEND_API_KEY or UNSEND_API_KEY.
    • If MAILER_PROVIDER is unset, no changes required (backward-compatible defaults).

Written for commit e260105. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added configurable email delivery through Amazon SES, SMTP, UseSend, or legacy delivery.
    • Added SMTP settings for host, port, security mode, username, and password.
    • Supports selecting the email provider through environment configuration.
    • Preserves existing delivery behavior when no provider is specified.
  • Documentation
    • Added production configuration templates and deployment settings for email providers.
    • Documented SaaS deployment support for SMTP and UseSend services.

@vercel

vercelBot commented Jul 31, 2026

Copy link
Copy Markdown

@NasroelLah is attempting to deploy a commit to the kmkoushik's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Adds a configurable mailer abstraction supporting SES, SMTP, UseSend, and legacy SES transports. Provider resolution validates configuration, applies cloud or self-hosted defaults, and caches the selected transport. Existing mailer functions delegate delivery through this abstraction. The change also adds provider-specific unit tests, environment mappings, SES client export access, SaaS Docker configuration, and design/implementation documentation.

Possibly related PRs

  • usesend/useSend#196: Shares the mailer entry point and preserves template-based OTP and team-invite delivery.
  • usesend/useSend#375: Shares the mail delivery flow used by domain-verification notifications.
  • usesend/useSend#401: Shares environment and SES client changes used by the mailer refactor.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly identifies the mailer SMTP provider work, which is a central part of the pull request.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

apps/web/src/env.js

ESLint skipped: missing config or dependency (missing-dependency). The ESLint configuration references a package that is not available in the sandbox.

apps/web/src/server/aws/ses.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

apps/web/src/server/mailer.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

  • 12 others

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@NasroelLahNasroelLah reopened this Jul 31, 2026
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:02
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:04
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:04

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
apps/web/src/server/mailer/providers/resolve.ts (1)

5-9: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use the ~/ alias for app-source imports.

  • apps/web/src/server/mailer/providers/resolve.ts#L5-L9: replace provider and type relative imports with ~/server/mailer/providers/....
  • apps/web/src/server/mailer.ts#L4-L4: import the resolver from ~/server/mailer/providers/resolve.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/web/src/server/mailer/providers/resolve.ts` around lines 5 - 9, Replace
the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/src/env.js`:
- Around line 78-83: Update the MAILER_SMTP_PORT and MAILER_SMTP_SECURE schemas
in the environment validation configuration to reject non-numeric or
out-of-range ports, allowing only 1 through 65535, and to accept secure-mode
values only when exactly true or false. Add or update environment validation
tests covering invalid port and TLS values while preserving valid configuration
behavior.
In `@docker/prod/compose.saas.yml`:
- Around line 132-134: Update the SMTP TLS volume mounts in the compose
configuration to use the configurable LETSENCRYPT_LIVE_DIR value instead of the
hard-coded pintesia.com path, and reference the standard LetsEncrypt privkey.pem
and fullchain.pem files. Add
LETSENCRYPT_LIVE_DIR=/etc/letsencrypt/live/<your-mail-domain> to
docker/prod/.env.example-saas.
In `@docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md`:
- Line 7: Align the mailer architecture around `resolveMailerTransport` and
`LegacySesTransport`: either make the resolver depend only on `(provider,
isCloud)` and inject Legacy SES dependencies through its constructor, or revise
the plan text to accurately describe the existing `env` and module-dependency
usage. Keep the documented architecture and implementation consistent.
---
Nitpick comments:
In `@apps/web/src/server/mailer/providers/resolve.ts`:
- Around line 5-9: Replace the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e995a4ff-0cef-44fc-966f-712175654947

📥 Commits

Reviewing files that changed from the base of the PR and between bd83535 and e260105.

📒 Files selected for processing (19)
  • apps/web/src/env.js
  • apps/web/src/server/aws/ses.ts
  • apps/web/src/server/mailer.ts
  • apps/web/src/server/mailer.unit.test.ts
  • apps/web/src/server/mailer/providers/legacy-ses.ts
  • apps/web/src/server/mailer/providers/legacy-ses.unit.test.ts
  • apps/web/src/server/mailer/providers/resolve.ts
  • apps/web/src/server/mailer/providers/resolve.unit.test.ts
  • apps/web/src/server/mailer/providers/ses.ts
  • apps/web/src/server/mailer/providers/ses.unit.test.ts
  • apps/web/src/server/mailer/providers/smtp.ts
  • apps/web/src/server/mailer/providers/smtp.unit.test.ts
  • apps/web/src/server/mailer/providers/types.ts
  • apps/web/src/server/mailer/providers/usesend.ts
  • apps/web/src/server/mailer/providers/usesend.unit.test.ts
  • docker/prod/.env.example-saas
  • docker/prod/compose.saas.yml
  • docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
  • docs/superpowers/specs/2026-07-30-mailer-smtp-provider-design.md

Comment threadapps/web/src/env.js
Comment threaddocker/prod/compose.saas.yml
Comment threaddocs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@NasroelLah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Feat/mailer smtp provider by NasroelLah · Pull Request #437 · usesend/useSend · GitHub
Skip to content

Feat/mailer smtp provider - #437

Closed
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider
Closed

Feat/mailer smtp provider#437
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider

Conversation

@NasroelLah

@NasroelLahNasroelLah commented Jul 31, 2026

Copy link
Copy Markdown

Summary by cubic

Introduced a pluggable mailer with MAILER_PROVIDER (ses, smtp, usesend) and refactored platform emails to use it. Default behavior is preserved: self-hosted stays on legacy SES; cloud continues using useSend.

  • New Features

    • Added resolveMailerTransport with cached getMailerTransport() and transports for SES, SMTP, and useSend.
    • New env vars for SMTP: MAILER_SMTP_HOST, MAILER_SMTP_PORT, MAILER_SMTP_USER, MAILER_SMTP_PASS, MAILER_SMTP_SECURE.
    • Exported getSesClient and implemented direct SES sending via @aws-sdk/client-sesv2 + nodemailer.
    • Unit tests for all transports and resolver; Docker SaaS env examples updated.
  • Migration

    • Set MAILER_PROVIDER to ses, smtp, or usesend.
    • Ensure FROM_EMAIL is set for all providers.
    • For SMTP, set MAILER_SMTP_HOST, MAILER_SMTP_USER, MAILER_SMTP_PASS (PORT defaults to 587; SECURE true if 465 or explicitly "true").
    • For SES, configure AWS_* and AWS_DEFAULT_REGION.
    • For useSend, provide USESEND_API_KEY or UNSEND_API_KEY.
    • If MAILER_PROVIDER is unset, no changes required (backward-compatible defaults).

Written for commit e260105. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added configurable email delivery through Amazon SES, SMTP, UseSend, or legacy delivery.
    • Added SMTP settings for host, port, security mode, username, and password.
    • Supports selecting the email provider through environment configuration.
    • Preserves existing delivery behavior when no provider is specified.
  • Documentation
    • Added production configuration templates and deployment settings for email providers.
    • Documented SaaS deployment support for SMTP and UseSend services.

@vercel

vercelBot commented Jul 31, 2026

Copy link
Copy Markdown

@NasroelLah is attempting to deploy a commit to the kmkoushik's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Adds a configurable mailer abstraction supporting SES, SMTP, UseSend, and legacy SES transports. Provider resolution validates configuration, applies cloud or self-hosted defaults, and caches the selected transport. Existing mailer functions delegate delivery through this abstraction. The change also adds provider-specific unit tests, environment mappings, SES client export access, SaaS Docker configuration, and design/implementation documentation.

Possibly related PRs

  • usesend/useSend#196: Shares the mailer entry point and preserves template-based OTP and team-invite delivery.
  • usesend/useSend#375: Shares the mail delivery flow used by domain-verification notifications.
  • usesend/useSend#401: Shares environment and SES client changes used by the mailer refactor.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly identifies the mailer SMTP provider work, which is a central part of the pull request.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

apps/web/src/env.js

ESLint skipped: missing config or dependency (missing-dependency). The ESLint configuration references a package that is not available in the sandbox.

apps/web/src/server/aws/ses.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

apps/web/src/server/mailer.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

  • 12 others

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@NasroelLahNasroelLah reopened this Jul 31, 2026
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:02
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:04
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:04

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
apps/web/src/server/mailer/providers/resolve.ts (1)

5-9: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use the ~/ alias for app-source imports.

  • apps/web/src/server/mailer/providers/resolve.ts#L5-L9: replace provider and type relative imports with ~/server/mailer/providers/....
  • apps/web/src/server/mailer.ts#L4-L4: import the resolver from ~/server/mailer/providers/resolve.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/web/src/server/mailer/providers/resolve.ts` around lines 5 - 9, Replace
the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/src/env.js`:
- Around line 78-83: Update the MAILER_SMTP_PORT and MAILER_SMTP_SECURE schemas
in the environment validation configuration to reject non-numeric or
out-of-range ports, allowing only 1 through 65535, and to accept secure-mode
values only when exactly true or false. Add or update environment validation
tests covering invalid port and TLS values while preserving valid configuration
behavior.
In `@docker/prod/compose.saas.yml`:
- Around line 132-134: Update the SMTP TLS volume mounts in the compose
configuration to use the configurable LETSENCRYPT_LIVE_DIR value instead of the
hard-coded pintesia.com path, and reference the standard LetsEncrypt privkey.pem
and fullchain.pem files. Add
LETSENCRYPT_LIVE_DIR=/etc/letsencrypt/live/<your-mail-domain> to
docker/prod/.env.example-saas.
In `@docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md`:
- Line 7: Align the mailer architecture around `resolveMailerTransport` and
`LegacySesTransport`: either make the resolver depend only on `(provider,
isCloud)` and inject Legacy SES dependencies through its constructor, or revise
the plan text to accurately describe the existing `env` and module-dependency
usage. Keep the documented architecture and implementation consistent.
---
Nitpick comments:
In `@apps/web/src/server/mailer/providers/resolve.ts`:
- Around line 5-9: Replace the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e995a4ff-0cef-44fc-966f-712175654947

📥 Commits

Reviewing files that changed from the base of the PR and between bd83535 and e260105.

📒 Files selected for processing (19)
  • apps/web/src/env.js
  • apps/web/src/server/aws/ses.ts
  • apps/web/src/server/mailer.ts
  • apps/web/src/server/mailer.unit.test.ts
  • apps/web/src/server/mailer/providers/legacy-ses.ts
  • apps/web/src/server/mailer/providers/legacy-ses.unit.test.ts
  • apps/web/src/server/mailer/providers/resolve.ts
  • apps/web/src/server/mailer/providers/resolve.unit.test.ts
  • apps/web/src/server/mailer/providers/ses.ts
  • apps/web/src/server/mailer/providers/ses.unit.test.ts
  • apps/web/src/server/mailer/providers/smtp.ts
  • apps/web/src/server/mailer/providers/smtp.unit.test.ts
  • apps/web/src/server/mailer/providers/types.ts
  • apps/web/src/server/mailer/providers/usesend.ts
  • apps/web/src/server/mailer/providers/usesend.unit.test.ts
  • docker/prod/.env.example-saas
  • docker/prod/compose.saas.yml
  • docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
  • docs/superpowers/specs/2026-07-30-mailer-smtp-provider-design.md

Comment threadapps/web/src/env.js
Comment threaddocker/prod/compose.saas.yml
Comment threaddocs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@NasroelLah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Feat/mailer smtp provider by NasroelLah · Pull Request #437 · usesend/useSend · GitHub
Skip to content

Feat/mailer smtp provider - #437

Closed
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider
Closed

Feat/mailer smtp provider#437
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider

Conversation

@NasroelLah

@NasroelLahNasroelLah commented Jul 31, 2026

Copy link
Copy Markdown

Summary by cubic

Introduced a pluggable mailer with MAILER_PROVIDER (ses, smtp, usesend) and refactored platform emails to use it. Default behavior is preserved: self-hosted stays on legacy SES; cloud continues using useSend.

  • New Features

    • Added resolveMailerTransport with cached getMailerTransport() and transports for SES, SMTP, and useSend.
    • New env vars for SMTP: MAILER_SMTP_HOST, MAILER_SMTP_PORT, MAILER_SMTP_USER, MAILER_SMTP_PASS, MAILER_SMTP_SECURE.
    • Exported getSesClient and implemented direct SES sending via @aws-sdk/client-sesv2 + nodemailer.
    • Unit tests for all transports and resolver; Docker SaaS env examples updated.
  • Migration

    • Set MAILER_PROVIDER to ses, smtp, or usesend.
    • Ensure FROM_EMAIL is set for all providers.
    • For SMTP, set MAILER_SMTP_HOST, MAILER_SMTP_USER, MAILER_SMTP_PASS (PORT defaults to 587; SECURE true if 465 or explicitly "true").
    • For SES, configure AWS_* and AWS_DEFAULT_REGION.
    • For useSend, provide USESEND_API_KEY or UNSEND_API_KEY.
    • If MAILER_PROVIDER is unset, no changes required (backward-compatible defaults).

Written for commit e260105. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added configurable email delivery through Amazon SES, SMTP, UseSend, or legacy delivery.
    • Added SMTP settings for host, port, security mode, username, and password.
    • Supports selecting the email provider through environment configuration.
    • Preserves existing delivery behavior when no provider is specified.
  • Documentation
    • Added production configuration templates and deployment settings for email providers.
    • Documented SaaS deployment support for SMTP and UseSend services.

@vercel

vercelBot commented Jul 31, 2026

Copy link
Copy Markdown

@NasroelLah is attempting to deploy a commit to the kmkoushik's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Adds a configurable mailer abstraction supporting SES, SMTP, UseSend, and legacy SES transports. Provider resolution validates configuration, applies cloud or self-hosted defaults, and caches the selected transport. Existing mailer functions delegate delivery through this abstraction. The change also adds provider-specific unit tests, environment mappings, SES client export access, SaaS Docker configuration, and design/implementation documentation.

Possibly related PRs

  • usesend/useSend#196: Shares the mailer entry point and preserves template-based OTP and team-invite delivery.
  • usesend/useSend#375: Shares the mail delivery flow used by domain-verification notifications.
  • usesend/useSend#401: Shares environment and SES client changes used by the mailer refactor.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly identifies the mailer SMTP provider work, which is a central part of the pull request.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

apps/web/src/env.js

ESLint skipped: missing config or dependency (missing-dependency). The ESLint configuration references a package that is not available in the sandbox.

apps/web/src/server/aws/ses.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

apps/web/src/server/mailer.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

  • 12 others

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@NasroelLahNasroelLah reopened this Jul 31, 2026
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:02
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:04
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:04

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
apps/web/src/server/mailer/providers/resolve.ts (1)

5-9: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use the ~/ alias for app-source imports.

  • apps/web/src/server/mailer/providers/resolve.ts#L5-L9: replace provider and type relative imports with ~/server/mailer/providers/....
  • apps/web/src/server/mailer.ts#L4-L4: import the resolver from ~/server/mailer/providers/resolve.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/web/src/server/mailer/providers/resolve.ts` around lines 5 - 9, Replace
the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/src/env.js`:
- Around line 78-83: Update the MAILER_SMTP_PORT and MAILER_SMTP_SECURE schemas
in the environment validation configuration to reject non-numeric or
out-of-range ports, allowing only 1 through 65535, and to accept secure-mode
values only when exactly true or false. Add or update environment validation
tests covering invalid port and TLS values while preserving valid configuration
behavior.
In `@docker/prod/compose.saas.yml`:
- Around line 132-134: Update the SMTP TLS volume mounts in the compose
configuration to use the configurable LETSENCRYPT_LIVE_DIR value instead of the
hard-coded pintesia.com path, and reference the standard LetsEncrypt privkey.pem
and fullchain.pem files. Add
LETSENCRYPT_LIVE_DIR=/etc/letsencrypt/live/<your-mail-domain> to
docker/prod/.env.example-saas.
In `@docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md`:
- Line 7: Align the mailer architecture around `resolveMailerTransport` and
`LegacySesTransport`: either make the resolver depend only on `(provider,
isCloud)` and inject Legacy SES dependencies through its constructor, or revise
the plan text to accurately describe the existing `env` and module-dependency
usage. Keep the documented architecture and implementation consistent.
---
Nitpick comments:
In `@apps/web/src/server/mailer/providers/resolve.ts`:
- Around line 5-9: Replace the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e995a4ff-0cef-44fc-966f-712175654947

📥 Commits

Reviewing files that changed from the base of the PR and between bd83535 and e260105.

📒 Files selected for processing (19)
  • apps/web/src/env.js
  • apps/web/src/server/aws/ses.ts
  • apps/web/src/server/mailer.ts
  • apps/web/src/server/mailer.unit.test.ts
  • apps/web/src/server/mailer/providers/legacy-ses.ts
  • apps/web/src/server/mailer/providers/legacy-ses.unit.test.ts
  • apps/web/src/server/mailer/providers/resolve.ts
  • apps/web/src/server/mailer/providers/resolve.unit.test.ts
  • apps/web/src/server/mailer/providers/ses.ts
  • apps/web/src/server/mailer/providers/ses.unit.test.ts
  • apps/web/src/server/mailer/providers/smtp.ts
  • apps/web/src/server/mailer/providers/smtp.unit.test.ts
  • apps/web/src/server/mailer/providers/types.ts
  • apps/web/src/server/mailer/providers/usesend.ts
  • apps/web/src/server/mailer/providers/usesend.unit.test.ts
  • docker/prod/.env.example-saas
  • docker/prod/compose.saas.yml
  • docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
  • docs/superpowers/specs/2026-07-30-mailer-smtp-provider-design.md

Comment threadapps/web/src/env.js
Comment threaddocker/prod/compose.saas.yml
Comment threaddocs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@NasroelLah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Feat/mailer smtp provider by NasroelLah · Pull Request #437 · usesend/useSend · GitHub
Skip to content

Feat/mailer smtp provider - #437

Closed
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider
Closed

Feat/mailer smtp provider#437
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider

Conversation

@NasroelLah

@NasroelLahNasroelLah commented Jul 31, 2026

Copy link
Copy Markdown

Summary by cubic

Introduced a pluggable mailer with MAILER_PROVIDER (ses, smtp, usesend) and refactored platform emails to use it. Default behavior is preserved: self-hosted stays on legacy SES; cloud continues using useSend.

  • New Features

    • Added resolveMailerTransport with cached getMailerTransport() and transports for SES, SMTP, and useSend.
    • New env vars for SMTP: MAILER_SMTP_HOST, MAILER_SMTP_PORT, MAILER_SMTP_USER, MAILER_SMTP_PASS, MAILER_SMTP_SECURE.
    • Exported getSesClient and implemented direct SES sending via @aws-sdk/client-sesv2 + nodemailer.
    • Unit tests for all transports and resolver; Docker SaaS env examples updated.
  • Migration

    • Set MAILER_PROVIDER to ses, smtp, or usesend.
    • Ensure FROM_EMAIL is set for all providers.
    • For SMTP, set MAILER_SMTP_HOST, MAILER_SMTP_USER, MAILER_SMTP_PASS (PORT defaults to 587; SECURE true if 465 or explicitly "true").
    • For SES, configure AWS_* and AWS_DEFAULT_REGION.
    • For useSend, provide USESEND_API_KEY or UNSEND_API_KEY.
    • If MAILER_PROVIDER is unset, no changes required (backward-compatible defaults).

Written for commit e260105. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added configurable email delivery through Amazon SES, SMTP, UseSend, or legacy delivery.
    • Added SMTP settings for host, port, security mode, username, and password.
    • Supports selecting the email provider through environment configuration.
    • Preserves existing delivery behavior when no provider is specified.
  • Documentation
    • Added production configuration templates and deployment settings for email providers.
    • Documented SaaS deployment support for SMTP and UseSend services.

@vercel

vercelBot commented Jul 31, 2026

Copy link
Copy Markdown

@NasroelLah is attempting to deploy a commit to the kmkoushik's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Adds a configurable mailer abstraction supporting SES, SMTP, UseSend, and legacy SES transports. Provider resolution validates configuration, applies cloud or self-hosted defaults, and caches the selected transport. Existing mailer functions delegate delivery through this abstraction. The change also adds provider-specific unit tests, environment mappings, SES client export access, SaaS Docker configuration, and design/implementation documentation.

Possibly related PRs

  • usesend/useSend#196: Shares the mailer entry point and preserves template-based OTP and team-invite delivery.
  • usesend/useSend#375: Shares the mail delivery flow used by domain-verification notifications.
  • usesend/useSend#401: Shares environment and SES client changes used by the mailer refactor.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly identifies the mailer SMTP provider work, which is a central part of the pull request.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

apps/web/src/env.js

ESLint skipped: missing config or dependency (missing-dependency). The ESLint configuration references a package that is not available in the sandbox.

apps/web/src/server/aws/ses.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

apps/web/src/server/mailer.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

  • 12 others

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@NasroelLahNasroelLah reopened this Jul 31, 2026
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:02
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:04
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:04

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
apps/web/src/server/mailer/providers/resolve.ts (1)

5-9: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use the ~/ alias for app-source imports.

  • apps/web/src/server/mailer/providers/resolve.ts#L5-L9: replace provider and type relative imports with ~/server/mailer/providers/....
  • apps/web/src/server/mailer.ts#L4-L4: import the resolver from ~/server/mailer/providers/resolve.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/web/src/server/mailer/providers/resolve.ts` around lines 5 - 9, Replace
the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/src/env.js`:
- Around line 78-83: Update the MAILER_SMTP_PORT and MAILER_SMTP_SECURE schemas
in the environment validation configuration to reject non-numeric or
out-of-range ports, allowing only 1 through 65535, and to accept secure-mode
values only when exactly true or false. Add or update environment validation
tests covering invalid port and TLS values while preserving valid configuration
behavior.
In `@docker/prod/compose.saas.yml`:
- Around line 132-134: Update the SMTP TLS volume mounts in the compose
configuration to use the configurable LETSENCRYPT_LIVE_DIR value instead of the
hard-coded pintesia.com path, and reference the standard LetsEncrypt privkey.pem
and fullchain.pem files. Add
LETSENCRYPT_LIVE_DIR=/etc/letsencrypt/live/<your-mail-domain> to
docker/prod/.env.example-saas.
In `@docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md`:
- Line 7: Align the mailer architecture around `resolveMailerTransport` and
`LegacySesTransport`: either make the resolver depend only on `(provider,
isCloud)` and inject Legacy SES dependencies through its constructor, or revise
the plan text to accurately describe the existing `env` and module-dependency
usage. Keep the documented architecture and implementation consistent.
---
Nitpick comments:
In `@apps/web/src/server/mailer/providers/resolve.ts`:
- Around line 5-9: Replace the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e995a4ff-0cef-44fc-966f-712175654947

📥 Commits

Reviewing files that changed from the base of the PR and between bd83535 and e260105.

📒 Files selected for processing (19)
  • apps/web/src/env.js
  • apps/web/src/server/aws/ses.ts
  • apps/web/src/server/mailer.ts
  • apps/web/src/server/mailer.unit.test.ts
  • apps/web/src/server/mailer/providers/legacy-ses.ts
  • apps/web/src/server/mailer/providers/legacy-ses.unit.test.ts
  • apps/web/src/server/mailer/providers/resolve.ts
  • apps/web/src/server/mailer/providers/resolve.unit.test.ts
  • apps/web/src/server/mailer/providers/ses.ts
  • apps/web/src/server/mailer/providers/ses.unit.test.ts
  • apps/web/src/server/mailer/providers/smtp.ts
  • apps/web/src/server/mailer/providers/smtp.unit.test.ts
  • apps/web/src/server/mailer/providers/types.ts
  • apps/web/src/server/mailer/providers/usesend.ts
  • apps/web/src/server/mailer/providers/usesend.unit.test.ts
  • docker/prod/.env.example-saas
  • docker/prod/compose.saas.yml
  • docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
  • docs/superpowers/specs/2026-07-30-mailer-smtp-provider-design.md

Comment threadapps/web/src/env.js
Comment threaddocker/prod/compose.saas.yml
Comment threaddocs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@NasroelLah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Feat/mailer smtp provider by NasroelLah · Pull Request #437 · usesend/useSend · GitHub
Skip to content

Feat/mailer smtp provider - #437

Closed
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider
Closed

Feat/mailer smtp provider#437
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider

Conversation

@NasroelLah

@NasroelLahNasroelLah commented Jul 31, 2026

Copy link
Copy Markdown

Summary by cubic

Introduced a pluggable mailer with MAILER_PROVIDER (ses, smtp, usesend) and refactored platform emails to use it. Default behavior is preserved: self-hosted stays on legacy SES; cloud continues using useSend.

  • New Features

    • Added resolveMailerTransport with cached getMailerTransport() and transports for SES, SMTP, and useSend.
    • New env vars for SMTP: MAILER_SMTP_HOST, MAILER_SMTP_PORT, MAILER_SMTP_USER, MAILER_SMTP_PASS, MAILER_SMTP_SECURE.
    • Exported getSesClient and implemented direct SES sending via @aws-sdk/client-sesv2 + nodemailer.
    • Unit tests for all transports and resolver; Docker SaaS env examples updated.
  • Migration

    • Set MAILER_PROVIDER to ses, smtp, or usesend.
    • Ensure FROM_EMAIL is set for all providers.
    • For SMTP, set MAILER_SMTP_HOST, MAILER_SMTP_USER, MAILER_SMTP_PASS (PORT defaults to 587; SECURE true if 465 or explicitly "true").
    • For SES, configure AWS_* and AWS_DEFAULT_REGION.
    • For useSend, provide USESEND_API_KEY or UNSEND_API_KEY.
    • If MAILER_PROVIDER is unset, no changes required (backward-compatible defaults).

Written for commit e260105. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added configurable email delivery through Amazon SES, SMTP, UseSend, or legacy delivery.
    • Added SMTP settings for host, port, security mode, username, and password.
    • Supports selecting the email provider through environment configuration.
    • Preserves existing delivery behavior when no provider is specified.
  • Documentation
    • Added production configuration templates and deployment settings for email providers.
    • Documented SaaS deployment support for SMTP and UseSend services.

@vercel

vercelBot commented Jul 31, 2026

Copy link
Copy Markdown

@NasroelLah is attempting to deploy a commit to the kmkoushik's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Adds a configurable mailer abstraction supporting SES, SMTP, UseSend, and legacy SES transports. Provider resolution validates configuration, applies cloud or self-hosted defaults, and caches the selected transport. Existing mailer functions delegate delivery through this abstraction. The change also adds provider-specific unit tests, environment mappings, SES client export access, SaaS Docker configuration, and design/implementation documentation.

Possibly related PRs

  • usesend/useSend#196: Shares the mailer entry point and preserves template-based OTP and team-invite delivery.
  • usesend/useSend#375: Shares the mail delivery flow used by domain-verification notifications.
  • usesend/useSend#401: Shares environment and SES client changes used by the mailer refactor.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly identifies the mailer SMTP provider work, which is a central part of the pull request.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

apps/web/src/env.js

ESLint skipped: missing config or dependency (missing-dependency). The ESLint configuration references a package that is not available in the sandbox.

apps/web/src/server/aws/ses.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

apps/web/src/server/mailer.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

  • 12 others

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@NasroelLahNasroelLah reopened this Jul 31, 2026
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:02
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:04
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:04

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
apps/web/src/server/mailer/providers/resolve.ts (1)

5-9: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use the ~/ alias for app-source imports.

  • apps/web/src/server/mailer/providers/resolve.ts#L5-L9: replace provider and type relative imports with ~/server/mailer/providers/....
  • apps/web/src/server/mailer.ts#L4-L4: import the resolver from ~/server/mailer/providers/resolve.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/web/src/server/mailer/providers/resolve.ts` around lines 5 - 9, Replace
the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/src/env.js`:
- Around line 78-83: Update the MAILER_SMTP_PORT and MAILER_SMTP_SECURE schemas
in the environment validation configuration to reject non-numeric or
out-of-range ports, allowing only 1 through 65535, and to accept secure-mode
values only when exactly true or false. Add or update environment validation
tests covering invalid port and TLS values while preserving valid configuration
behavior.
In `@docker/prod/compose.saas.yml`:
- Around line 132-134: Update the SMTP TLS volume mounts in the compose
configuration to use the configurable LETSENCRYPT_LIVE_DIR value instead of the
hard-coded pintesia.com path, and reference the standard LetsEncrypt privkey.pem
and fullchain.pem files. Add
LETSENCRYPT_LIVE_DIR=/etc/letsencrypt/live/<your-mail-domain> to
docker/prod/.env.example-saas.
In `@docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md`:
- Line 7: Align the mailer architecture around `resolveMailerTransport` and
`LegacySesTransport`: either make the resolver depend only on `(provider,
isCloud)` and inject Legacy SES dependencies through its constructor, or revise
the plan text to accurately describe the existing `env` and module-dependency
usage. Keep the documented architecture and implementation consistent.
---
Nitpick comments:
In `@apps/web/src/server/mailer/providers/resolve.ts`:
- Around line 5-9: Replace the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e995a4ff-0cef-44fc-966f-712175654947

📥 Commits

Reviewing files that changed from the base of the PR and between bd83535 and e260105.

📒 Files selected for processing (19)
  • apps/web/src/env.js
  • apps/web/src/server/aws/ses.ts
  • apps/web/src/server/mailer.ts
  • apps/web/src/server/mailer.unit.test.ts
  • apps/web/src/server/mailer/providers/legacy-ses.ts
  • apps/web/src/server/mailer/providers/legacy-ses.unit.test.ts
  • apps/web/src/server/mailer/providers/resolve.ts
  • apps/web/src/server/mailer/providers/resolve.unit.test.ts
  • apps/web/src/server/mailer/providers/ses.ts
  • apps/web/src/server/mailer/providers/ses.unit.test.ts
  • apps/web/src/server/mailer/providers/smtp.ts
  • apps/web/src/server/mailer/providers/smtp.unit.test.ts
  • apps/web/src/server/mailer/providers/types.ts
  • apps/web/src/server/mailer/providers/usesend.ts
  • apps/web/src/server/mailer/providers/usesend.unit.test.ts
  • docker/prod/.env.example-saas
  • docker/prod/compose.saas.yml
  • docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
  • docs/superpowers/specs/2026-07-30-mailer-smtp-provider-design.md

Comment threadapps/web/src/env.js
Comment threaddocker/prod/compose.saas.yml
Comment threaddocs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@NasroelLah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Feat/mailer smtp provider by NasroelLah · Pull Request #437 · usesend/useSend · GitHub
Skip to content

Feat/mailer smtp provider - #437

Closed
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider
Closed

Feat/mailer smtp provider#437
NasroelLah wants to merge 9 commits into
usesend:mainfrom
NasroelLah:feat/mailer-smtp-provider

Conversation

@NasroelLah

@NasroelLahNasroelLah commented Jul 31, 2026

Copy link
Copy Markdown

Summary by cubic

Introduced a pluggable mailer with MAILER_PROVIDER (ses, smtp, usesend) and refactored platform emails to use it. Default behavior is preserved: self-hosted stays on legacy SES; cloud continues using useSend.

  • New Features

    • Added resolveMailerTransport with cached getMailerTransport() and transports for SES, SMTP, and useSend.
    • New env vars for SMTP: MAILER_SMTP_HOST, MAILER_SMTP_PORT, MAILER_SMTP_USER, MAILER_SMTP_PASS, MAILER_SMTP_SECURE.
    • Exported getSesClient and implemented direct SES sending via @aws-sdk/client-sesv2 + nodemailer.
    • Unit tests for all transports and resolver; Docker SaaS env examples updated.
  • Migration

    • Set MAILER_PROVIDER to ses, smtp, or usesend.
    • Ensure FROM_EMAIL is set for all providers.
    • For SMTP, set MAILER_SMTP_HOST, MAILER_SMTP_USER, MAILER_SMTP_PASS (PORT defaults to 587; SECURE true if 465 or explicitly "true").
    • For SES, configure AWS_* and AWS_DEFAULT_REGION.
    • For useSend, provide USESEND_API_KEY or UNSEND_API_KEY.
    • If MAILER_PROVIDER is unset, no changes required (backward-compatible defaults).

Written for commit e260105. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added configurable email delivery through Amazon SES, SMTP, UseSend, or legacy delivery.
    • Added SMTP settings for host, port, security mode, username, and password.
    • Supports selecting the email provider through environment configuration.
    • Preserves existing delivery behavior when no provider is specified.
  • Documentation
    • Added production configuration templates and deployment settings for email providers.
    • Documented SaaS deployment support for SMTP and UseSend services.

@vercel

vercelBot commented Jul 31, 2026

Copy link
Copy Markdown

@NasroelLah is attempting to deploy a commit to the kmkoushik's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Adds a configurable mailer abstraction supporting SES, SMTP, UseSend, and legacy SES transports. Provider resolution validates configuration, applies cloud or self-hosted defaults, and caches the selected transport. Existing mailer functions delegate delivery through this abstraction. The change also adds provider-specific unit tests, environment mappings, SES client export access, SaaS Docker configuration, and design/implementation documentation.

Possibly related PRs

  • usesend/useSend#196: Shares the mailer entry point and preserves template-based OTP and team-invite delivery.
  • usesend/useSend#375: Shares the mail delivery flow used by domain-verification notifications.
  • usesend/useSend#401: Shares environment and SES client changes used by the mailer refactor.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly identifies the mailer SMTP provider work, which is a central part of the pull request.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

apps/web/src/env.js

ESLint skipped: missing config or dependency (missing-dependency). The ESLint configuration references a package that is not available in the sandbox.

apps/web/src/server/aws/ses.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

apps/web/src/server/mailer.ts

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

  • 12 others

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@NasroelLahNasroelLah reopened this Jul 31, 2026
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:02
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:04
@NasroelLah
NasroelLah deleted the feat/mailer-smtp-provider branch July 31, 2026 01:04

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
apps/web/src/server/mailer/providers/resolve.ts (1)

5-9: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use the ~/ alias for app-source imports.

  • apps/web/src/server/mailer/providers/resolve.ts#L5-L9: replace provider and type relative imports with ~/server/mailer/providers/....
  • apps/web/src/server/mailer.ts#L4-L4: import the resolver from ~/server/mailer/providers/resolve.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/web/src/server/mailer/providers/resolve.ts` around lines 5 - 9, Replace
the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/src/env.js`:
- Around line 78-83: Update the MAILER_SMTP_PORT and MAILER_SMTP_SECURE schemas
in the environment validation configuration to reject non-numeric or
out-of-range ports, allowing only 1 through 65535, and to accept secure-mode
values only when exactly true or false. Add or update environment validation
tests covering invalid port and TLS values while preserving valid configuration
behavior.
In `@docker/prod/compose.saas.yml`:
- Around line 132-134: Update the SMTP TLS volume mounts in the compose
configuration to use the configurable LETSENCRYPT_LIVE_DIR value instead of the
hard-coded pintesia.com path, and reference the standard LetsEncrypt privkey.pem
and fullchain.pem files. Add
LETSENCRYPT_LIVE_DIR=/etc/letsencrypt/live/<your-mail-domain> to
docker/prod/.env.example-saas.
In `@docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md`:
- Line 7: Align the mailer architecture around `resolveMailerTransport` and
`LegacySesTransport`: either make the resolver depend only on `(provider,
isCloud)` and inject Legacy SES dependencies through its constructor, or revise
the plan text to accurately describe the existing `env` and module-dependency
usage. Keep the documented architecture and implementation consistent.
---
Nitpick comments:
In `@apps/web/src/server/mailer/providers/resolve.ts`:
- Around line 5-9: Replace the relative provider and MailerTransport imports in
apps/web/src/server/mailer/providers/resolve.ts lines 5-9 with the
~/server/mailer/providers/... alias paths. Update the resolver import in
apps/web/src/server/mailer.ts line 4 to use ~/server/mailer/providers/resolve.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e995a4ff-0cef-44fc-966f-712175654947

📥 Commits

Reviewing files that changed from the base of the PR and between bd83535 and e260105.

📒 Files selected for processing (19)
  • apps/web/src/env.js
  • apps/web/src/server/aws/ses.ts
  • apps/web/src/server/mailer.ts
  • apps/web/src/server/mailer.unit.test.ts
  • apps/web/src/server/mailer/providers/legacy-ses.ts
  • apps/web/src/server/mailer/providers/legacy-ses.unit.test.ts
  • apps/web/src/server/mailer/providers/resolve.ts
  • apps/web/src/server/mailer/providers/resolve.unit.test.ts
  • apps/web/src/server/mailer/providers/ses.ts
  • apps/web/src/server/mailer/providers/ses.unit.test.ts
  • apps/web/src/server/mailer/providers/smtp.ts
  • apps/web/src/server/mailer/providers/smtp.unit.test.ts
  • apps/web/src/server/mailer/providers/types.ts
  • apps/web/src/server/mailer/providers/usesend.ts
  • apps/web/src/server/mailer/providers/usesend.unit.test.ts
  • docker/prod/.env.example-saas
  • docker/prod/compose.saas.yml
  • docs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
  • docs/superpowers/specs/2026-07-30-mailer-smtp-provider-design.md

Comment threadapps/web/src/env.js
Comment threaddocker/prod/compose.saas.yml
Comment threaddocs/superpowers/plans/2026-07-30-mailer-smtp-provider.md
@NasroelLah
NasroelLah restored the feat/mailer-smtp-provider branch July 31, 2026 01:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@NasroelLah