Technical questions about MailWizz architecture, delivery server integration, bounce management, tracking configuration, and scaling for high-volume email deployments. Written for engineers and system administrators operating production MailWizz environments.
Technical questions about MailWizz's internal architecture, how it connects to SMTP relay layers, and configuration patterns for high-volume production deployments.
config.conf specifies the binding address and port, and the smtp-auth configuration within the listener block defines which authentication methods are accepted. MailWizz sends to PowerMTA via this authenticated listener, and PowerMTA handles the outbound delivery from the appropriate virtual-MTA pool. Multiple Delivery Servers in MailWizz can point to the same PowerMTA instance on different ports — enabling traffic type separation by having transactional campaigns use a Delivery Server on port 587 while bulk campaigns use a Delivery Server on port 2525, with PowerMTA routing each port to a different virtual-mta-pool.max_connections in MySQL/MariaDB should be set to at least 200–300 for MailWizz deployments processing millions of messages. The innodb_buffer_pool_size setting is the most impactful single MySQL parameter — it should be set to 70–80% of available RAM on a dedicated database server, or 40–50% on a combined application/database server. InnoDB is the required storage engine for MailWizz tables that use row-level locking during queue processing. Tables that grow large under high volume — particularly mw_campaign_delivery_log and mw_email_blacklist — require periodic archiving or partitioning to maintain query performance. The mw_email_blacklist table in particular should have a composite index on (email, status) to support the lookup queries performed for each recipient during queue processing.php -q /path/to/apps/console/console.php send-campaigns) dispatches campaign sends, and the queue workers process the actual message delivery. Queue worker concurrency is controlled by the campaigns.send.parallel application parameter in MailWizz's configuration (Backend → Settings → Campaigns), which determines how many campaigns can be processed in parallel. The campaigns.send.subscribers_chunk_size parameter controls how many subscriber records are loaded into memory per processing batch — increasing this value improves throughput but increases RAM consumption. For high-volume deployments, running MailWizz queue workers as a dedicated process manager (supervisord) rather than relying solely on cron provides more consistent throughput and allows worker restarts without cron interval dependency. The MailWizz campaign daemon (apps/console/console.php campaigns-queue) processes the internal queue and is the primary throughput bottleneck — dedicating sufficient PHP workers and ensuring MySQL query latency stays below 10ms for blacklist lookups is the principal optimization target.Questions about configuring MailWizz's tracking, bounce processing, suppression lists, and authentication settings to maintain high deliverability in production environments.
apps/common/data/email-bounce-patterns.php) can be extended with custom patterns for ISP-specific bounce messages not covered by the default set — essential for accurate classification of European ISP bounce formats that differ from North American conventions.List-Unsubscribe: <https://...>, <mailto:...> and List-Unsubscribe-Post: List-Unsubscribe=One-Click must be present. If only the mailto: form is present, or if List-Unsubscribe-Post is absent, the installation requires updating or manual header injection via a custom plugin or pre-send hook. The one-click endpoint must respond to HTTP POST requests with a 200 status code — MailWizz's unsubscribe handler supports this natively in compliant versions.mw_email_blacklist table) is checked for every recipient during queue processing before each message is dispatched. At scale — blacklists of several million entries are common in long-running deployments — this check becomes a significant source of database query latency if the table is not properly indexed. The primary index on the table should cover the email column with a hash or prefix index if using a VARCHAR with length above 191 characters (MySQL utf8mb4 index length limit). At lists exceeding five million entries, query latency for the blacklist check can exceed five milliseconds per lookup — which, multiplied across millions of recipients per campaign, becomes the primary throughput bottleneck in queue processing. Two mitigation approaches: (1) periodic archival of blacklist entries older than 24 months that have not been re-added (these rarely affect active campaigns but continue consuming index space), and (2) for very high volume environments, implementing a Redis-based blacklist cache layer in front of MySQL using a MailWizz extension, which reduces the per-lookup latency from 3–8ms to under 1ms for cached entries.track.yoursendingdomain.com) that is not used for any other purpose provides a clean reputation baseline. SSL/TLS is required for the tracking domain — Gmail in particular shows security warnings for HTTP-only tracking URLs in some contexts, which affects click rates and triggers additional content scrutiny. The tracking subdomain must have a valid TLS certificate, a working HTTPS server (Apache or Nginx), and the MailWizz tracking application deployed to the document root of that domain.Technical questions about scaling MailWizz beyond single-server deployments, managing multi-instance configurations, and operational procedures for production environments.
apps/common/runtime/ and apps/frontend/runtime/ directories must be accessible from both the web frontend servers and the queue worker servers simultaneously. This is addressed via NFS mount or a shared storage service. The MailWizz configuration (apps/common/config/main.php) must be identical across all application servers, with all servers pointing to the same database host. Queue workers should run only on designated worker servers — not on web frontend servers — to prevent queue processing from consuming resources needed for web response. The queue worker servers do not need to run a web server; they require only PHP-CLI, the MailWizz codebase, and access to the shared filesystem and database. Supervisord on each worker server manages the queue daemon processes, configured to restart on failure and maintain the desired number of concurrent worker processes.slow_query_log = ON, long_query_time = 0.1) configured to capture queries exceeding 100ms provides the initial visibility. In production, the most common early warning signs of database performance degradation affecting queue throughput are: queue processing throughput dropping below expected rates without a corresponding change in campaign volume (indicating database latency increase), PHP queue workers showing high wait times in SHOW PROCESSLIST output (indicating query queue buildup), and mw_campaign_delivery_log insert latency increasing (this table grows continuously and requires periodic archiving or partitioning — unarchived logs exceeding 50–100 million rows commonly cause this symptom). The InnoDB row lock wait timeout can be reached by concurrent queue workers competing for the same subscriber records — SHOW ENGINE INNODB STATUS reveals deadlock patterns that indicate this condition.php.ini for queue workers: memory_limit = 512M (queue workers that process large subscriber batches will exceed the default 128M limit — 256M minimum, 512M recommended for large deployments), max_execution_time = 0 (queue daemon processes run continuously — execution time limits must be disabled for CLI workers), pcre.recursion_limit = 100000 (MailWizz uses complex regex for email validation — default recursion limits can cause silent validation failures on some address formats). Required PHP extensions that are commonly absent in minimal PHP installations: php-imap (required for bounce server IMAP processing — the most commonly missing extension in fresh installations), php-curl (required for API integrations and tracking domain verification), php-gd (required for the template editor image handling), php-mbstring (required for multi-byte character handling in subscriber names and content), and php-redis (optional but strongly recommended for caching on high-volume deployments — MailWizz's Redis cache integration reduces database load significantly when configured). The php-imap extension absence is the most common cause of bounce server connection failures in MailWizz deployments.We design and operate managed infrastructure environments using PowerMTA and MailWizz for high-volume senders. Configuration, reputation management, and operational oversight — fully managed.