Email Configuration
RSSMonster uses SMTP for email-address verification, password recovery, and email briefing deliveries. Email is opt-in: when EMAIL_ENABLED is absent or set to false, RSSMonster continues to work with username and password only and does not require SMTP configuration.
When email is enabled, new registrations require an email address. Existing accounts without a verified address are guided through email enrollment the next time they sign in. Password recovery and briefing delivery are available only to accounts with a verified address.
Where to Configure Email
Administrators can configure email in Settings → Server settings → SMTP options. See Server Settings for grouped overrides, password handling, and restoring environment defaults. The environment configuration below applies when no override is active.
For a manual installation, put the variables in server/.env. Restart every RSSMonster server process after changing them.
For Docker Compose, put the values in the repository-root .env. Compose does not automatically pass arbitrary root .env values into containers; the variables must also be declared in the RSSMonster service’s environment section. The Docker Compose override example below does this without modifying the supplied Compose file.
Never commit an .env file. Restrict access to files containing SMTP credentials and keep the same configuration available after upgrades.
Environment Variables
The following values are required when EMAIL_ENABLED=true:
| Variable | Description |
|---|---|
EMAIL_ENABLED | Set to true to require and enable email features. The default is false. |
PUBLIC_APP_URL | Public HTTP or HTTPS base URL used in verification and reset links, for example https://rss.example.com. It must not contain credentials, a query string, or a fragment. |
SMTP_HOST | SMTP server hostname or IP address. |
EMAIL_FROM | Sender mailbox, optionally with a display name, for example RSSMonster <rssmonster@example.com>. |
Transport and authentication settings:
| Variable | Default | Description |
|---|---|---|
SMTP_PORT | 587 | SMTP server port. Port 465 requires immediate TLS; port 587 normally uses STARTTLS. |
SMTP_SECURE | true on port 465; otherwise false | Use immediate TLS. This must be true for port 465 and false for port 587. |
SMTP_REQUIRE_TLS | true on port 587; otherwise false | Require STARTTLS. Do not enable this together with SMTP_SECURE=true. |
SMTP_POOL | false | Reuse pooled SMTP connections when supported by the server. |
SMTP_USER | unset | SMTP authentication username. Leave it unset for an unauthenticated local relay. |
SMTP_PASSWORD | unset | SMTP password. Configure this together with SMTP_USER. |
SMTP_PASSWORD_FILE | unset | Read the SMTP password from a file, such as a mounted container secret. It is mutually exclusive with SMTP_PASSWORD. |
EMAIL_REPLY_TO | unset | Optional reply-to address. |
SMTP_USER and a password must either both be configured or both be omitted. Use exactly one of SMTP_PASSWORD and SMTP_PASSWORD_FILE. The password-file path is resolved inside the process or container that runs RSSMonster.
Password-reset request limiting can be tuned with these optional settings:
| Variable | Default | Description |
|---|---|---|
PASSWORD_RESET_RATE_LIMIT_WINDOW_MS | 3600000 | IP rate-limit window in milliseconds. |
PASSWORD_RESET_RATE_LIMIT_MAX | 5 | Maximum reset requests accepted from one IP during the window. |
RSSMonster also applies a per-account cooldown. Reset-request responses do not reveal whether an address belongs to an account.
Example: Authenticated SMTP with STARTTLS
Add the following to server/.env for a manual installation, or to the root .env for Docker Compose:
EMAIL_ENABLED=true
PUBLIC_APP_URL=https://rss.example.com
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_REQUIRE_TLS=true
SMTP_POOL=true
SMTP_USER=rssmonster@example.com
SMTP_PASSWORD=replace-with-the-smtp-password
EMAIL_FROM="RSSMonster <rssmonster@example.com>"
EMAIL_REPLY_TO=admin@example.com
For port 465, use:
SMTP_PORT=465
SMTP_SECURE=true
SMTP_REQUIRE_TLS=false
For a trusted local relay without authentication, omit SMTP_USER, SMTP_PASSWORD, and SMTP_PASSWORD_FILE.
Docker Compose
Create docker-compose.override.yml beside the supplied Compose file:
services:
rssmonster:
environment:
EMAIL_ENABLED: ${EMAIL_ENABLED:-false}
PUBLIC_APP_URL: ${PUBLIC_APP_URL:-}
SMTP_HOST: ${SMTP_HOST:-}
SMTP_PORT: ${SMTP_PORT:-587}
SMTP_SECURE: ${SMTP_SECURE:-}
SMTP_REQUIRE_TLS: ${SMTP_REQUIRE_TLS:-}
SMTP_POOL: ${SMTP_POOL:-false}
SMTP_USER: ${SMTP_USER:-}
SMTP_PASSWORD: ${SMTP_PASSWORD:-}
SMTP_PASSWORD_FILE: ${SMTP_PASSWORD_FILE:-}
EMAIL_FROM: ${EMAIL_FROM:-}
EMAIL_REPLY_TO: ${EMAIL_REPLY_TO:-}
PASSWORD_RESET_RATE_LIMIT_WINDOW_MS: ${PASSWORD_RESET_RATE_LIMIT_WINDOW_MS:-3600000}
PASSWORD_RESET_RATE_LIMIT_MAX: ${PASSWORD_RESET_RATE_LIMIT_MAX:-5}
Then recreate the application container so it receives the new environment:
docker compose up -d --force-recreate rssmonster
When starting the MySQL profile with an explicit Compose file, include the override explicitly as well:
docker compose \
-f docker-compose.mysql.yml \
-f docker-compose.override.yml \
up -d --force-recreate rssmonster
When using SMTP_PASSWORD_FILE, also mount the secret file into the container and set SMTP_PASSWORD_FILE to that in-container path. Do not configure SMTP_PASSWORD at the same time.
Verify the Configuration
Sign in as an administrator and open Settings → Server settings → SMTP options. The status cards report whether the email configuration is complete and whether email is enabled. When enabled, select Test SMTP connection.
The connectivity test verifies that RSSMonster can connect to the SMTP server and complete any configured authentication and TLS negotiation. It does not send an email. Stored SMTP passwords are not returned to the browser.
The server also logs safe delivery lifecycle events. These contain delivery IDs, user IDs, message types, attempt counts, status, and sanitized SMTP error codes, but never recipients, credentials, action tokens, or message bodies:
[EmailWorker] transport.verified verified=true
[Email] delivery.enqueued deliveryId="..." userId=1 messageType="email_verification" attempt=0 status="pending"
[EmailWorker] outbox.claimed count=1
[Email] delivery.started deliveryId="..." userId=1 messageType="email_verification" attempt=1
[Email] delivery.completed deliveryId="..." userId=1 messageType="email_verification" attempt=1 status="sent"
delivery.completed means the configured SMTP server accepted the message. If it does not arrive after that event, check the provider’s delivery activity, spam filtering, and sender-domain configuration.
If the test fails, check:
- the host and port are reachable from the RSSMonster process or container;
- port 465 uses
SMTP_SECURE=trueandSMTP_REQUIRE_TLS=false; - port 587 uses
SMTP_SECURE=falseand normallySMTP_REQUIRE_TLS=true; - the username and password are both present when authentication is required;
- the sender address is accepted by the SMTP provider;
PUBLIC_APP_URLis the externally reachable RSSMonster URL; and- the process was restarted or the container recreated after editing
.env.