Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

To self-host phpList, provision a VPS with a PHP-capable web server and MySQL-compatible database, publish the required lists directory behind HTTPS, create a dedicated database, configure lists/config/config.php, initialize the application at /lists/admin, connect a reliable SMTP server, and disable test mode before sending to real subscribers. You also become responsible for server patching, backups, bounce processing, and deliverability.

What self-hosting phpList involves

phpList is open-source software released under the AGPLv3 license. A self-hosted installation runs on infrastructure that you administer rather than on a managed phpList service. The application needs four things from that infrastructure: a web server that can execute a compatible PHP release, a MySQL-compatible database, persistent storage for the application and its data, and a domain name or other reachable URL.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The exact PHP, database, and web-server compatibility depends on the phpList release you select. Check that release’s manual before provisioning the VPS; do not assume that a version that worked on an older server will work unchanged on a current PHP installation.

Choose the VPS before installing anything

Minimum platform components

Component What it must provide Decisions to make
Operating system A supported Linux image that you can patch and administer. Choose a distribution supported by your VPS provider and compatible with the PHP version required by your phpList release.
Web server HTTP and HTTPS service with PHP integration. Use the web server you can secure and maintain; confirm that required rewrite and directory-protection features are available.
PHP A release and extensions supported by the selected phpList version. Verify compatibility before installing. An upgrade of PHP can expose deprecated database modules or configuration directives.
Database MySQL or a compatible server, with a separate database and login for phpList. Use a dedicated database account with only the permissions the application needs.
Storage Space for application files, configuration, logs, queued messages, subscriber data, and backups. Allow headroom for growth and for temporary files during upgrades and exports.
Network access A stable public address or hostname, HTTPS termination, and administrative access such as SSH. Point a domain or subdomain at the VPS and decide how you will restrict administrative access.

Check email policy first

Many VPS providers restrict outbound mail on port 25 or require a support request before permitting it. For production, plan to use an external SMTP server unless you have a specific reason to operate your own mail transport. Confirm the relay’s authentication, TLS, sending limits, abuse policy, and geographic or regulatory requirements before committing to it.

Prepare DNS and HTTPS

Create the DNS record for the hostname that will serve phpList and wait for it to resolve to the VPS. Put the site behind a valid HTTPS certificate before exposing the administrator interface or collecting subscriber information. Redirect plain HTTP to HTTPS and make sure the certificate renewal process is automated or documented.

Provision and lock down the VPS

  1. Deploy the supported Linux image and create an administrative account that is not used for routine web-server work.
  2. Apply operating-system updates before installing phpList. Enable automatic security updates when they fit your maintenance policy.
  3. Install the web server, a compatible PHP runtime and required extensions, and a MySQL-compatible database server. Use the phpList release manual to confirm the supported versions and modules.
  4. Configure the virtual host for the phpList hostname, set the document root you will use for the application, and enable HTTPS.
  5. Configure the VPS firewall to expose only the services you actually need. Normally that means HTTPS, optionally HTTP for certificate redirects, and a restricted administration path for SSH or an equivalent management service. Do not leave database ports publicly reachable unless there is a documented, secured reason.
  6. Set the server time zone and time synchronization correctly. Consistent time is important for scheduled sends, logs, TLS validation, and audit trails.

Keep database and operating-system administration separate from the web-server account. The web process should not have broad write access to the whole filesystem, and it should not run with unnecessary privileges.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Download phpList and publish the files

The manual deployment sequence starts with downloading phpList, unzipping the archive, and uploading the lists directory to the web root. On a VPS, use SSH, SCP, a deployment system, or another authenticated transfer method instead of relying on an unauthenticated FTP workflow.

  1. Download the release archive from the official phpList distribution channel that corresponds to the version you intend to run.
  2. Verify the archive before extracting it if the project publishes a checksum or signature for that release.
  3. Unpack the archive in a staging location, then place the complete lists directory under the virtual host’s document root.
  4. Set ownership so the web-server account can read the application and write only to directories that phpList explicitly needs to write. Do not make the entire document root world-writable.
  5. Leave the project’s .htaccess files active when using Apache. They provide important directory protections; disabling them without replacing their rules can expose configuration or data files.

Record the release number and the filesystem location. You will need both when applying updates or diagnosing a PHP compatibility problem.

Create a dedicated database and account

Create a new database solely for this phpList installation, a separate database user, and a long unique password. Use the database server’s local administrative interface or a secured control panel; do not send the password through email or place it in shell history unnecessarily.

Write down the four values phpList will need:

  • Database host name. This may be localhost, 127.0.0.1, or a provider-specific hostname.
  • Database name.
  • Database user name.
  • Database password.

Grant the account the permissions required by the phpList schema and application. If your provider separates database and web servers, allow connections only from the web server’s private address and protect the database connection with the provider’s recommended TLS or network controls.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Configure lists/config/config.php

Open lists/config/config.php in a plain-text editor. Set the database host, database name, database user, and database password to the values created in the previous step. Use the host supplied by your provider; although localhost or 127.0.0.1 commonly works on a single VPS, neither is universal.

Check the file for accidental spaces, quotation changes, or invisible characters. The phpList manual notes that even stray spaces can cause a database connection failure. Keep the file readable by the application but inaccessible to untrusted users, and never commit it to a public source repository because it contains credentials.

Keep a protected copy of the original configuration outside the web root. That copy is useful when upgrading or rebuilding the VPS, but it must be stored with the same care as a database password.

Initialize the phpList database

Browser-based initialization

  1. Open the installation’s /lists/admin path over HTTPS.
  2. Select the option to initialize or create the database when phpList presents the setup screen.
  3. Complete the requested form fields and allow phpList to create its tables.
  4. Continue through the remaining setup screens and confirm that the administrator interface loads without database errors.

Use the administrator URL only during setup if possible, and restrict access by IP, VPN, an additional web-server password, or another control that fits your organization.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Command-line initialization

phpList documentation also describes command-line initialization for versions after 3.6.6. The command and arguments are version-specific, so use the procedure in the manual for the exact release you installed rather than copying a command from an unrelated version. Run it as the appropriate application or web-server user and verify the resulting schema before opening the admin interface.

Configure SMTP instead of relying on local mail

phpList can call PHP’s built-in mail() function, but an external SMTP server is often required or preferred for dependable production delivery. A relay gives you authenticated submission, encrypted transport, clearer rejection messages, and a reputation-management process that is separate from the VPS’s IP address.

Values to obtain from the SMTP provider

Setting Purpose
SMTP host The relay’s server name.
SMTP username The account or token used to authenticate.
SMTP password or token The secret paired with the username; store it as carefully as the database password.
Port The submission port. The phpList manual’s STARTTLS example uses 587.
TLS mode Use the provider’s required encryption mode. Standard STARTTLS is represented by tls in the documented example.
Envelope and From policy The addresses and domains the relay permits, including any required domain verification.

Enter the transport settings

In phpList’s mail configuration, set PHPMAILERHOST to the relay host, provide the SMTP credentials, set PHPMAILERPORT to the provider’s submission port, and set PHPMAILER_SECURE to tls when using STARTTLS as in the manual example. Match the relay’s authentication requirements exactly, including whether it expects a full email address as the username.

Do not casually copy examples that disable certificate peer or name verification. Turning off those checks weakens TLS authentication and should be considered only for a controlled, understood situation; the normal production configuration should validate the relay’s certificate.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Verify delivery with a small test

  1. Send a test message to an address you control on a different mail provider.
  2. Confirm that the message passes SPF, DKIM, and DMARC checks when those controls are configured for your sending domain.
  3. Inspect phpList’s send log and the SMTP provider’s event log for accepted, deferred, or rejected deliveries.
  4. Test an invalid recipient so you can confirm that bounces are reported and processed rather than silently accumulating.

Disable test mode before real sending

phpList enables test mode by default. In the configuration, change define("TEST",1) to define("TEST",0) before production sending. While test mode remains enabled, messages are not sent to subscribers and subscribers cannot complete confirmation because confirmation emails are not delivered.

Make this change only after SMTP testing is complete, then send a controlled campaign to internal addresses before importing or activating a large list. Keep a record of who approved the switch so an administrator does not accidentally re-enable or disable it during troubleshooting.

Secure the administrator interface and application

Security is part of the deployment, not a later cleanup task. Apply the protections recommended in phpList’s security guidance:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • Keep the supplied .htaccess protections active where Apache is used, and test that sensitive files cannot be downloaded.
  • Add a second password layer to the administrator directory or restrict it by network, VPN, or IP allowlist.
  • Change the initial phpList administrator password immediately. Use a unique password stored in an approved password manager.
  • Run the web-server account with least privilege. It should not have unnecessary shell access, database administration rights, or write permission across the application tree.
  • Ensure PHP’s register_globals setting is off where the runtime exposes it, as recommended by the project’s security documentation.
  • Restrict the firewall to necessary services and review the rules after every infrastructure change.
  • Protect configuration backups, database dumps, SMTP credentials, and subscriber exports with encryption and access controls.
  • Enable logging and keep enough history to investigate authentication events, failed sends, bounces, and configuration changes without retaining sensitive data longer than necessary.

Schedule queue processing and manage bounces

phpList queues messages and needs a repeatable sending workflow for newsletters and scheduled campaigns. Use phpList’s cron or command-line sending method rather than relying on an administrator to keep a browser tab open. The exact command and supported runtime can change between releases, so copy the procedure from the manual for your installed version and run it under the least-privileged account that can execute the application.

Start with a conservative batch size and interval. Watch CPU, memory, database load, SMTP responses, and the provider’s rate limits before increasing throughput. A queue that is technically fast enough can still harm deliverability if it triggers provider throttling or generates a high complaint rate.

Configure a return-path or bounce mailbox that your relay and domain support, then process bounces regularly. Remove or suppress repeatedly failing addresses, honor unsubscribe requests promptly, and investigate sudden increases in hard bounces or complaints. Deliverability is an ongoing operational responsibility when you self-host; installing phpList does not create a sending reputation for you.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Backups, updates, and recovery

What to back up

  • The phpList database, including subscriber, campaign, queue, and configuration data stored there.
  • The application files and any local customizations, especially lists/config/config.php.
  • Uploaded assets, templates, attachments, and logs that your retention policy requires.
  • Infrastructure definitions and DNS or certificate configuration needed to rebuild the service.

Keep at least one backup off the VPS, encrypt it, restrict access, and test a restore on a separate environment. A backup that has never been restored is only an assumption.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Update safely

  1. Read the release notes and compatibility requirements for the target phpList version, PHP runtime, database server, and extensions.
  2. Take a verified database and file backup.
  3. Pause scheduled sending so a queue is not modified while files or schema are being replaced.
  4. Stage the new release, preserve the configuration, and follow the version-specific upgrade instructions.
  5. Run any required database upgrade, then test login, list management, confirmation, SMTP delivery, unsubscribe handling, and bounce processing.
  6. Resume the scheduler only after those checks succeed, and monitor logs closely during the first production run.

Troubleshoot the common installation failures

Database connection errors

Recheck the host, database name, user, and password in lists/config/config.php. Confirm that the database account is allowed to connect from the web server and that the database service is running. Remove stray spaces or invisible characters in the configuration; the manual specifically warns that they can break a connection.

MySQL module errors on a newer PHP system

Older phpList configurations may reference the deprecated mysql.inc module. On newer PHP environments, the supported database module may be mysqli.inc. Follow the instructions for your phpList release and installed PHP version rather than enabling an obsolete extension.

HTTP 500 after enabling the site

Inspect the web-server error log first. A 500 response can result from an unsupported .htaccess directive, including php_value directives that the chosen server or PHP integration does not permit. The official troubleshooting guidance recommends removing or commenting out the problematic directive, then reloading the configuration and testing again. Do not permanently remove all directory protections without replacing them with equivalent server rules.

SMTP authentication or TLS failures

  • Verify the host, port, username, password or token, and encryption mode character for character.
  • Confirm that the VPS can reach the relay port and that the provider has authorized the sending address or domain.
  • Check the server clock; an incorrect clock can invalidate TLS certificates.
  • Read both phpList’s log and the relay’s event log to distinguish a connection failure from an authentication rejection or a policy block.
  • Do not solve certificate errors by globally disabling peer or hostname verification.

Subscribers cannot confirm

Check that test mode is disabled with define("TEST",0), that SMTP accepts messages, and that confirmation mail is not being rejected or quarantined. In test mode, phpList intentionally does not send confirmation messages to subscribers.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

REST API does not work

The documented REST API requirements include PHP 7 and, for Apache, working .htaccess support and mod_rewrite. Enabling the API also requires configuration changes and clearing the cache directory. Verify those prerequisites for the installed release, clear the cache after changing the settings, and protect API credentials as carefully as administrator credentials.

Self-hosted phpList or phpList Hosted?

The choice is primarily about operational responsibility, not whether the application can send a campaign.

Consideration Self-hosted on a VPS phpList Hosted
Server operations You provision and patch Linux, PHP, the web server, the database, certificates, firewall, backups, and monitoring. The managed service handles the underlying hosting operations described by the project.
Control and customization You control the filesystem, deployment schedule, integrations, network rules, and configuration, subject to your technical ability. You accept the service’s available settings and operating boundaries in exchange for less infrastructure work.
Email deliverability You choose and configure SMTP, manage bounces, protect sending reputation, and respond to blocks or throttling. The project overview presents the service as a way to avoid managing servers, blacklisting, bounces, and deliverability.
Cost model You pay for the VPS, backups, SMTP or mail service, monitoring, and your own maintenance time. You pay the managed-service fee instead of operating the complete stack yourself.
Best fit Teams that can maintain Linux, PHP, databases, backups, security updates, and email reputation. Teams that value reduced operations and accept a recurring service charge and the provider’s constraints.

Choose the VPS route only if someone is accountable for patching, restore tests, bounce handling, and deliverability metrics. If that responsibility would otherwise be neglected, the managed option is safer even when the VPS appears cheaper on paper.

Production readiness checklist

  • Selected phpList release compatibility has been checked against the installed PHP, database, and web server.
  • The hostname resolves correctly and HTTPS is valid and renewing.
  • The lists directory is deployed with least-privilege ownership and permissions.
  • A dedicated database and account are configured, and credentials are protected.
  • lists/config/config.php has the correct host, database name, user, and password.
  • The database has been initialized through /lists/admin or the documented command-line method for the installed release.
  • The administrator password and administrator-directory protection are in place.
  • SMTP authentication, TLS, test delivery, rejection handling, and bounce processing have been verified.
  • Test mode has been changed from define("TEST",1) to define("TEST",0).
  • Queue processing is scheduled with the version-appropriate cron or command-line workflow.
  • Firewall rules expose only necessary services, and database access is not unnecessarily public.
  • Backups cover the database, configuration, files, and rebuild information; a restore test has succeeded.
  • Logs, resource usage, bounces, complaints, and delivery rates have an owner and review schedule.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.