Use SMTP credentials instead of Gmail auth for Email

This commit is contained in:
Ahmed Al-Taiar
2024-10-16 21:36:57 -04:00
parent bac5b5fe48
commit 6540329f36
7 changed files with 35 additions and 20 deletions

View File

@ -18,8 +18,11 @@ PRISMA_HIDE_UPDATE_MESSAGE=true
FIRST_NAME=firstname
LAST_NAME=lastname
GMAIL=example@gmail.com
GMAIL_SMTP_PASSWORD=chan geme xyza bcde
SMTP_HOST=smtp.example.com
SMTP_PORT=465
SMTP_SECURE=true
SMTP_USER=noreply@example.com
SMTP_PASSWORD=password
DOMAIN=example.com
API_DOMAIN=api.example.com

View File

@ -6,8 +6,11 @@
FIRST_NAME=firstname
LAST_NAME=lastname
GMAIL=example@gmail.com
GMAIL_SMTP_PASSWORD=chan geme xyza bcde
SMTP_HOST=smtp.example.com
SMTP_PORT=465
SMTP_SECURE=true
SMTP_USER=noreply@example.com
SMTP_PASSWORD=password
DOMAIN=example.com
API_DOMAIN=api.example.com

View File

@ -43,8 +43,11 @@ ARG ADDRESS_DEV
ARG DOMAIN
ARG API_DOMAIN
ARG MAX_HTTP_CONNECTIONS_PER_MINUTE
ARG GMAIL
ARG GMAIL_SMTP_PASSWORD
ARG SMTP_HOST
ARG SMTP_PORT
ARG SMTP_SECURE
ARG SMTP_USER
ARG SMTP_PASSWORD
ARG FIRST_NAME
ARG LAST_NAME

View File

@ -6,10 +6,8 @@ Create two A records, one for the web side of the website and one for the api si
- It doesn't matter what reverse proxy you use (Nginx, Apache, Traefik, Caddy, etc)
1. Point the web domain to the web port (default: 8910)
2. Point the api domain to the api port (default: 8911)
### Gmail App Password
1. Go to your Google [account dashboard](https://myaccount.google.com)
2. Go to Security > 2-Step Verification > App Passwords > Create a new app password
3. Copy the 16 character password
### SMTP
You will need credentials to authorize sending Email, instructions vary depending on provider (Gmail, Hotmail, etc).
### [Docker Compose](./docker-compose.yml)
```yaml
version: '3.8'
@ -26,8 +24,11 @@ services:
- DATABASE_URL=postgresql://redwood:changeme@db:5432/portfolio
- FIRST_NAME=first name # Your first name
- LAST_NAME=lastname # Your last name
- GMAIL=example@gmail.com # The Gmail address associated with the app password created earlier
- GMAIL_SMTP_PASSWORD=aaaa bbbb cccc dddd # The app password created earlier
- SMTP_HOST=smtp.example.com
- SMTP_PORT=465
- SMTP_SECURE=true
- SMTP_USER=noreply@example.com
- SMTP_PASSWORD=password
- DOMAIN=portfolio.example.com
- API_DOMAIN=api.portfolio.example.com
# Careful, addresses below must not end with a '/'
@ -77,4 +78,4 @@ sudo docker exec -u root portfolio chown -R node:node /home/node/app/api/files_p
### Default Credentials
**Username:** `admin`
**Password:** [`GMAIL_SMTP_PASSWORD`](#gmail-app-password)
**Password:** [`SMTP_PASSWORD`](#smtp)

View File

@ -8,16 +8,18 @@ interface Options {
}
const transporter = nodemailer.createTransport({
service: 'gmail',
host: process.env.SMTP_HOST,
port: Number(process.env.SMTP_PORT),
secure: process.env.SMTP_SECURE === 'true',
auth: {
user: process.env.GMAIL,
pass: process.env.GMAIL_SMTP_PASSWORD,
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASSWORD,
},
})
export const sendEmail = async ({ to, subject, text, html }: Options) =>
await transporter.sendMail({
from: `"${process.env.FIRST_NAME} ${process.env.LAST_NAME} (noreply)" <${process.env.GMAIL}>`,
from: `${process.env.FIRST_NAME} ${process.env.LAST_NAME} <${process.env.GMAIL}>`,
to: Array.isArray(to) ? to : [to],
subject,
text,

View File

@ -12,8 +12,11 @@ services:
- DATABASE_URL=postgresql://redwood:changeme@db:5432/portfolio
- FIRST_NAME=first name # Your first name
- LAST_NAME=lastname # Your last name
- GMAIL=example@gmail.com # The Gmail address associated with the app password created earlier
- GMAIL_SMTP_PASSWORD=aaaa bbbb cccc dddd # The app password created earlier
- SMTP_HOST=smtp.example.com
- SMTP_PORT=465
- SMTP_SECURE=true
- SMTP_USER=noreply@example.com
- SMTP_PASSWORD=password
- DOMAIN=portfolio.example.com
- API_DOMAIN=api.portfolio.example.com
# Careful, addresses below must not end with a '/'

View File

@ -10,7 +10,7 @@ export default async () => {
const admin = {
username: 'admin',
email: process.env.GMAIL,
password: process.env.GMAIL_SMTP_PASSWORD,
password: process.env.SMTP_PASSWORD,
}
const [hashedPassword, salt] = hashPassword(admin.password)