[{"data":1,"prerenderedAt":174},["ShallowReactive",2],{"seo-verification":3,"blog-self-host-postal-smtp-platform-on-a-vps-ma-en":6,"promo-bar-likely":173},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-self-host-postal-smtp-platform-on-a-vps-ma-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":119,"ctaBody":120,"ctaButton":121,"ctaUrl":122,"relatedPosts":123},445,"self-host-postal-smtp-platform-on-a-vps",{"fr":12,"en":10,"ar":13,"es":14},"postal-smtp-platform-self-hosted-vps","postal-على-vps-منصة-smtp-مستضافة-للوكالات","postal-plataforma-smtp-autoalojada-para-agencias-en-vps","Postal: self-hosted SMTP platform for agencies","Deploy Postal on a VPS to manage transactional and marketing email across your client portfolio: web UI, queues, bounce tracking and per-server stats.",10,1,false,"2026-10-15T00:00:00+00:00","2026-11-08T01:13:15+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},11,"Business Email","emails","bg-cyan-500\u002F10 text-cyan-400",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fpostal-smtp-platform-self-hosted-vps-poster.svg","A client complains that order confirmation emails are disappearing, another sees their invoices landing in spam — and you have no logs to understand what happened. Postfix does its job silently, but that is precisely the problem: it is a blind relay, with no interface, no statistics, no bounce management. Postal changes the equation. It is a complete SMTP platform — multi-user web interface, REST API, bounce webhooks, per-server statistics — that you deploy on a single VPS to manage your entire agency client portfolio, without depending on Mailgun, Postmark or SendGrid.",[34,38,49,52,77,80,84,87,116],{"type":35,"title":36,"body":37},"h2","Why agencies need a proper SMTP platform","Running client email delivery with Postfix alone means flying blind. The MTA delivers or rejects, but it won't tell you why a bounce occurred, which campaign degraded a domain's reputation, or which client is consuming the most sending resources.\n\nFor an agency managing 10, 20 or 50 client domains, that opacity is a direct operational risk. A single misconfigured client can trigger a blacklisting of the shared IP and penalise the entire portfolio. And when the client calls to report a problem, you have nothing to show them.\n\nPostal solves this by adding a full control layer on top of the SMTP pipeline.",{"type":39,"title":40,"items":41},"ul","What Postal brings to your agency",[42,43,44,45,46,47,48],"**Multi-server web interface**: create an isolated sending server per client or per project, each with its own SMTP credentials and API key.","**Per-server statistics**: incoming and outgoing volume and bounces, graphed over 24 h, 48 h or 30 days — one server per client gives you a per-client view.","**Real-time bounce management**: every failed delivery is recorded and classified (`SoftFail` temporary, `HardFail` permanent), every incoming bounce is linked to the original message, viewable in the interface and dispatched via webhook to your application.","**REST API and webhooks**: integrate Postal with your CRM, e-commerce platform or invoicing tool — one sending endpoint, events in return.","**Message queues**: sends are queued and traceable through to delivery receipt or final error, with no black box.","**Client isolation**: each Postal server can be given its own IP pool (`use_ip_pools` option) and its own send limit — with separate IPs, one client in difficulty does not affect the others' reputation.","**MIT licence**: open source, no per-email cost, no third-party vendor dependency.",{"type":35,"title":50,"body":51},"Prerequisites: VPS, port 25 and dedicated IPv4","Postal v3.3.7 installs via Docker. The official prerequisites are:\n\n**Resources**: at least 2 vCPU and 4 GB of RAM. The documentation strongly recommends a server dedicated to Postal, running no other software. Allow at least 25 GB of SSD storage — message logs can grow quickly depending on your configured retention period.\n\n**Operating system**: any distribution that runs Docker Engine and the Docker Compose plugin (this guide uses Ubuntu 24.04 LTS), plus `git`, `curl` and `jq`.\n\n**Database**: MariaDB 10.6 or higher — the 10.6 branch has been out of community maintenance since July 2026, so aim for 10.11 or newer. MySQL is explicitly not supported. The `innodb_log_file_size` parameter must be set to at least 10 times the maximum message size.\n\n**Port 25**: the critical point. Outbound port 25 must be open for Postal to deliver messages to recipient servers. Many cloud providers block it by default — confirm your VPS has a dedicated IPv4 and that port 25 is unblocked before starting installation.\n\n**rDNS**: the reverse DNS of your IPv4 must point to your Postal hostname (e.g. `postal.your-agency.com`). A missing or incorrect PTR gets your messages rejected: since February 2024 Gmail has required a valid PTR for every sending IP.",{"type":53,"title":54,"steps":55},"steps","Installing Postal on a VPS",[56,59,62,65,68,71,74],{"title":57,"body":58},"Prepare the server and install Docker","Log in as root on your Ubuntu 24.04 VPS, update packages, then install Docker Engine and the Compose plugin:\n\n```bash\napt update && apt upgrade -y\ncurl -fsSL https:\u002F\u002Fget.docker.com | sh\napt install -y git curl jq\ndocker --version && docker compose version\n```\n\nVerify that outbound port 25 is open: `nc -zv smtp.gmail.com 25`. If the connection fails, contact your hosting provider to unblock it.",{"title":60,"body":61},"Configure DNS for your Postal server","Before bootstrapping, create DNS records for your Postal installation domain (e.g. `postal.your-agency.com`):\n\n- **A record**: `postal.your-agency.com` → VPS IP\n- **rDNS** (PTR): configure this in your control panel so your IP resolves back to `postal.your-agency.com`\n- **Global SPF** (TXT at `spf.postal.your-agency.com`): `v=spf1 ip4:\u003CVPS_IP> ~all`\n- **Return path**: `rp.postal.your-agency.com` with an A record to the IP, an MX `10 postal.your-agency.com`, a TXT `v=spf1 a mx include:spf.postal.your-agency.com ~all` and, after bootstrap, the DKIM record printed by `postal default-dkim-record` at `postal._domainkey.rp.postal.your-agency.com`\n\nWait for DNS propagation (15 to 30 minutes) before proceeding.",{"title":63,"body":64},"Bootstrap the Postal configuration","Clone the official installation repository, which provides the `postal` command, then generate the configuration:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fpostalserver\u002Finstall \u002Fopt\u002Fpostal\u002Finstall\nln -s \u002Fopt\u002Fpostal\u002Finstall\u002Fbin\u002Fpostal \u002Fusr\u002Fbin\u002Fpostal\npostal bootstrap postal.your-agency.com\n```\n\nThis generates `postal.yml`, `signing.key` and a `Caddyfile` in `\u002Fopt\u002Fpostal\u002Fconfig`, plus a `docker-compose.yml` (in `\u002Fopt\u002Fpostal\u002Finstall`) pinned to the latest release. Open `postal.yml` and fill in the MariaDB credentials, notification SMTP and the DNS names of your installation (`dns` section).",{"title":66,"body":67},"Start MariaDB and initialise the database","Launch a dedicated MariaDB container, reachable only locally and protected by a generated password, then initialise the Postal schema:\n\n```bash\nopenssl rand -hex 24 > \u002Froot\u002Fpostal-db.pass && chmod 600 \u002Froot\u002Fpostal-db.pass\ndocker run -d --name postal-mariadb \\\n  -p 127.0.0.1:3306:3306 \\\n  -e MARIADB_ROOT_PASSWORD=\"$(cat \u002Froot\u002Fpostal-db.pass)\" \\\n  -e MARIADB_DATABASE=postal \\\n  --restart always mariadb:10.11\n\npostal initialize\n```\n\nCopy this password into the `main_db` and `message_db` sections of `postal.yml` before running `postal initialize`.",{"title":69,"body":70},"Create the first admin user","Create your administrator account to access the web interface:\n\n```bash\npostal make-user\n```\n\nEnter the email address, name and password for the administrator.",{"title":72,"body":73},"Start Postal and configure the reverse proxy","Launch all Postal services (web, workers, SMTP):\n\n```bash\npostal start\npostal status\n```\n\nPostal exposes the web interface on `127.0.0.1:5000`, unreachable from the Internet. Place a reverse proxy (Caddy or nginx) in front to terminate TLS, then access `https:\u002F\u002Fpostal.your-agency.com`.",{"title":75,"body":76},"Create an organisation and first sending server","In the Postal interface, create an **organisation** (your agency), then a **sending server** for your first client. Each server has its own SMTP credentials, its own API key and its own sending domains — it is the client isolation unit.\n\nNote the **SMTP hostname**, **port** (25 by default, configurable via `smtp_server.default_port`) and the generated **credentials**: these are the settings to hand to the client application or configure in its sending panel.",{"type":35,"title":78,"body":79},"Configuring a sending domain","In each Postal sending server, add the domains from which your clients will send email. For each domain, Postal automatically generates a 1024-bit RSA key pair and a unique DKIM selector (format `postal-XXXXXX._domainkey`).\n\nDNS records to publish for each client domain:\n\n**SPF** — add `include:spf.postal.your-agency.com` in the apex TXT record:\n```\nv=spf1 include:spf.postal.your-agency.com ~all\n```\n\n**DKIM** — publish the TXT value shown in the interface at the generated subdomain:\n```\npostal-XXXXXX._domainkey.client-domain.com  TXT  \"v=DKIM1; t=s; h=sha256; p=\u003Cpublic key>\"\n```\n\n**Return Path** (recommended) — a CNAME that receives bounces and aligns SPF for DMARC:\n```\npsrp.client-domain.com  CNAME  rp.postal.your-agency.com\n```\n\nPostal checks these records automatically every hour and flags any missing or incorrect record in the interface. The **Check my records are correct** button triggers an immediate manual check.",{"type":81,"title":82,"body":83},"tip","DMARC: the final piece of deliverability","With SPF and DKIM in place, add a DMARC policy on each client domain to tell receivers how to handle alignment failures. Start in monitoring mode (`p=none`) to collect reports without risk of blocking, then progressively harden to `p=quarantine` and `p=reject`:\n\n```\n_dmarc.client-domain.com  TXT  \"v=DMARC1; p=none; rua=mailto:dmarc-reports@your-agency.com; fo=1\"\n```\n\nThe `rua` attribute sends daily aggregate reports to your address — you will see which sources send on your behalf, legitimate or otherwise. Postal signs each message with the domain's DKIM key once its record is validated, and the `psrp` return path aligns SPF: on correctly configured domains, DMARC will pass from day one.",{"type":35,"title":85,"body":86},"Bounce management and statistics","This is the most visible difference between Postal and a bare Postfix relay. In the **Messages** tab of each sending server, every sent email is tracked with its status: `Pending`, `Sent`, `Held`, `SoftFail`, `HardFail`, `Bounced`.\n\nWhen a delivery fails or a bounce comes back, Postal:\n1. Records the exact rejection reason in the message log (e.g. `550 5.1.1 The email account does not exist`)\n2. Updates the delivery status in the interface (`HardFail` if the recipient server refuses during the SMTP session, `Bounced` if a bounce message arrives later)\n3. Fires a webhook event (`MessageDeliveryFailed` or `MessageBounced`) to your configured HTTP endpoint\n\nSchematically, a failed delivery reads like this (simplified example):\n```\n[2026-10-15 09:14:22] Delivery attempt to mx1.example.com (203.0.113.10:25)\n[2026-10-15 09:14:22] \u003C\u003C 550 5.1.1 \u003Ccontact@client-domain.com> User unknown\n[2026-10-15 09:14:22] Message marked as HardFail (permanent)\n```\n\n**Per-server statistics** show incoming volume, outgoing volume and bounces over 24 h, 48 h or 30 days. These data let you detect a deliverability issue before the client notices it themselves.",{"type":88,"title":89,"headers":90,"rows":95},"comparison","Postal vs SaaS solutions vs Postfix relay",[91,92,93,94],"Criterion","Postal (self-hosted)","Mailgun \u002F Postmark","SMTP relay Postfix",[96,101,106,111],[97,98,99,100],"Visibility","Full interface: per-message log, bounce log, per-server statistics","SaaS dashboard, log retention depends on the plan","No interface — system logs only",[102,103,104,105],"Cost","VPS + administration time (no per-email cost)","Billing based on sending volume (see each provider's pricing)","VPS only (no software cost)",[107,108,109,110],"Control","Total: IP, retention, bounce policy, per-client isolation","Partial: policies imposed by provider, shared IPs by default","Full routing control, zero visibility",[112,113,114,115],"Send limit","Limited by VPS resources and IP reputation — scalable","Quotas per plan, scale-up billed","Limited by VPS — no native per-domain quota management",{"type":35,"title":117,"body":118},"An email infrastructure you control","Postal is the tool agencies look for when they realise Postfix alone is no longer enough to operate a client portfolio. The platform brings the visibility that was missing — structured logs, tracked bounces, per-server statistics — without the pricing constraints and vendor dependencies of SaaS alternatives.\n\nA VPS with 2 vCPU, 4 GB of RAM and a dedicated IPv4 is sufficient to get started. Unblocked port 25 and a correctly configured rDNS are the two prerequisites that many providers do not fulfil by default — check them before ordering.\n\nThe articles \u003Ca href=\"\u002Fen\u002Fblog\u002Fpostfix-smtp-relay-on-vps-client-transactional-emails\">Postfix SMTP relay on VPS\u003C\u002Fa> and \u003Ca href=\"\u002Fen\u002Fblog\u002Femail-deliverability-on-vps-port-25-cold-ip-and-ptr\">VPS email deliverability: port 25 and PTR\u003C\u002Fa> complete this guide to cover deliverability as a whole.","A VPS for your SMTP platform","Postal requires at least 2 vCPU and 4 GB of RAM. Our VPS plans include a dedicated IPv4, root access, configurable rDNS and port 25 unblocked on request — the exact prerequisites for a production Postal installation.","Manage your clients' email","\u002Fsolutions\u002Fagences",[124,140,157],{"id":125,"slug":126,"slugs":127,"title":131,"excerpt":132,"readTime":133,"views":18,"isPinned":19,"noindex":19,"publishedAt":134,"updatedAt":135,"category":136,"categories":137,"featuredImage":29,"bgImage":30,"posterImage":139,"relatedSolution":29},280,"postfix-smtp-relay-on-vps-client-transactional-emails",{"fr":128,"en":126,"ar":129,"es":130},"smtp-relay-vps-emails-transactionnels-clients","إعداد-postfix-smtp-relay-على-vps-لبريد-المواقع","relay-smtp-postfix-en-vps-emails-transaccionales","Postfix SMTP Relay on VPS: Client Transactional Emails","Set up Postfix as an SMTP relay on a ServOrbit VPS: dedicated IPv4, SPF, DKIM and DMARC aligned for your entire cPanel client portfolio in under an hour.",8,"2026-08-18T00:00:00+00:00","2026-11-09T20:55:12+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[138],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fsmtp-relay-vps-emails-transactionnels-clients-poster.svg",{"id":141,"slug":142,"slugs":143,"title":147,"excerpt":148,"readTime":149,"views":150,"isPinned":19,"noindex":19,"publishedAt":151,"updatedAt":152,"category":153,"categories":154,"featuredImage":29,"bgImage":30,"posterImage":156,"relatedSolution":29},238,"hosting-your-own-email-server-on-a-vps-with-mailcow",{"fr":144,"en":142,"ar":145,"es":146},"heberger-serveur-email-vps-mailcow","استضافة-خادم-البريد-الإلكتروني-على-vps-باستخدام-mailcow","alojar-servidor-correo-vps-mailcow","Hosting Your Own Email Server on a VPS with Mailcow","Deploy Mailcow on a Linux VPS to run your own sovereign email server: installation, deliverability and migration from Google Workspace.",20,3,"2026-08-08T00:00:00+00:00","2026-10-29T03:10:23+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[155],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fheberger-serveur-email-vps-mailcow-poster.svg",{"id":158,"slug":159,"slugs":160,"title":164,"excerpt":165,"readTime":166,"views":18,"isPinned":19,"noindex":19,"publishedAt":167,"updatedAt":168,"category":169,"categories":170,"featuredImage":29,"bgImage":30,"posterImage":172,"relatedSolution":29},331,"email-deliverability-on-vps-port-25-cold-ip-and-ptr",{"fr":161,"en":159,"ar":162,"es":163},"email-deliverabilite-vps-port-25-dkim-ptr","تسليم-البريد-الإلكتروني-على-vps-المنفذ-25-وـ-ptr","entregabilidad-de-email-en-vps-puerto-25-ip-fria-y-ptr","Email deliverability on VPS: port 25, cold IP and PTR","Port 25 blocked by the provider, fresh IP flagged as spam, missing PTR: the three structural blockers to resolve before your first send from a VPS.",9,"2026-09-05T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[171],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Femail-deliverabilite-vps-port-25-dkim-ptr-poster.svg",true,1794270492751]