Postfix — konfiguracja serwera SMTP na VPS
Opublikowano: 9 kwietnia 2026 · Kategoria: VPS / Email
Postfix to najpopularniejszy MTA (Mail Transfer Agent) dla systemów Linux — szybki, bezpieczny i dobrze udokumentowany. Konfiguracja własnego serwera SMTP na VPS daje pełną kontrolę nad dostarczalnością i nagłówkami emaili, choć wymaga kilku kroków: TLS, DKIM i właściwej konfiguracji DNS. Oto kompletny przewodnik od zera.
Własny Postfix vs relay service — kiedy co wybrać?
| Cecha | Własny Postfix | Relay service (SendGrid/SES) |
|---|---|---|
| Koszt | Darmowy (tylko VPS) | $0.10/1000 (SES) lub $15+/mies (SendGrid) |
| Dostarczalność | Zależy od reputacji IP | Wysoka (dedykowane IP z dobrą reputacją) |
| Konfiguracja | Wymagana (TLS, DKIM, SPF) | Minimalna (DNS + API key) |
| Bounce/unsubscribe | Własna implementacja | Wbudowany (webhook) |
| Kiedy używać | Transakcyjne emaile, duże wolumeny, legacy | Marketing, wysoka dostarczalność bez konfiguracji |
Instalacja Postfix (Ubuntu/Debian)
# Instalacja Postfix i narzędzi sudo apt update sudo apt install postfix mailutils swaks -y # Podczas instalacji wybierz: "Internet Site" # System mail name: twojadomena.pl # Sprawdź status sudo systemctl status postfix # Wyślij testowy email (lokalnie) echo "Test Postfix" | mail -s "Test" root@localhost
Konfiguracja main.cf
Główny plik konfiguracji Postfixa to /etc/postfix/main.cf. Poniżej kluczowe
dyrektywy dla typowego serwera VPS:
# /etc/postfix/main.cf
# --- IDENTYFIKACJA SERWERA ---
myhostname = mail.twojadomena.pl # FQDN serwera (musi być w DNS jako A record)
mydomain = twojadomena.pl
myorigin = $mydomain
# --- SIEĆ ---
inet_interfaces = all # Nasłuchuj na wszystkich interfejsach
inet_protocols = ipv4 # lub "all" dla IPv4+IPv6
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
# --- RELAY ---
# mynetworks — kto może wysyłać bez auth (localhost i sieci prywatne)
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
# relayhost — jeśli chcesz użyć smarthost (SES jako relay)
# relayhost = [email-smtp.eu-west-1.amazonaws.com]:587
# --- ROZMIAR ---
message_size_limit = 52428800 # Maks. rozmiar wiadomości: 50 MB
mailbox_size_limit = 0 # Bez limitu skrzynki (jeśli lokalna)
# --- TLS ---
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.twojadomena.pl/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.twojadomena.pl/privkey.pem
smtpd_use_tls = yes
smtpd_tls_security_level = may # Akceptuj TLS jeśli klient obsługuje
smtp_tls_security_level = may # Używaj TLS przy wysyłaniu jeśli możliwe
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# --- POLITYKA ANTYSPAMOWA ---
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination
# --- ALIAS ---
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases # Zastosuj konfigurację sudo postfix check # Sprawdź błędy składni sudo systemctl reload postfix
Certyfikat TLS (Let's Encrypt)
# Instalacja certbota i certyfikatu dla subdomeny mail.* sudo apt install certbot -y sudo certbot certonly --standalone -d mail.twojadomena.pl # Certyfikat w /etc/letsencrypt/live/mail.twojadomena.pl/ # fullchain.pem — certyfikat + łańcuch CA # privkey.pem — klucz prywatny # Upewnij się że postfix może czytać klucz prywatny sudo adduser postfix ssl-cert # lub: sudo chmod 640 /etc/letsencrypt/live/mail.twojadomena.pl/privkey.pem sudo chown root:postfix /etc/letsencrypt/live/mail.twojadomena.pl/privkey.pem
OpenDKIM — podpisywanie emaili
DKIM (DomainKeys Identified Mail) dodaje kryptograficzny podpis do każdego emaila — serwery odbiorców mogą zweryfikować że wiadomość naprawdę pochodzi z Twojej domeny:
# Instalacja OpenDKIM
sudo apt install opendkim opendkim-tools -y
# Konfiguracja /etc/opendkim.conf
sudo tee /etc/opendkim.conf <<'DKIM_EOF'
AutoRestart Yes
AutoRestartRate 10/1h
Syslog yes
SyslogSuccess Yes
LogWhy Yes
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
Mode sv
PidFile /run/opendkim/opendkim.pid
SignatureAlgorithm rsa-sha256
UserID opendkim:opendkim
Socket inet:12301@localhost
DKIM_EOF
# Utwórz klucze DKIM
sudo mkdir -p /etc/opendkim/keys/twojadomena.pl
sudo opendkim-genkey \
-s mail \
-d twojadomena.pl \
-D /etc/opendkim/keys/twojadomena.pl/
sudo chown opendkim:opendkim /etc/opendkim/keys/twojadomena.pl/mail.private
# KeyTable i SigningTable
echo "mail._domainkey.twojadomena.pl twojadomena.pl:mail:/etc/opendkim/keys/twojadomena.pl/mail.private" | sudo tee /etc/opendkim/KeyTable
echo "@twojadomena.pl mail._domainkey.twojadomena.pl" | sudo tee /etc/opendkim/SigningTable
printf "127.0.0.1\nlocalhost\n.twojadomena.pl\n" | sudo tee /etc/opendkim/TrustedHosts # Pobierz wartość rekordu DNS TXT dla DKIM cat /etc/opendkim/keys/twojadomena.pl/mail.txt # Dodaj ten rekord DNS: mail._domainkey.twojadomena.pl TXT "v=DKIM1; k=rsa; p=..." # Podłącz OpenDKIM do Postfixa (main.cf) sudo postconf -e "milter_protocol = 2" sudo postconf -e "milter_default_action = accept" sudo postconf -e "smtpd_milters = inet:localhost:12301" sudo postconf -e "non_smtpd_milters = inet:localhost:12301" # Uruchom i załaduj sudo systemctl enable --now opendkim sudo systemctl reload postfix
Testowanie — swaks i telnet
# Wyślij testowy email przez swaks (najwygodniejsze narzędzie)
swaks \
--to [email protected] \
--from [email protected] \
--server localhost \
--port 25 \
--body "Test Postfix z DKIM" \
--h-Subject "Test SMTP"
# Podstawowy test przez telnet (SMTP dialog ręcznie)
telnet localhost 25
# EHLO twojadomena.pl
# MAIL FROM:<[email protected]>
# RCPT TO:<[email protected]>
# DATA
# Subject: Test
# .
# QUIT
# Sprawdź logi wysyłki
sudo tail -f /var/log/mail.log Zarządzanie kolejką Postfix
# Wyświetl kolejkę postqueue -p # lub: mailq # Wymuś ponowne wysłanie wszystkich wiadomości w kolejce postqueue -f # Wyświetl szczegóły konkretnej wiadomości (QUEUE_ID np. ABC123) postcat -q ABC123 # Usuń konkretną wiadomość z kolejki postsuper -d ABC123 # Usuń WSZYSTKIE wiadomości z kolejki (ostrożnie!) postsuper -d ALL # Usuń tylko deferred (tymczasowo odroczone) postsuper -d ALL deferred # Statystyki kolejki postqueue -p | tail -1