How Gmail decides you are a bulk sender
@gmail.com and @googlemail.com) a bulk sender. The count is taken across your primary root domain, not per mailbox or per server. Mail from news.example.com, shop.example.com and example.com adds up to one total. Order receipts and password resets count too, because they come from the same domain as the newsletter.
Google also says that once a domain meets the threshold, it stays classified as bulk. One big campaign is enough. Bulk senders must publish SPF and sign with DKIM. They need a DMARC record (at least p=none) and a From: domain that aligns with the SPF or DKIM domain. They also need valid forward and reverse DNS for the sending IP, TLS on the connection, one-click unsubscribe for marketing mail, and a low spam complaint rate as reported in Google Postmaster Tools. Mail that falls short gets throttled, sent to spam, or rejected outright.
Counting is per domain, and that has a consequence people often miss. Moving to an external relay changes the IP and the infrastructure, but it does not reset your bulk status or your domain reputation. Those follow the From: domain wherever the mail is sent from.
What Exim does with one newsletter message
- Submission. The plugin hands the message to Exim. It either calls PHP
mail(), which runs the localsendmailbinary (Exim's), or it opens an authenticated SMTP session to the local server. Exim's access control lists (ACLs) run at this point. On cPanel, this is also where the per-domain hourly counter gets checked. - Spool. Once accepted, the message is written to the spool under
/var/spool/exim/inputas a header file and a data file sharing one message ID. The plugin now reports the message as sent. In reality it is only queued. - Routing. Exim's routers run in order. For a
gmail.comrecipient, a DNS-based router looks up the MX records and assigns a remote SMTP transport. - Transport. Exim opens a TCP connection to a Gmail MX on port 25 from the server's outgoing IP. That is the main shared IP unless the host has mapped domains to other IPs, typically through
/etc/mailips. Exim negotiates STARTTLS, adds the DKIM signature for the sending domain, then sends the envelope and the message. - Outcome. A
250reply means Gmail accepted it. Exim removes the spool files and logs the delivery with=>. A4xxreply is a temporary deferral. The message stays in the spool, the log shows==, and Exim's retry rules decide when to try again. A5xxreply is permanent. Exim logs**and generates a bounce to the envelope sender.
4xx path is where bulk sending gets messy. When Gmail dislikes the rate or the reputation, it defers, as described in Why Exim Logs Gmail 421 Rate Limit Deferrals for cPanel Domains. Exim records the failure in its retry hints database. Those hints are shared across the whole server, so other accounts' mail to the same Gmail hosts can wait behind the same retry schedule. The queue grows, and every retry is another connection from an IP Gmail is already wary of.
You can see which route and transport Exim would use for a Gmail recipient, and which interface the transport binds to, without sending anything:
BASH
# Show which router and transport would handle this address (no mail is sent)
exim -bt [email protected]
# Print the remote SMTP transport settings, including interface and DKIM options
# (transport names differ between cPanel versions; use the name exim -bt reported)
exim -bP transport remote_smtpexim -bt (names and IPs vary):
TEXT
[email protected]
router = <router-name>, transport = <transport-name>
host gmail-smtp-in.l.google.com [<mx-ip>] MX=5Where the hourly limit and the shared IP get in the way
BASH
# Number of messages currently in the Exim queue
exim -bpc
# Recent deferrals to Gmail in the main log (cPanel log path)
grep 'gmail' /var/log/exim_mainlog | grep ' == ' | tail -n 20Which duties stay with you either way
List-Unsubscribe or List-Unsubscribe-Post: List-Unsubscribe=One-Click headers, so the plugin has to add them and act on unsubscribe requests quickly. Google cites a two-day window. Bounces go back to the envelope sender's mailbox, where nobody tends to read them, so someone has to remove hard-bouncing addresses. Watching complaint rates means verifying the domain in Postmaster Tools.
A relay takes over the infrastructure side. It owns the IP pool and its reputation, paces connections to Gmail, handles retries, and usually processes bounces and complaints. Some relays add unsubscribe headers and some leave that to you. Check rather than assume. What stays with you is the domain. You still have to publish the relay's DKIM key on your domain so signatures align with your From: address. You authorize the relay in SPF, either with an include or with a custom return-path subdomain, and an include can push you past SPF's ten-lookup limit. DMARC stays yours, and so do list quality and content. If recipients mark the mail as spam, your domain reputation drops no matter whose IP delivered it. When alignment breaks after a switch, the receiving side's headers show which identifier failed, as covered in Reading Authentication-Results Headers to Fix DMARC Alignment.
Questions that decide where the mail goes
news.example.com to keep marketing separate from transactional mail. That can help isolate some reputation signals. It does not take you out of the bulk count, because Gmail still adds the volume to the root domain.
A practical rule: keep mail on the server while volume is low, the IP is yours or clean, and the list is healthy. Move campaigns to a relay once you approach bulk volume or rely on a shared IP, and keep transactional mail wherever it delivers reliably. Either way, set up SPF, DKIM, DMARC alignment and one-click unsubscribe before the first big send. A relay does not exempt your domain from those requirements.