Craft CMS relies on outbound email for password resets, user activation, form submissions, and system notifications. When those messages silently vanish, the cause is rarely a bug in Craft itself. On a managed shared environment running LiteSpeed and CloudLinux, the failure almost always sits in one of three places: the wrong mail transport is selected, the sender address does not match an authenticated mailbox, or the messages are stacking up in the Craft queue and never being processed. Each of these is fully fixable from your cPanel or DirectAdmin account, the Craft control panel, and a small config edit — no root or SSH administrative access required.

Why Craft CMS email fails on shared hosting

Craft's default System Email settings often use the PHP mail() transport, which hands the message to the server's local sendmail binary. On a shared host this path is frequently rate-limited, unauthenticated, and prone to being flagged as spam because the envelope sender does not align with a real mailbox on your domain. Modern receiving servers at Gmail, Outlook, and Yahoo reject or quarantine mail that arrives without proper SPF alignment and DKIM signing, and the PHP mail() route rarely satisfies those checks cleanly.

The more reliable approach is to route Craft through authenticated SMTP using a mailbox you create inside cPanel or DirectAdmin. When Craft logs in to that mailbox and submits mail through the server's outbound relay, the message inherits the domain's SPF and DKIM records automatically, and it passes authentication because it originated from a real account. This is the single change that resolves the majority of "emails not arriving" tickets.

Before touching transport settings, confirm what is actually happening. In the Craft control panel, open Utilities → System Report and check the mailer configuration, then look at Utilities → Queue Manager to see whether jobs are queued, running, or failed. If jobs sit in the queue with an error, the problem is transport or authentication. If jobs never appear at all, the sending code path may be misconfigured or the email is being generated but discarded. Your account's error log — reachable through cPanel Errors or by viewing ~/public_html/error_log in File Manager — usually records the SMTP handshake failure with a specific reason such as authentication rejected or connection refused.

Create the mailbox and verify DNS alignment

Start by creating a dedicated sending mailbox. In cPanel Jupiter go to Email Accounts → Create, or in DirectAdmin Evolution open E-Mail Manager → E-Mail Accounts → Create Account. Use something purpose-built like no-reply@yourdomain.com with a strong password, and give it a small quota since it only sends. Record the password exactly — Craft will authenticate with it.

Next confirm the outbound hostname and ports. On Hostiso's LiteSpeed stack the SMTP host is your domain's mail server, typically mail.yourdomain.com or the server hostname shown in cPanel under Email Accounts → Connect Devices. Use port 465 with SSL/TLS, or port 587 with STARTTLS. Avoid port 25 for authenticated submission because it is commonly filtered on shared hosting.

DNS alignment is what keeps your mail out of the spam folder. In cPanel open Email Deliverability, or in DirectAdmin check DNS Management. Confirm three records exist and resolve:

  • SPF — a TXT record authorizing the host's mail server to send for your domain, usually similar to v=spf1 +a +mx +ip4:SERVER_IP ~all. The Email Deliverability tool generates the correct value automatically; use its repair button rather than writing it by hand.
  • DKIM — a public key TXT record that lets the server cryptographically sign outbound mail. cPanel's Email Deliverability page shows whether DKIM is valid and offers a one-click install if it is missing.
  • DMARC — an optional but recommended TXT record at _dmarc.yourdomain.com such as v=DMARC1; p=none; rua=mailto:postmaster@yourdomain.com to start in monitoring mode.

If your domain uses external nameservers (Cloudflare, a registrar's DNS), these records must be copied to that provider — the cPanel tool cannot edit DNS it does not control. This is the same care you would take when configuring records for any application; the ConcreteCMS environment configuration guide covers similar record-alignment thinking for shared accounts.

Configure SMTP transport and sender settings in Craft

With the mailbox and DNS ready, configure Craft. In the control panel navigate to Settings → Email. Set the System Email Address to the mailbox you created (no-reply@yourdomain.com) and the Sender Name to something recognizable. The sender address must match the authenticated mailbox — a mismatch here is the most common reason mail passes authentication but still lands in spam.

Under Transport Type choose SMTP and fill in the fields:

  • Host Name: mail.yourdomain.com
  • Port: 465
  • Use authentication: enabled
  • Username: no-reply@yourdomain.com
  • Password: the mailbox password
  • Encryption Method: SSL/TLS (or TLS if you selected port 587)

Storing the password in plain settings is workable, but keeping credentials in the environment is cleaner and survives content-migration exports. Craft reads environment variables, so you can add them to the .env file in your site root through File Manager, then reference them in config/general.php or directly in the email fields using the $VARIABLE syntax:

MAIL_HOST=mail.yourdomain.com
MAIL_PORT=465
MAIL_USERNAME=no-reply@yourdomain.com
MAIL_PASSWORD=your-mailbox-password
MAIL_ENCRYPTION=ssl

After saving, use the Test Email button on the Settings → Email page. A green success message confirms the SMTP handshake and authentication succeeded. If it fails, the on-screen error names the cause: authentication failures point to a wrong username or password, connection timeouts point to a wrong host or port, and certificate errors usually mean you selected the encryption method that does not match the port.

One environment note: Craft runs on PHP 8.x and needs the openssl extension for TLS connections. In cPanel Select PHP Version → Extensions (or DirectAdmin's PHP Selector) verify openssl is enabled. If your account uses a .user.ini for PHP tuning, ensure allow_url_fopen is not disabled, since some mailer paths depend on stream wrappers.

Queue handling, throttling, and delivery verification

Craft can send email synchronously or push it onto its job queue. By default many actions queue the message so the visitor is not held up waiting for the SMTP round trip. On shared hosting the queue runs when web requests trigger it, which means a low-traffic site may have emails waiting minutes or hours before a page load flushes the queue. If password resets feel delayed, this is why.

You have two dependable options. First, force critical mail to send immediately by ensuring the relevant actions bypass the queue where Craft allows it, and keep the queue for bulk notifications. Second, drive the queue on a schedule using cPanel Cron Jobs (or DirectAdmin Cron Jobs). Add a job that runs Craft's queue command every few minutes:

*/5 * * * * /usr/local/bin/php /home/USERNAME/public_html/craft queue/run

Replace USERNAME and the path with your account's real values, and confirm the PHP binary path from cPanel Select PHP Version. Running the queue on a cron every five minutes clears pending jobs predictably regardless of site traffic.

Watch your outbound volume. Shared hosting enforces hourly send limits to protect the server's reputation, so a large mailing from a contact form or newsletter can hit the ceiling and stall. Spread bulk sends out, and if you routinely send high volume, a dedicated transactional provider mailbox is the better fit. When messages still fail after all this, open the account error_log and Craft's Queue Manager together — the queue shows the failed job, and the log shows the SMTP server's exact rejection reason, which is usually enough to pinpoint whether the block is authentication, rate limiting, or a DNS alignment gap you still need to close.