SSD Nodes Learn
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-07-24

Cara pasang mailcow di VPS agar Gmail terima

Uji port 25 sebelum pasang mailcow. Elakkan ralat 550 5.7.25 PTR daripada Gmail dengan tetapan DNS yang betul supaya e-mel tidak tersekat dalam queue.

Apa yang anda bina

Pelayan e-mel lengkap pada pelayan milik sendiri: SMTP untuk menghantar dan menerima, IMAP supaya telefon dan komputer riba anda sentiasa diselaraskan, klien webmail, dan penapis spam yang menilai setiap mesej dalam kedua-dua arah. mailcow-dockerized menggabungkan Postfix, Dovecot, Rspamd, SOGo webmail, MariaDB, Redis dan klien ACME ke dalam satu stack Docker Compose, jadi perisian bukanlah bahagian yang sukar. Anda akan dapat menjalankannya dalam masa setengah jam.

Bahagian yang sukar adalah segala perkara di sekelilingnya. E-mel adalah satu-satunya perkhidmatan di mana internet secara aktif tidak mempercayai pelayan yang baru didaftarkan, dan jurang antara "ia berfungsi" dengan "Gmail memadam setiap mesej secara senyap" bergantung kepada empat rekod DNS dan satu tetapan reputasi IP yang mungkin tidak anda kawal sepenuhnya. Baca prasyarat di bawah sebelum anda menyewa apa-apa. Jika, selepas membacanya, anda memutuskan bahawa proses membina reputasi ini tidak berbaloi, itu adalah jawapan yang sah — ringkasan kami tentang apa yang sebenarnya berbaloi untuk dihoskan sendiri pada 2026 menyenaraikan e-mel di bawah "hanya jika anda benar-benar mahu" atas sebab-sebab ini.

Prasyarat ADALAH projek tersebut

Gagal memenuhi salah satu syarat ini akan menyebabkan e-mel tidak sampai. Berikut adalah senarai mengikut kekerapan masalah berlaku:

Port outbound 25 mesti dibuka. Pelayan anda menghantar e-mel ke Gmail dan Microsoft melalui TCP port 25. Kebanyakan penyedia VPS dan cloud menyekat port 25 secara lalai untuk mengekang spam. Sekatan ini berlaku secara senyap — tiada ralat semasa boot, sistem kelihatan stabil, tetapi e-mel hanya tersangkut dalam barisan (queue) selamanya. Uji port ini sebelum anda memasang apa-apa. Jika disekat, satu-satunya cara adalah dengan menghantar tiket sokongan kepada penyedia anda untuk membukanya; sesetengah penyedia akan membukanya untuk akaun lama, manakala yang lain tidak akan melakukannya.

IP yang bersih dengan reputasi yang baik. IP VPS yang dikitar semula sering kali sudah berada dalam senarai hitam (blocklist) akibat spam daripada penyewa terdahulu. Semak IP anda melalui perkhidmatan seperti Spamhaus lookup atau mxtoolbox sebelum bermula. IP yang disenaraihitamkan akan menyebabkan e-mel ditolak dan masalah ini tidak boleh diselesaikan melalui kod.

Kawalan DNS serta rekod PTR yang betul. Anda perlu menambah rekod ke dalam zon domain anda, dan anda memerlukan reverse DNS (PTR) untuk IP pelayan yang merujuk kembali kepada hostname e-mel anda. PTR hampir tidak pernah ditetapkan dalam panel DNS anda — ia diuruskan oleh pemilik IP tersebut. Oleh itu, ia perlu ditetapkan melalui panel kawalan penyedia VPS anda atau melalui tiket sokongan.

6 GiB RAM dan 2 vCPU adalah tahap minimum yang selesa. Spesifikasi minimum mailcow untuk pemasangan peribadi adalah 6 GiB RAM ditambah 1 GiB swap, manakala 8 GiB disyorkan apabila terdapat beberapa pengguna. Di bawah 2.5 GiB, generate_config.sh menawarkan pilihan untuk mematikan pengimbas virus ClamAV supaya kernel tidak menghentikan container secara paksa. Sediakan 20 GB SSD untuk permulaan.

Nama DNS, bukan sekadar IP. Pilih hostname seperti mail.example.com. Nama tunggal tersebut akan menjadi MAILCOW_HOSTNAME anda, subjek sijil TLS anda, sasaran PTR anda, dan banner SMTP anda. Pastikan ia konsisten di mana-mana sahaja.

Langkah 1 — Buktikan port outbound 25 dibuka

Lakukan ini dahulu. Langkah lain akan sia-sia jika ini gagal. Dari VPS baharu, cuba mulakan perbualan SMTP dengan pelayan mel sebenar:

sudo apt update && sudo apt install -y netcat-openbsd
nc -vz -w 5 gmail-smtp-in.l.google.com 25

Keputusan yang berjaya adalah serta-merta:

Connection to gmail-smtp-in.l.google.com (142.250.x.x) 25 port [tcp/smtp] succeeded!

Port yang disekat akan tergantung selama lima saat, kemudian gagal:

nc: connect to gmail-smtp-in.l.google.com port 25 (tcp) timed out: Operation now in progress

Masa tamat (timeout) tersebut menandakan sekatan berlaku. Ia adalah penapis rangkaian di pihak penyedia, bukan firewall anda, jadi tiada perubahan tempatan yang boleh membaikinya. Buka tiket sokongan: "Please enable outbound TCP port 25 for my VPS at <IP>; I am running a legitimate mail server." Jangan pasang mailcow sehingga ini memulangkan status "succeeded". Perlu diingat bahawa port 25 inbound (pelayan lain menghubungi anda) adalah laluan berbeza dan biasanya dibuka — pihak penyedia biasanya menyekat bahagian outbound.

Langkah 2 — Tetapkan rekod DNS sekarang

Perubahan DNS mengambil masa untuk tersebar, jadi terbitkan semua maklumat yang boleh sebelum memulakan pemasangan. Andaikan domain anda ialah example.com, hos e-mel anda ialah mail.example.com, dan IP ialah 10.0.0.10. Dalam zon anda, cipta:

mail.example.com.        A      10.0.0.10
mail.example.com.        AAAA   2001:db8::10          ; only if you have IPv6
example.com.             MX  10 mail.example.com.
example.com.             TXT    "v=spf1 mx -all"
_dmarc.example.com.      TXT    "v=DMARC1; p=none; rua=mailto:postmaster@example.com"

Rekod SPF menyatakan "hanya MX saya boleh menghantar bagi domain ini, tolak yang lain". Mulakan DMARC pada p=none supaya anda boleh memantau laporan tanpa menolak e-mel anda sendiri; tukar kepada p=quarantine kemudian p=reject setelah penyelarasan terbukti. Dua rekod sengaja tidak disertakan: DKIM, yang dijana oleh mailcow untuk anda dalam Langkah 6, dan PTR, yang perlu anda tetapkan sekarang dalam panel pembekal anda.

Tetapkan PTR (reverse DNS) untuk 10.0.0.10 kepada mail.example.com — nilai tepat bagi MAILCOW_HOSTNAME. Ini adalah satu rekod yang sering dilupakan oleh ramai orang, dan pembekal besar akan menolak e-mel disebabkan perkara ini. Jika panel anda tidak mempunyai medan rDNS, buka tiket sokongan.

Langkah 3 — Pasang Docker

mailcow memerlukan Docker Engine dengan plugin Compose v2. Gunakan skrip kemudahan rasmi Docker berbanding pakej docker.io Ubuntu, kerana pakej tersebut tidak menyertakan plugin Compose:

curl -fsSL https://get.docker.com | sudo sh
sudo docker compose version

Anda sepatutnya melihat baris Docker Compose version v2.x. Jika docker compose version memaparkan docker: 'compose' is not a docker command, Docker Engine telah dipasang tetapi plugin Compose belum dipasang. Pasang plugin tersebut daripada repositori Docker — jalankan semula skrip di atas, atau rujuk panduan asas Docker Compose kami, yang memasang kedua-duanya daripada repositori apt Docker sendiri.

Langkah 4 — Klon mailcow dan jana konfigurasi

cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
umask
sudo ./generate_config.sh

Semak umask mencetak 0022 terlebih dahulu — mailcow gagal dibina jika topeng fail tidak sepadan, dan shell root Ubuntu 24.04 yang baharu sudah memberikan 0022. Skrip kemudian akan meminta satu perkara penting: hostname lengkap (fully qualified hostname). Masukkan mail.example.com — nilai tersebut mesti sepadan tepat dengan rekod A dan PTR anda. Skrip akan menulis mailcow.conf, iaitu satu-satunya fail persekitaran yang dibaca oleh keseluruhan stack. Buka fail ini jika anda perlu menukar port web (HTTP_PORT, HTTPS_PORT) atau melumpuhkan ClamAV pada mesin dengan spesifikasi rendah:

MAILCOW_HOSTNAME=mail.example.com
HTTP_PORT=80
HTTPS_PORT=443
SKIP_CLAMD=n          # set to y to drop the virus scanner on a <2.5 GiB box

SKIP_FTS=y adalah tetapan lain untuk mesin dengan RAM rendah: carian teks penuh (full-text search) adalah penggunaan memori kedua terbesar dalam dokumentasi mailcow, dan melangkau fungsi ini hanya akan menjejaskan carian teks badan e-mel dalam webmail.

Biarkan HTTP_PORT=80 dan HTTPS_PORT=443 kecuali jika terdapat perkhidmatan lain pada hos yang sudah menggunakan port tersebut — klien ACME terbina dalam mailcow memerlukan port 80 boleh dicapai dari internet untuk mendapatkan sijil. Ini sebabnya anda tidak perlu menjalankan tetapan nginx-plus-Certbot berasingan pada mesin yang sama; mailcow mengeluarkan dan memperbaharui TLS sendiri secara dalaman, dan perkhidmatan kedua yang menggunakan port 80/443 akan merosakkan proses tersebut.

Langkah 5 — Mulakan stack dan log masuk

sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps

Proses pull akan mengambil kira-kira dua puluh empat imej; tunggu selama beberapa minit. Apabila docker compose ps menunjukkan setiap container running (atau healthy), buka https://mail.example.com dalam pelayar web. Log masuk admin lalai ialah nama pengguna admin, kata laluan moohoo. Tukar kata laluan tersebut dengan segera dalam UI admin di bawah Access → Administrators. Jika pelayar memberikan amaran NET::ERR_CERT_AUTHORITY_INVALID, sijil ACME belum lagi dikeluarkan — rujuk kegagalan ACME di bawah sebelum menganggap ia rosak; sijil placeholder self-signed adalah normal untuk satu atau dua minit pertama.

Langkah 6 — Tambah domain, peti mel, dan terbitkan DKIM

Dalam UI admin, buka halaman Mail Setup (Configuration → Mail Setup), dan di bawah tab Domains klik Add domain dan masukkan example.com. Kemudian, di bawah Mailboxes, klik Add mailbox untuk mencipta you@example.com dengan kata laluan. Peti mel tersebut sudah boleh digunakan melalui IMAP.

Seterusnya adalah kunci DKIM. Pergi ke Configuration → ARC/DKIM keys; mailcow mungkin telah menjana kunci apabila anda menambah domain tersebut, jika tidak, jana kunci baharu di sana — pilih domain, kekalkan selector dkim, pilih 2048-bit, dan klik Add. Salin nilai TXT panjang yang dipaparkan dan terbitkan sebagai:

dkim._domainkey.example.com.  TXT  "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqh...long-key...QAB"

Halaman Domains mailcow mempunyai butang DNS yang menyenaraikan setiap rekod yang diperlukan dan menunjukkan tanda rait hijau atau pangkah merah bagi rekod yang telah diterbitkan. Gunakan ia sebagai senarai semak — pastikan setiap baris berwarna hijau sebelum menguji kebolehcapaian penghantaran. Baris DKIM berwarna merah selepas penerbitan biasanya bermaksud kunci telah dipecahkan ke dalam bahagian TXT secara salah; kunci 2048-bit adalah lebih panjang daripada had 255-aksara untuk satu rentetan TXT tunggal, jadi tampal ia sebagai satu nilai logik dan biarkan hos DNS anda memecahkannya kepada beberapa bahagian secara automatik.

Langkah 7 — Uji kebolehan penghantaran dan capai skor 10/10

Pergi ke mail-tester.com, salin alamat rawak yang dipaparkan, dan hantar mesej ke alamat tersebut daripada peti mel baharu anda — log masuk ke webmail SOGo di https://mail.example.com/SOGo dan hantar dari sana. Kemudian klik "Then check your score".

Sasarkan skor 10/10. Sebab-sebab pemotongan skor yang biasa:

  • SPF tidak selaras — rekod MX/SPF anda hilang atau IP penghantaran tidak disertakan. Semak semula SPF TXT.
  • Tandatangan DKIM tidak sahdkim._domainkey TXT hilang, masih dalam proses penyebaran (propagating), atau rosak. Ini adalah kesilapan yang paling kerap berlaku.
  • Tiada PTR / Ketidakpadanan PTR — DNS terbalik (reverse DNS) tidak menyelesai ke mail.example.com. Selesaikan di pihak penyedia perkhidmatan.
  • Terdaftar dalam senarai hitam (blocklist) — reputasi terdahulu IP anda. Mohon pembuangan senarai atau minta IP yang lebih bersih.

Jangan hantar e-mel sebenar ke Gmail atau Outlook sehingga skor mencapai 10/10. Skor rendah ditambah dengan IP baharu akan menyebabkan domain anda ditanda (flagged) pada hari pertama.

Langkah 8 — Sambungkan klien e-mel sebenar

Konfigurasikan Thunderbird, Apple Mail, atau telefon anda ke pelayan dengan tetapan ini. Hos pelayan bagi semua pilihan tersebut ialah mail.example.com:

  • IMAP: port 993, SSL/TLS (atau 143 dengan STARTTLS)
  • SMTP submission: port 465, SSL/TLS (atau 587 dengan STARTTLS)
  • Username: alamat penuh, you@example.com
  • Password: kata laluan peti mel yang anda tetapkan

Jangan sesekali menghantar e-mel klien melalui port 25 — port tersebut hanya untuk komunikasi antara pelayan. mailcow tidak menyediakan fungsi submission dengan pengesahan pada port tersebut, dan sambungan klien akan ditolak. Jika klien melaporkan Relay access denied, ia cuba menghantar melalui port 25 atau tanpa pengesahan; tukar tetapan kepada 465 atau 587 menggunakan kredensial peti mel anda.

Langkah 9 — Sandarkan data yang penting

mailcow menyediakan skrip sandaran yang mengambil snapshot bagi setiap volum stateful. Jalankan skrip ini ke cakera luaran atau pemacu jauh yang telah dimuatkan:

sudo MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups \
  ./helper-scripts/backup_and_restore.sh backup all

all merangkumi enam perkara, dan kehilangan mana-mana bahagian ini akan menyebabkan kehilangan data: vmail (peti mel sebenar), crypt (kunci untuk menyahsulit vmail — tidak berguna tanpanya), mysql (MariaDB yang menyimpan domain, pengguna, alias dan tetapan), redis (keadaan barisan dan cache), rspamd (data spam/ham yang dipelajari), dan postfix (barisan e-mel). Ia berjalan di dalam kontena pembantu yang menulis arkib mampat, jadi sandaran kekal konsisten walaupun stack sedang aktif. Automasikan ia dengan tugasan cron setiap malam, dan tambah --delete-days 14 untuk membuang set sandaran lama. Proses pemulihan menggunakan skrip yang sama dengan restore, yang menyenaraikan snapshot dan membolehkan anda memilih data untuk dipulihkan. Sandaran yang tidak pernah diuji pemulihannya hanyalah sekadar harapan, bukan sandaran — lakukan satu ujian percubaan pada VPS kosong.

Langkah 10 — Kemas kini mengikut jadual

mailcow dikemas kini melalui skripnya sendiri, yang memuat turun kod baharu, melakukan migrasi mailcow.conf, memuat turun imej terlebih dahulu, dan memulakan semula kontena mengikut urutan:

cd /opt/mailcow-dockerized
sudo ./update.sh --check   # reports whether an update exists, changes nothing
sudo ./update.sh           # applies it

Lakukan sandaran terlebih dahulu (Langkah 9), kerana migrasi skema sukar untuk dibatalkan. Kemas kini kerap dikeluarkan dan mengandungi pembetulan keselamatan untuk daemon yang terdedah ke internet, jadi jangan biarkan pelayan mel, dalam keadaan ketinggalan selama berbulan-bulan. Jika kemas kini menyebabkan kontena menjadi tidak sihat, sudo docker compose logs --tail=50 <service>-mailcow akan menamakan daemon yang gagal berfungsi semula.

Nota tentang pengukuhan

mailcow menjalankan perkhidmatan netfilter (netfilter-mailcow) sendiri yang menyekat IP yang melakukan serangan terhadap port mail dan webmail, jadi bahagian mail dilindungi secara lalai. Ini tidak merangkumi SSH pada hos itu sendiri, yang masih terdedah dan masih mengalami serangan brute-force — gunakan Fail2ban untuk memantau log auth SSH dan log masuk menggunakan kunci sahaja. Pastikan UI admin mailcow dilindungi dengan kata laluan yang kuat, dan jika boleh, letakkannya di luar internet awam atau di belakang VPN.

Mod kegagalan, dengan rentetan teks yang tepat

Gilir penghantaran e-mel (mail queues) dan tidak pernah dihantar. Jalankan sudo docker compose exec postfix-mailcow postqueue -p, atau semak gilir penghantaran e-mel pada UI admin; entri akan berada dalam status ditangguhkan (deferred) dengan:

status=deferred (connect to gmail-smtp-in.l.google.com[142.250.x.x]:25: Connection timed out)

Ini bermaksud port 25 keluar disekat oleh pembekal anda (Langkah 1). Konfigurasi tidak dapat membetulkannya — buka tiket sokongan. Ini bukan masalah DNS atau TLS; tandaannya ialah perkataan timed out terhadap MX jauh pada port 25.

Gmail menandakan semua sebagai spam, atau memulangkan e-mel (bounce). Buka mesej di Gmail, pilih "Show original", dan baca keputusan pengesahan (auth results). dkim=fail atau dkim=none bermaksud dkim._domainkey TXT anda hilang, rosak, atau belum tersebar (propagated) — terbitkan semula tepat seperti yang ditunjukkan pada halaman ARC/DKIM dan tunggu sehingga TTL tamat. spf=fail bermaksud rekod SPF/MX tidak merangkumi IP anda. Penyelarasan (alignment) adalah sangat penting; satu kegagalan semakan sudah cukup untuk menyebabkan e-mel masuk ke spam.

Ditolak oleh pembekal besar semasa sambungan. E-mel yang dipulangkan atau log Postfix mengandungi penolakan PTR Gmail:

550-5.7.25 [10.0.0.10] The IP address sending this message does not have a PTR
550-5.7.25 record setup, or the corresponding forward DNS entry does not match
550 5.7.25 the sending IP. As a policy, Gmail does not accept messages from IPs
550 5.7.25 with missing PTR records.

Kod 550 5.7.25 bermaksud DNS songsang (reverse DNS) hilang atau tidak sepadan. Tetapkan PTR untuk IP anda kepada mail.example.com pada pembekal anda (Langkah 2). Rekod A (forward) dan PTR (reverse) mesti sepadan, dan kedua-duanya mesti menggunakan nama hos yang sama seperti yang digunakan mailcow semasa menyapa pelayan lain.

Pelayar menunjukkan amaran sijil yang tidak hilang. Kontena acme-mailcow gagal mendapatkan sijil sebenar. Semak lognya:

sudo docker compose logs acme-mailcow | tail -n 40

Baris seperti Cannot validate any hostnames, skipping Let's Encrypt for 1 hour. atau kegagalan cabaran (challenge failure) bermaksud port 80 tidak boleh dicapai dari internet, atau rekod A tidak menghala ke pelayan ini. Sahkan mail.example.com menghala ke pelayan ini, buka port 80 dan 443 melalui mana-mana tembok api (firewall) hos, dan pastikan tiada perisian lain menggunakan port tersebut. Selepas membetulkan punca masalah, mulakan semula klien dengan sudo docker compose restart acme-mailcow daripada menunggu tempoh penangguhan selama satu jam.

FAQ

Adakah hos sendiri (self-hosting) e-mel berbaloi?

Jika anda mahukan pemilikan data, alias tanpa had, dan kawalan penuh, ya — mailcow menyediakan stack profesional pada harga sebuah VPS. Namun, kebolehlihatan (deliverability) adalah tugas berterusan: reputasi IP, penyelarasan DNS, dan pemantauan senarai sekatan (blocklist) tidak pernah berakhir. Untuk alamat perniagaan kritikal di mana satu hari di dalam folder spam akan merugikan anda, penyedia pengurusan adalah pilihan yang lebih praktikal. Hos sendiri jika anda mengutamakan kawalan berbanding kemudahan dan sanggup mengurusnya.

Bagaimanakah saya tahu jika port 25 outbound disekat?

Jalankan nc -vz -w 5 gmail-smtp-in.l.google.com 25 dari pelayan. "succeeded!" bermaksud port terbuka; timed out selepas jeda bermaksud penyedia anda menyekatnya. Ini adalah sebab paling utama mengapa pelayan hos sendiri boleh menerima e-mel tetapi tidak boleh menghantarnya, dan satu-satunya penyelesaian adalah penyedia anda membuka port tersebut — tiada tetapan tempatan yang boleh mengubahnya.

Mengapakah e-mel saya masih masuk ke folder spam Gmail?

Hampir sentiasa disebabkan oleh rantaian pengesahan yang rosak. Gunakan "Show original" di Gmail dan cari spf=pass, dkim=pass, dan dmarc=pass. dkim=fail menunjukkan rekod dkim._domainkey TXT yang hilang atau rosak; ketidakpadanan PTR atau IP baharu tanpa sejarah penghantaran juga menjejaskan prestasi. Dapatkan skor 10/10 di mail-tester.com terlebih dahulu, kemudian panaskan (warm up) IP secara perlahan-lahan — bermula dengan beberapa mesej sehari sehingga jumlah meningkat — berbanding menghantar volum besar pada hari pertama.

Apakah yang perlu saya sandarkan (backup)?

Jalankan backup_and_restore.sh backup all dan simpan keseluruhan set tersebut di luar pelayan. Ia merangkumi vmail (peti mel), crypt (kunci untuk menyahsulitnya), pangkalan data MariaDB (domain, pengguna, alias, tetapan), Redis, data pembelajaran Rspamd, dan barisan (queue) Postfix. Volume crypt adalah bahagian yang sering diabaikan — tanpa ia, sandaran vmail hanyalah teks tersulit yang tidak boleh dibaca. Uji proses pemulihan (restore) pada mesin kosong sekurang-kurangnya sekali.

Bolehkah saya menjalankan mailcow pada VPS 2 GB?

Tidak dengan selesa. generate_config.sh menawarkan untuk menyahaktifkan ClamAV jika penggunaan di bawah 2.5 GiB, namun Rspamd, ClamAV, Dovecot dan MariaDB tetap akan bersaing untuk memori, jadi anda akan mengalami swap dan OOM kills di bawah bebanan sebenar. Gunakan 6 GiB ditambah 1 GiB swap sebagai had minimum untuk pemasangan pengguna tunggal yang stabil, dan beralih ke 8 GiB sebaik sahaja lebih daripada dua orang menggunakannya.

#mailcow#email#self-hosting#docker#dns