DMARC for Shared Hosting: Plesk, DirectAdmin, ISPConfig, Webmin, CWP, No-Control-Panel (Complete Setup Guide with SaaS-Relay CNAME-Delegated DKIM Escape Hatch)

The operator deployment guide for DMARC on shared-hosting tiers OTHER than cPanel - Plesk (the second-largest control panel, Postfix backend, default selector), DirectAdmin (Exim backend with a completely different management UI vs cPanel, single-character x selector), ISPConfig (Postfix + Dovecot, MSP-popular), Webmin / Virtualmin, CentOS Web Panel (CWP), AND the generic-no-control-panel population (the FTP + phpMyAdmin + webmail tier). Covers all five rollout phases per panel - verify or publish SPF, enable DKIM via the panel toggle (or via the SaaS-relay CNAME-delegated escape hatch when no panel exists), publish DMARC manually at p=none, inventory every legitimate sender, advance to p=quarantine then p=reject. Anchored against the Feb 2024 Google/Yahoo bulk-sender requirements and the operator-empowerment ceiling that defines shared-hosting DMARC deployment.

This deployment guide is provided in English. Plesk, DirectAdmin, ISPConfig, Webmin / Virtualmin, and CentOS Web Panel UI labels (Mail Settings > DKIM spam protection, Email Manager > DKIM, Email > Domain > DKIM, System Settings > Email Settings, Email Authentication) and DNS-record syntax (v=spf1, default._domainkey TXT, x._domainkey TXT, v=DMARC1; p=none; rua=mailto:) do not translate. We keep the body in the source language so technical terms remain consistent with the panel documentation and the underlying RFCs.

TL;DR

  • This guide covers Plesk, DirectAdmin, ISPConfig, Webmin / Virtualmin, CentOS Web Panel (CWP), and generic no-control-panel shared hosting. For cPanel specifically, see the DMARC for cPanel & Shared Hosting sibling page - cPanel has a different management UI and is the largest single shared-hosting ecosystem, justifying its own guide.
  • Plesk auto-configures Postfix outbound but does NOT auto-enable DKIM. Open Mail > Mail Settings > DKIM spam protection (or older Plesk: Tools and Settings > Mail Server Settings > DomainKeys) and enable DKIM. Default selector is default._domainkey (same as cPanel and ISPConfig). SPF is NOT auto-published - add v=spf1 +a +mx ~all manually via Plesk's DNS Settings.
  • DirectAdmin auto-configures Exim outbound and the DKIM toggle lives at Email Manager > DKIM. Default selector is x._domainkey (single-character "x" by historical convention - distinct from cPanel's default and Plesk's default). SPF auto-generated as v=spf1 a mx ~all at account creation.
  • ISPConfig exposes DKIM at Email > Domain > DKIM; the panel generates the key and prompts the operator to publish the TXT record. Default selector is default._domainkey.
  • Generic no-control-panel shared hosting has no self-service DKIM toggle. Three escape hatches: (1) open a support ticket asking the provider to enable DKIM signing; (2) route outbound mail through a SaaS transactional relay (SendGrid, Mailgun, Amazon SES, Postmark) with CNAME-delegated DKIM so alignment works via the relay's signing infrastructure; (3) migrate to a host with a deliverability-focused control panel. Option 2 is the most operator-empowering path because it works for any host.
  • Google's Feb 2024 bulk-sender requirements apply to shared- hosting senders too: SPF + DKIM alignment, DMARC at minimum p=none (bulk senders strongly encouraged at p=quarantine or stronger), RFC 8058 one-click List-Unsubscribe, and spam-complaint rate < 0.3% for any domain sending >5000 messages/day to gmail.com or yahoo.com.
  • DMARC rollout (universal regardless of panel): v=DMARC1; p=none; rua=mailto:dmarc-reports@your-domain.com first. Ingest reports for 2-6 weeks to inventory every sender. Advance to p=quarantine after every legitimate sender is aligned, then to p=reject. Never skip from p=none to p=reject.
  • The operator-empowerment ceiling is the defining shared-hosting constraint. The less featureful your panel, the more DMARC work depends on hosting-provider support or the SaaS-relay escape hatch. For bulk and marketing-scale sending, the recommended pattern is to bypass the host's outbound mail entirely and route through a dedicated transactional relay with reputation isolation.

1. What this guide covers

This is the operator-implementation walkthrough for deploying SPF, DKIM, and DMARC on a domain hosted on the shared-hosting tier other than cPanel. The cluster covers cPanel separately in DMARC for cPanel & Shared Hosting because cPanel is the largest single shared-hosting ecosystem and its UI is sufficiently distinctive to merit a dedicated guide. This page covers the remainder of the shared-hosting market:

  • Plesk - the second-largest shared-hosting control panel by market share, dominant in Europe and Russia. Default mail server: Postfix (Plesk Obsidian and newer) or Qmail (legacy Plesk versions on older RHEL-derived servers). DKIM toggle: Mail Settings > DKIM spam protection.
  • DirectAdmin - a popular cPanel alternative with a lighter UI and per-account focus. Default mail server: Exim (same as cPanel). DKIM toggle: Email Manager > DKIM.
  • ISPConfig - open-source Linux server control panel popular with managed-service-provider (MSP) and German-speaking-market hosts. Default mail server: Postfix + Dovecot. DKIM toggle: Email > Domain > DKIM.
  • Webmin / Virtualmin - the veteran Linux server control panel with deep configuration flexibility. Default mail server: Postfix on Virtualmin (Sendmail and Exim are configurable). DKIM toggle: Email Settings > DomainKeys Identified Mail (DKIM).
  • CentOS Web Panel (CWP) - free CentOS / RHEL control panel with an Exim mail backend. DKIM toggle: Email > Add new email account and the DKIM block in the per-domain configuration.
  • Generic shared hosting WITHOUT a deliverability-focused control panel - the entire population of hosts whose customers have NO self-service DKIM management: just FTP access, phpMyAdmin for databases, a webmail interface, and the hosting provider's support form. This is the LEAST operator-empowered tier and the page dedicates section 5b to the three escape hatches available.

The guide is structured as five sequential deployment steps (SPF → DKIM → DMARC at p=none → alignment fix-up → enforcement) that mirror the canonical DMARC rollout with panel-specific UI paths, syntax, and gotchas.

What this guide does not cover:

  • cPanel - covered in DMARC for cPanel & Shared Hosting.
  • Microsoft 365 and Google Workspace - covered in DMARC for Microsoft 365 and DMARC for Google Workspace respectively. These are mailbox-provider platforms, not shared-hosting tiers - the operator buys mailbox capacity and the platform handles outbound mail without operator infrastructure.
  • Reseller hosting configuration - reseller-tier access to Plesk / DirectAdmin / ISPConfig varies by hosting provider. Where reseller capabilities matter (e.g. multi-account DKIM rotation), the guide notes the feature without a comprehensive walkthrough.
  • Inbound spam filtering and anti-phishing at the shared- hosting server (SpamAssassin, Rspamd, Amavis) - separate from DMARC and out of scope for this guide.

2. Why DMARC matters now: Feb 2024 requirements + operator-empowerment ceiling

In February 2024 Google (jointly with Yahoo) introduced sender requirements that apply to any domain sending more than 5000 messages per day to gmail.com or yahoo.com combined - regardless of which hosting platform or control panel sends the mail. Shared-hosting senders that exceed the threshold are subject to the same enforcement as cPanel, Workspace, or M365 senders.

The five Feb 2024 requirements:

  1. SPF must pass and align with the visible From: header (RFC 7208).
  2. DKIM must pass and align with the visible From: header (RFC 6376).
  3. DMARC TXT record published with at minimum p=none - bulk senders strongly encouraged to advance to p=quarantine or p=reject.
  4. RFC 8058 one-click List-Unsubscribe on every commercial / marketing message.
  5. Spam complaint rate < 0.3% as measured at the receiver.

The operator-empowerment ceiling

Shared hosting has a structural constraint that distinguishes it from cPanel / Workspace / M365: operator empowerment varies drastically by control panel. The less featureful your panel, the more DMARC work depends on hosting-provider support intervention.

Hosting tier DKIM self-service? SPF self-service? DMARC self-service?
cPanel (with Email Deliverability) Yes (auto-generated) Yes (auto-generated) Manual via Zone Editor
Plesk Yes (toggle) Manual via DNS Settings Manual via DNS Settings
DirectAdmin Yes (toggle) Yes (auto-generated) Manual via DNS Management
ISPConfig Yes (toggle) Manual Manual
Webmin / Virtualmin Yes (toggle) Manual Manual
CWP (CentOS Web Panel) Yes (toggle) Manual Manual
Generic no-control-panel NO - support ticket required Manual via registrar DNS Manual via registrar DNS

Operators on the generic-no-control-panel tier are the most operator-disempowered population in the entire mailbox-provider spectrum. For this tier, the recommended path is the SaaS-relay escape hatch (section 5b): route outbound mail through a SaaS transactional relay (SendGrid, Mailgun, Amazon SES, Postmark) with CNAME-delegated DKIM so alignment works via the relay's signing infrastructure. This pattern works for ANY shared host because it bypasses the host's outbound mail entirely.

DMARC at p=quarantine or p=reject stops domain spoofing but does NOT compensate for shared-IP reputation - the same constraint that affects cPanel. Both layers must be addressed independently. Deploy DMARC for the spoofing layer regardless of volume; address deliverability separately by choosing the right outbound infrastructure for your volume.

3. Prerequisites

  • Control panel access for Plesk / DirectAdmin / ISPConfig / Webmin / Virtualmin / CWP. Most hosting providers expose the panel at https://<your-domain>:8443 (Plesk default), at a vendor URL like https://<your-domain>:2222 (DirectAdmin default), or via the hosting provider's portal. You need the per- account login.
  • OR support-ticket lever if you have NO control panel access. Verify the hosting provider supports DKIM at all before deploying - some bargain-tier hosts ship without DKIM signing infrastructure and will require a support escalation or a migration to a different host.
  • OR a SaaS-relay account (SendGrid, Mailgun, Amazon SES, Postmark, SparkPost) if you plan to bypass the host's outbound mail entirely. Most have free tiers up to 100-1000 messages/day (Mailgun: 1000/month free, SendGrid: 100/ day free, Amazon SES: paid but very inexpensive at scale).
  • DNS edit access for the primary domain. Shared-hosting panels may manage DNS at the panel server (Plesk DNS Settings, DirectAdmin DNS Management), at the hosting provider's portal, or at an external registrar. Identify where your DNS lives BEFORE attempting to publish records - the panel UI may appear to publish a record but actually only write to the panel-server zone file, which is not consulted by public resolvers if your authoritative DNS is elsewhere.
  • A monitored mailbox on the domain (or a third-party DMARC report ingestion service such as DMARC Analyzer). Reports arrive as gzip-compressed XML attachments - a typical setup uses a dedicated address like dmarc-reports@your-domain.com.
  • Inventory of every legitimate sender for the domain. The host's mail (via Plesk / DirectAdmin / ISPConfig) is the obvious source, but most small businesses also have a marketing platform (Mailchimp), a transactional relay (SendGrid / Mailgun), a contact-form mailer, ecommerce platform email (WooCommerce / Shopify with custom domain), and potentially a self-hosted WordPress plugin that bypasses the host's outbound mail.

4. Step 1: Verify or publish SPF

SPF auto-generation varies by panel:

  • Plesk does NOT auto-publish SPF. Add a TXT record at the domain apex manually:
    your-domain.com.   IN TXT  "v=spf1 +a +mx include:<hosting-provider-spf-host> ~all"
    via Plesk's Websites & Domains > DNS Settings (or your registrar's DNS panel if DNS is external). The include: depends on the hosting provider - check the provider's documentation.
  • DirectAdmin auto-generates SPF at account creation. Default value: v=spf1 a mx ~all. Verify via Account Manager > DNS Management. Add provider-specific include: directives if your host requires them.
  • ISPConfig, Webmin / Virtualmin, CWP do NOT auto-publish SPF. Add the TXT record manually via the panel's DNS-management interface or your registrar's DNS panel.
  • Generic no-control-panel: publish SPF via your registrar's DNS panel. The include: depends on whether you send through the host or a SaaS relay - for a relay-only flow, use v=spf1 include:<relay-spf-host> -all with the host's outbound completely excluded.

Typical SPF record patterns:

# Plesk-style (host-only outbound)
your-domain.com.   IN TXT  "v=spf1 +a +mx ~all"

# DirectAdmin-style with SaaS relay added
your-domain.com.   IN TXT  "v=spf1 a mx include:sendgrid.net ~all"

# SaaS-relay-only flow (no host outbound at all)
your-domain.com.   IN TXT  "v=spf1 include:mailgun.org -all"

Verify with dig +short txt your-domain.com after publication, or via the Domain Security Checker. If you also send via third-party providers (SendGrid, Mailgun, Mailchimp), add each provider's include: in the same record (RFC 7208 §3.2 mandates a single SPF record per domain). Stay under the 10-DNS-lookup limit (RFC 7208 §4.6.4).

Harden the qualifier from ~all (soft-fail) to -all (hard-fail) once your DMARC reports show clean SPF passes for every legitimate sender. Hard fail is the production recommendation.

5. Step 2: Verify or publish DKIM

DKIM activation walkthroughs vary per panel. Each section below is independently usable.

5a. Plesk: Mail Settings > DKIM spam protection

  1. Sign in to Plesk. Select your subscription / domain.
  2. Navigate to Mail > Mail Settings (Plesk Obsidian) or Tools and Settings > Mail Server Settings (older Plesk).
  3. Find the DKIM spam protection section. Two checkboxes: Use DKIM spam protection system to sign outgoing email messages and Use DKIM spam protection system to check incoming email messages. Enable the OUTGOING checkbox.
  4. Click OK. Plesk generates a 1024-bit (legacy) or 2048-bit (modern) RSA key and publishes the public key at default._domainkey.<your-domain> as a TXT record in Plesk's DNS zone (if Plesk is authoritative). If DNS is external, Plesk shows the TXT record value for you to publish at your registrar.
  5. Verify externally with dig +short txt default._domainkey.your-domain.com. Expected output: v=DKIM1; k=rsa; p=<long-base64-public-key>.

Typical Plesk DKIM record:

default._domainkey.your-domain.com.   IN TXT  "v=DKIM1; k=rsa; p=<long-base64-public-key>"

5a-i. DirectAdmin: Email Manager > DKIM

  1. Sign in to DirectAdmin. Select your domain from the domain dropdown.
  2. Open Email Manager > DKIM.
  3. Click Enable. DirectAdmin generates a 1024-bit RSA key (configurable to 2048-bit in modern DirectAdmin versions) and publishes the public key at x._domainkey.<your-domain> (DirectAdmin uses the single-character x selector by historical convention).
  4. Verify externally with dig +short txt x._domainkey.your-domain.com.

Typical DirectAdmin DKIM record:

x._domainkey.your-domain.com.   IN TXT  "v=DKIM1; k=rsa; p=<long-base64-public-key>"

5a-ii. ISPConfig: Email > Domain > DKIM

  1. Sign in to ISPConfig as an administrator or email-admin user.
  2. Open Email > Domain. Select your domain.
  3. Open the DKIM tab. Check Enable DKIM. Click Generate DKIM Private-key - ISPConfig generates a 2048-bit RSA key and shows the DNS-record value (selector: default).
  4. Publish the displayed TXT record at default._domainkey.<your-domain> via your DNS provider.
  5. Click Save to activate signing. ISPConfig configures Amavis + Postfix to sign outbound mail with the generated key.

5a-iii. Webmin / Virtualmin: Email Settings > DKIM

  1. Sign in to Virtualmin as root.
  2. Open System Settings > Email Settings > DomainKeys Identified Mail (DKIM).
  3. Set Signing of outgoing mail enabled? to Yes. Select the Selector for DKIM record name (Virtualmin defaults to default but allows operator customization).
  4. Click Save and Apply. Virtualmin generates the key, publishes the TXT record in its DNS zone (if authoritative), and configures OpenDKIM + Postfix.

5a-iv. CWP (CentOS Web Panel)

  1. Sign in to CWP at port 2031 (admin) or 2083 (user).
  2. Open Email > Email Authentication (admin) or the per-domain DKIM block under Email (user).
  3. Enable DKIM for the domain. CWP generates the key (default selector: default) and publishes the TXT record in its DNS zone.

5b. Generic no-control-panel: the three escape hatches

If you have no DKIM toggle in your panel (or no panel at all), pick one of three paths:

  1. Support-ticket DKIM activation. File a ticket with the hosting provider: "Please enable DKIM signing for outbound mail on domain <your-domain> and publish the public key at default._domainkey.<your-domain>". Most providers will action this within a business day. Note that this only works if the provider's MTA (Exim or Postfix) is configured to sign with OpenDKIM or rspamd - a small fraction of bargain-tier hosts ship without DKIM infrastructure at all.
  2. SaaS-relay CNAME-delegated DKIM (the recommended path for operators who value DMARC alignment more than the cost of a transactional relay). Sign up for SendGrid / Mailgun / Amazon SES / Postmark / SparkPost. Each provides a "domain authentication" or "sender authentication" interface that prompts you to publish a CNAME like s1._domainkey.<your-domain> CNAME s1.domainkey.u12345.relay-host.net - the CNAME delegates the DKIM key lookup to the relay's signing infrastructure. Route outbound mail through the relay via SMTP submission (port 587 with TLS) or the relay's REST API; every message is signed with d=your-domain and aligns with your visible From: header.
    # SendGrid-style CNAME-delegated DKIM
    s1._domainkey.your-domain.com.   IN CNAME  s1.domainkey.u12345.wl001.sendgrid.net.
    s2._domainkey.your-domain.com.   IN CNAME  s2.domainkey.u12345.wl001.sendgrid.net.
    
    # Mailgun-style CNAME (technically a TXT delegation in their interface)
    mailo._domainkey.your-domain.com.   IN TXT  "k=rsa; p=<mailgun-managed-key>"
  3. Migrate to a host with a deliverability-focused control panel (cPanel, Plesk, DirectAdmin). The highest-friction option; warranted if your business critically depends on mail deliverability and you have outgrown the bargain-tier host's capability.

5c. Verification (universal)

Verify by sending a test message to a Gmail or Yahoo address you control. Open Show original (Gmail) or the equivalent raw-source view. The Authentication-Results header should show dkim=pass header.d=your-domain.com header.s=<your-selector>.

Key rotation: shared-hosting panels do NOT rotate selectors automatically. Plan a manual rotation every 6-12 months by generating a new key with a new selector, publishing both selectors during the transition window, switching the panel configuration to the new selector, then retiring the old.

6. Step 3: Publish DMARC at p=none

None of the shared-hosting panels auto-publish DMARC - the rua= mailbox is operator-specific. Publish manually via the panel's DNS interface (Plesk DNS Settings, DirectAdmin DNS Management, ISPConfig DNS Manager, Webmin BIND DNS Server, CWP DNS Functions) or via your registrar's DNS panel if DNS is external.

  1. Open your DNS management interface.
  2. Add a TXT record at _dmarc.your-domain.com with the value v=DMARC1; p=none; rua=mailto:dmarc-reports@your-domain.com; fo=1.
  3. Save / publish the record.

Tags explained:

  • v=DMARC1 - protocol version, always first.
  • p=none - the reporting-only phase. Receivers will NOT change disposition based on DMARC outcomes; instead they will send daily aggregate reports describing every authentication result.
  • rua=mailto:dmarc-reports@... - destination for daily aggregate (RUA) reports.
  • fo=1 - request a forensic (RUF) report on any DMARC failure (most major receivers do not send forensic reports - see DMARC aggregate reports deep dive).

Confirm the record is live with dig +short txt _dmarc.your-domain.com or via DMARC Analyzer's Domain Security Checker. Reports begin arriving within 24-48 hours.

7. Step 4: Inventory legitimate senders and fix alignment

Read aggregate reports for 2-6 weeks. For each unique sending IP / sending domain combination, determine:

  • Is this a legitimate sender? Your shared-hosting MTA is obvious; the WordPress plugin you installed two years ago may not be.
  • Is the sender aligned? Either SPF must pass AND the envelope MAIL FROM domain match your visible From: header (organisational-domain match for relaxed alignment), OR DKIM must pass AND the d= in the signature match your visible From: header.
  • If not aligned, what is the gap? Three shared-hosting- specific patterns dominate the alignment-failure surface:
    • The provider-bounce-domain pattern - some shared hosts rewrite the envelope MAIL FROM to a provider- controlled domain, so SPF passes for the provider but does not align with your visible From:. DKIM alignment (via the panel-issued DKIM signature) still works correctly because DKIM is independent of envelope rewriting - assuming DKIM is enabled on the panel.
    • The DKIM-not-enabled pattern - the most common shared-hosting failure mode on Plesk specifically. The operator deployed DMARC but skipped the Plesk DKIM activation step. Without DKIM, the only alignment path is SPF, which breaks under envelope-rewriting hosts. Fix: enable DKIM via Mail Settings > DKIM spam protection (Plesk) or the equivalent panel toggle.
    • The SaaS-sender pattern - a third-party service (SendGrid, Mailgun, Customer.io, Mailchimp) sends with the From: header set to your-domain but its own bounce domain. Fix by enabling CNAME-delegated DKIM with d=your-domain in the SaaS provider.

Continue iterating until every legitimate sender shows in reports as DMARC-pass. The DMARC Analyzer dashboard breaks down per source IP and per sending organisation so each unaligned sender is identifiable.

8. Step 5: Advance from p=quarantine to p=reject

Once every legitimate sender is aligned, advance the DMARC record to p=quarantine:

_dmarc.your-domain.com.   IN TXT  "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@your-domain.com; fo=1"

Edit the existing _dmarc TXT record in your panel's DNS interface (or your registrar's DNS panel) - change p=none to p=quarantine. Receivers begin delivering DMARC-failing mail to spam. A common pattern: a WordPress plugin that sends weekly newsletters from an unaligned SMTP configuration surfaces in the first week at p=quarantine.

After 1-3 months at p=quarantine without unexpected failures, advance to p=reject:

_dmarc.your-domain.com.   IN TXT  "v=DMARC1; p=reject; rua=mailto:dmarc-reports@your-domain.com; fo=1"

DMARC-failing mail is now bounced at the SMTP boundary. Spoofing of your domain at DMARC-honouring receivers is no longer possible. You have completed the rollout.

Never skip from p=none to p=reject. The p=quarantine intermediate phase exists specifically so failed mail goes to spam (recoverable) rather than bouncing (unrecoverable). The single most common self-inflicted email outage in DMARC rollouts is skipping this phase. See the DMARC policy rollout deep dive for the full rationale.

For granular ramping, use the pct= tag: p=quarantine; pct=5 applies the quarantine disposition to 5% of failing mail, leaving 95% at p=none. RFC 7489 §6.3 defines the semantics; note that the dmarcbis draft deprecates pct= so this is a transitional feature.

9. Shared-hosting gotchas

  • Operator-empowerment ceiling. Covered in section 2. The defining shared-hosting constraint: the less featureful your panel, the more DMARC work depends on hosting-provider support or the SaaS-relay escape hatch.
  • DNS hosted at the registrar, not the panel. The panel's DNS interface will let you publish records to its local zone file, but if your authoritative DNS lives at Cloudflare, Route 53, or your registrar, public resolvers will never see those records. Verify with dig +short ns your-domain.com - if the nameservers are NOT the panel host's nameservers, publish DNS records at the registrar / external DNS provider.
  • WordPress plugins bypassing the panel. The wp_mail() function in WordPress is widely overridden by SMTP plugins (WP Mail SMTP, Easy WP SMTP, FluentSMTP) that route outbound through a third-party SMTP relay - bypassing the panel's DKIM signing entirely. Either configure the SMTP plugin to use the panel server's SMTP (so DKIM is applied) or configure the plugin's third-party SMTP to sign DKIM with d=your-domain under a CNAME-delegated selector.
  • Plesk DKIM disabled by default. Unlike DirectAdmin and cPanel, Plesk does NOT enable DKIM at account creation - the operator must explicitly enable it via Mail Settings > DKIM spam protection. The most common Plesk DMARC failure mode is skipping this step.
  • Postfix vs Exim signing infrastructure. Plesk and ISPConfig run Postfix; DirectAdmin and CWP run Exim. Both work the same way operationally (the panel toggle enables the appropriate signing milter or filter) but if you ever need to inspect the MTA configuration directly (e.g. via SSH), the configuration files differ: /etc/postfix/main.cf + OpenDKIM milter for Postfix, /etc/exim.conf + dkim_signing block for Exim.
  • Per-tenant key vs server-wide key. Some bargain-tier shared hosts sign all outbound mail with a SERVER-WIDE DKIM key whose d= is the hosting provider's domain rather than per- tenant. In this configuration DKIM alignment is structurally impossible for tenants because d= can never match the tenant's From: header. The fix is either to demand per-tenant DKIM from the provider, route mail through a SaaS relay with per-tenant DKIM, or migrate hosts.

10. Common shared-hosting + DMARC mistakes

  1. Deploying DMARC on Plesk without first enabling DKIM. The #1 Plesk failure mode. Without DKIM, the only alignment path is SPF, which breaks under envelope-rewriting hosts. Enable DKIM at Mail Settings > DKIM spam protection BEFORE advancing past p=none.
  2. Assuming all shared-hosting panels use the "default" selector. DirectAdmin uses x, not default. Always verify with dig +short txt <selector>._domainkey.your-domain.com for whichever selector your panel uses.
  3. Publishing DNS records at the panel when authoritative DNS lives elsewhere. Plesk DNS Settings, DirectAdmin DNS Management, etc. will accept the record but it will not be visible to public resolvers. Verify your nameservers with dig +short ns your-domain.com before deciding where to publish.
  4. Forgetting to advance past p=none. The reporting-only phase does NOT stop spoofing. Advance to enforcement after 2-6 weeks of clean reports.
  5. Filing a support ticket but publishing DMARC before the provider enables DKIM. The host's outbound mail will fail DMARC for the gap window. Either delay DMARC publication until the support ticket is closed AND DKIM is verified, or publish DMARC at p=none (which never quarantines / rejects) and advance to enforcement only after DKIM is confirmed working.
  6. Two SPF records on the same domain. RFC 7208 §3.2 mandates a single SPF record. If you add a SaaS-sender include, MERGE it into the existing panel-generated record - do not publish a second TXT.
  7. SPF over 10 DNS lookups. The panel-host include plus several third-party include: directives commonly blow the limit. Use Domain Security Checker to count lookups.
  8. Skipping the WordPress plugin audit. WordPress installations typically send mail through paths that bypass the panel's signing. Configure WP Mail SMTP / equivalent to route via the panel SMTP endpoint OR to sign DKIM under your domain via the third-party SMTP's authentication settings.
  9. Treating server-wide DKIM as per-tenant DKIM. If your host signs with d=<hosting- provider>.com (verify in the DKIM-Signature header on a test message), per-tenant alignment is structurally impossible. Move to a host or relay that signs with d=your-domain.
  10. Publishing DMARC at p=reject without alignment fix-up. The fastest path to a self-inflicted email outage. Always ingest reports at p=none for 2-6 weeks first.

11. Troubleshooting

  • "DKIM not signing despite enabling the panel toggle". Send a test message to a Gmail address; open Show Original. If dkim=none appears in the Authentication-Results header, the signing infrastructure is not active on the server - file a support ticket with the hosting provider. Common cause on Plesk: OpenDKIM is not installed at the OS level even though the toggle is exposed in the panel UI.
  • "My shared-hosting mail goes to spam at Gmail despite all three records passing". Diagnose shared-IP reputation: dig +short a mail.<your-host-server> then check the IP at Blacklist Checker. If the IP is on a major blocklist (Spamhaus, SORBS, Barracuda), the deliverability problem is upstream of DMARC. Move bulk sending off shared hosting; for transactional volume, switch to a SaaS relay with a clean outbound IP.
  • "DMARC reports show DKIM header.d=<hosting-provider>.com, not my custom domain". The host signs with a server-wide DKIM key whose d= is the provider's domain rather than per-tenant. Per- tenant alignment is structurally impossible in this configuration. Either demand per-tenant DKIM, route through a SaaS relay, or migrate hosts.
  • "DMARC reports show DKIM pass + SPF pass but DMARC fail". An alignment failure. The SPF-passing domain or DKIM-signing domain does not match the visible From: header. See DMARC alignment explained for the deep dive.
  • "My SPF record is failing with permerror". Almost always the 10-DNS-lookup limit. Run Domain Security Checker.
  • "How do I inspect Plesk's outbound mail queue?" Plesk > Tools and Settings > Mail Server Settings > Mail Queue shows pending Postfix messages. From the command line:
    postqueue -p            # Postfix queue list
    mailq                   # alias for postqueue -p
    postqueue -f            # flush queue (retry deferred messages)
    postsuper -d <message-id>  # delete a stuck message
  • "How do I inspect DirectAdmin's Exim queue?" DirectAdmin > Admin Tools > Mail Queue Administration. From the command line:
    exim -bp                  # list queue
    exim -bpc                 # queue size count
    exim -Mvh <message-id>    # view message headers
    exim -Mrm <message-id>    # remove a stuck message
  • "I have no panel access and no SSH access". You are on the most-restrictive shared-hosting tier. Pick the SaaS-relay escape hatch from section 5b: bypass the host's outbound mail entirely and route through a transactional relay with CNAME- delegated DKIM. This is the only operator-empowering option on this tier.

12. Frequently asked questions

How do I set up DMARC on Plesk?
Five steps. Open Mail > Mail Settings > DKIM spam protection and enable DKIM signing. Verify the public key at default._domainkey.<your-domain>. Add SPF manually at the domain apex (Plesk does NOT auto-publish SPF). Publish DMARC at _dmarc via Plesk's DNS Settings. Ingest reports for 2-6 weeks, align every legitimate sender, advance through p=quarantine to p=reject.
How do I set up DMARC on DirectAdmin?
Five steps. Open Email Manager > DKIM and click Enable. Verify the public key at x._domainkey.<your-domain> (DirectAdmin uses the single-character x selector). DirectAdmin auto-generates SPF as v=spf1 a mx ~all; verify and tighten to -all after DMARC reports confirm clean alignment. Publish DMARC at _dmarc via DNS Management. Advance through p=quarantine to p=reject after 2-6 weeks.
What DKIM selector do Plesk and DirectAdmin use?
Plesk: default. DirectAdmin: x. ISPConfig: default. Webmin / Virtualmin: default by default but operator-configurable. CWP: default. cPanel: default. There is no industry-wide convention - verify with dig +short txt <selector>._domainkey.<your-domain> for whichever selector your panel uses.
How do I deploy DMARC if my shared host has no control panel?
Three escape hatches: (1) file a support ticket asking the hosting provider to enable DKIM signing for outbound mail; (2) route outbound mail through a SaaS transactional relay (SendGrid, Mailgun, Amazon SES, Postmark, SparkPost) with CNAME-delegated DKIM so alignment works via the relay; (3) migrate to a host with a deliverability-focused control panel. Option 2 is the most operator- empowering path because it works for any host.
How is shared hosting different from cPanel, Plesk, or DirectAdmin for DMARC?
cPanel, Plesk, and DirectAdmin are specific control panels with self- service DKIM toggles - the operator can deploy DMARC end-to-end without contacting hosting support. Generic shared hosting WITHOUT a deliverability- focused control panel has no such lever - the operator depends on hosting-provider support or the SaaS- relay escape hatch. The fundamental distinction is operator empowerment.
Why does my Plesk-hosted mail fail DMARC despite SPF passing?
Almost always a DKIM-not-enabled gap. Plesk auto-configures Postfix outbound but does NOT auto-enable DKIM signing - the operator must explicitly enable DKIM via Mail Settings > DKIM spam protection. Without DKIM, your only alignment path is SPF, which breaks under envelope-rewriting hosts. See help_dmarc_alignment.php for the deep dive.
Do I need DMARC if I send all my mail through SendGrid or Mailgun instead of my hosting?
Yes. Without DMARC at enforcement, attackers can forge messages with your domain in the From: header from anywhere on the internet. SendGrid / Mailgun signing your outbound mail does not stop spoofing at receivers that ignore the relay's DKIM signature. DMARC at enforcement closes that gap. Configure DKIM via the relay's domain- authentication interface (CNAME- delegated) and ramp DMARC from p=none to p=reject over 2-6 weeks.
Where do I see DMARC reports for shared hosting mail?
Receivers (Google, Microsoft, Yahoo, Comcast, and others) send daily aggregate reports to the rua= mailbox in your DMARC record. DMARC Analyzer ingests these via includes/DmarcParser.php. Plesk, DirectAdmin, and ISPConfig do NOT parse DMARC reports - their email- stats interfaces show outbound delivery only.

Deploy DMARC for your shared-hosting domain now

DMARC Analyzer parses the daily aggregate reports receivers send to your rua= mailbox, deduplicates by report_id + org_name, and surfaces the per-sender / per-IP / per-day breakdown needed to drive the alignment fix-up phase. Live DNS verification for every SPF / DKIM / DMARC record on your domain runs through includes/DnsChecker.php; the Email Header Analyzer at header_analyzer.php diagnoses individual message failures by parsing the full Authentication-Results stack via includes/EmailHeaderParser.php; the Blacklist Checker diagnoses shared-IP reputation issues common on shared-hosting infrastructure.

Sign up — Free plan Check my shared-hosting domain