Initial commit: mail-server with WebFlux backend and Angular v22 Synthwave frontend

Co-authored-by: Junie <junie@jetbrains.com>
This commit is contained in:
2026-11-05 01:07:29 +01:00
co-authored by Junie
commit 0339413d6e
78 changed files with 6808 additions and 0 deletions
@@ -0,0 +1,54 @@
spring.application.name=mail-server
server.port=8080
# R2DBC — реактивный доступ к PostgreSQL
spring.r2dbc.url=r2dbc:postgresql://localhost:5432/mailserver
spring.r2dbc.username=mail
spring.r2dbc.password=secret
# Flyway — миграции базы данных
spring.flyway.enabled=true
spring.flyway.url=jdbc:postgresql://localhost:5432/mailserver
spring.flyway.user=mail
spring.flyway.password=secret
spring.flyway.locations=classpath:db/migration
spring.flyway.baseline-on-migrate=true
# Вложения
mailserver.attachments.dir=./attachments
spring.webflux.multipart.max-file-size=10MB
spring.webflux.multipart.max-request-size=10MB
# SMTP-сервер для приёма входящих писем
mailserver.smtp.port=3025
mailserver.smtp.hostname=your-domain.com
# IMAP-сервер (отключён)
mailserver.imap.enabled=false
mailserver.imap.port=1143
mailserver.imap.hostname=localhost
# DKIM — криптографическая подпись писем
mailserver.dkim.enabled=false
mailserver.dkim.domain=your-domain.com
mailserver.dkim.keys-dir=./dkim-keys
# SPF — проверка отправителей через DNS
mailserver.spf.enabled=false
mailserver.spf.local-bypass=true
# DMARC — политика обработки писем, не прошедших SPF/DKIM
mailserver.dmarc.enabled=false
mailserver.dmarc.local-bypass=true
# SMTP релей — доставка писем на внешнюю почту
# Порт 25 — стандартный SMTP relay между серверами (VPS)
mailserver.relay.enabled=true
mailserver.relay.port=25
mailserver.relay.starttls=false
mailserver.relay.auth-enabled=false
mailserver.relay.username=
mailserver.relay.password=
logging.level.com.mailserver=INFO
@@ -0,0 +1,54 @@
spring.application.name=mail-server
server.port=8080
# R2DBC — реактивный доступ к PostgreSQL
spring.r2dbc.url=r2dbc:postgresql://localhost:5432/mailserver
spring.r2dbc.username=mail
spring.r2dbc.password=secret
# Flyway — миграции базы данных
spring.flyway.enabled=true
spring.flyway.url=jdbc:postgresql://localhost:5432/mailserver
spring.flyway.user=mail
spring.flyway.password=secret
spring.flyway.locations=classpath:db/migration
spring.flyway.baseline-on-migrate=true
# Вложения
mailserver.attachments.dir=./attachments
spring.webflux.multipart.max-file-size=10MB
spring.webflux.multipart.max-request-size=10MB
# SMTP-сервер для приёма входящих писем
mailserver.smtp.port=3025
mailserver.smtp.hostname=localhost
# IMAP-сервер для доступа к письмам
mailserver.imap.enabled=false
mailserver.imap.port=1143
mailserver.imap.hostname=localhost
# DKIM — криптографическая подпись писем
mailserver.dkim.enabled=false
mailserver.dkim.domain=localhost
mailserver.dkim.keys-dir=./dkim-keys
# SPF — проверка отправителей через DNS
mailserver.spf.enabled=false
mailserver.spf.local-bypass=true
# DMARC — политика обработки писем, не прошедших SPF/DKIM
mailserver.dmarc.enabled=false
mailserver.dmarc.local-bypass=true
# SMTP релей — доставка писем на внешнюю почту
# Порт 587 — submission с STARTTLS (для отправки через SMTP-сервер)
mailserver.relay.enabled=true
mailserver.relay.port=587
mailserver.relay.starttls=true
mailserver.relay.auth-enabled=false
mailserver.relay.username=
mailserver.relay.password=
logging.level.com.mailserver=DEBUG
@@ -0,0 +1,73 @@
-- Таблица пользователей
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
display_name VARCHAR(255) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Таблица папок
CREATE TABLE folders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
name VARCHAR(50) NOT NULL,
type VARCHAR(20) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Таблица писем
CREATE TABLE messages (
id BIGSERIAL PRIMARY KEY,
folder_id BIGINT NOT NULL REFERENCES folders(id) ON DELETE CASCADE,
sender_email VARCHAR(255) NOT NULL,
sender_name VARCHAR(255),
recipient_email VARCHAR(255) NOT NULL,
subject VARCHAR(1000),
body TEXT,
is_read BOOLEAN NOT NULL DEFAULT FALSE,
is_spam BOOLEAN NOT NULL DEFAULT FALSE,
message_size BIGINT,
received_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Таблица вложений
CREATE TABLE attachments (
id BIGSERIAL PRIMARY KEY,
message_id BIGINT NOT NULL REFERENCES messages(id) ON DELETE CASCADE,
filename VARCHAR(255) NOT NULL,
content_type VARCHAR(255),
size_bytes BIGINT,
file_path VARCHAR(500) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Таблица чёрного списка
CREATE TABLE blacklist (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
sender_email VARCHAR(255) NOT NULL,
reason VARCHAR(255),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE (user_id, sender_email)
);
-- Таблица контактов
CREATE TABLE contacts (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE (user_id, email)
);
-- Индексы для ускорения поиска
CREATE INDEX idx_messages_folder_id ON messages(folder_id);
CREATE INDEX idx_messages_received_at ON messages(received_at DESC);
CREATE INDEX idx_messages_is_read ON messages(is_read);
CREATE INDEX idx_messages_is_spam ON messages(is_spam);
CREATE INDEX idx_folders_user_id ON folders(user_id);
CREATE INDEX idx_attachments_message_id ON attachments(message_id);
CREATE INDEX idx_blacklist_user_id ON blacklist(user_id);
CREATE INDEX idx_contacts_user_id ON contacts(user_id);