PHPMailer Properties Reference

0

Every public property of PHPMailer 6.x you are likely to set, with its type, default and what it actually changes. Properties are set directly on the instance. There are no setters for most of them:

$mail->Host    = 'smtp.example.com';
$mail->Port    = 587;
$mail->CharSet = PHPMailer::CHARSET_UTF8;

SMTP connection

Property Type Default Purpose
$Host string localhost SMTP server. Multiple hosts can be given semicolon-separated as a failover list.
$Port int 25 Set to 587 for STARTTLS, 465 for implicit TLS.
$SMTPSecure string '' ENCRYPTION_STARTTLS (tls) or ENCRYPTION_SMTPS (ssl).
$SMTPAuth bool false Enable authentication. Needed for every hosted provider.
$Username string '' Sometimes the full address, sometimes the local part. Providers differ.
$Password string '' Read it from the environment, not from source.
$AuthType string '' Forces a mechanism: LOGIN, PLAIN, CRAM-MD5, XOAUTH2. Auto-detected when empty.
$SMTPAutoTLS bool true Upgrade to TLS whenever the server advertises STARTTLS. Leave on.
$SMTPKeepAlive bool false Reuse one connection across sends. Call smtpClose() when done.
$Timeout int 300 Seconds. The RFC default, far too long for a web request — lower it.
$SMTPOptions array [] Stream context options, mainly SSL. See the warning below.
$Helo string '' Hostname sent in EHLO. Defaults to $Hostname.
$Hostname string '' Used in Message-ID and Received. Falls back to the server hostname.

On $SMTPOptions: the snippet that disables verify_peer circulates widely as a fix for certificate errors. It works by turning off the verification TLS exists to provide. Fix the CA bundle instead, openssl.cafile in php.ini. Disabling verification against a production server means any machine on the path can read the credentials you are about to send.

Debugging

Property Type Default Purpose
$SMTPDebug int 0 SMTP::DEBUG_OFFDEBUG_LOWLEVEL (0–4). Use 2 to diagnose, 0 in production.
$Debugoutput string|callable echo echo, html, error_log, or a callable receiving ($str, $level).
$mail->Debugoutput = function ($str, $level) {
    error_log('PHPMailer: ' . trim($str));
};

Sender and recipients

Property Type Default Purpose
$From string root@localhost Visible From. Set via setFrom() rather than directly.
$FromName string Root User Display name.
$Sender string '' Envelope sender / Return-Path — where bounces go. Separate from From.
$ConfirmReadingTo string '' Read-receipt address. Most clients ignore or prompt.
$SingleTo bool false Send a separate message per To recipient so none sees the others.
$do_verp bool false Variable envelope return path, for per-recipient bounce tracking.

$Sender is worth setting deliberately. Bounces go to the envelope sender, so pointing it at a monitored mailbox is how you learn which addresses are dead. Rather than sending to them forever and eroding your reputation.

Content

Property Type Default Purpose
$Subject string '' Subject line.
$Body string '' Main body: HTML if isHTML(true), otherwise plain text.
$AltBody string '' Plain-text alternative. Always set it for HTML mail.
$CharSet string iso-8859-1 Set to PHPMailer::CHARSET_UTF8 for anything not pure ASCII.
$ContentType string text/plain Managed by isHTML().
$Encoding string 8bit 7bit, 8bit, base64, binary, quoted-printable.
$WordWrap int 0 Wrap plain text at N characters. 78 is the conventional value.
$Ical string '' An iCalendar event body, sent as an alternative part.
$AllowEmpty bool false Permit an empty body instead of failing.

The $CharSet default catches everyone eventually. ISO-8859-1 cannot represent an em dash, a curly quote, or any non-Latin script, and the result is mojibake in the recipient’s client. Set UTF-8 unless you have a specific reason not to.

Headers and metadata

Property Type Default Purpose
$Priority ?int null 1 high, 3 normal, 5 low. Aggressive values can hurt filtering.
$MessageID string '' Override the generated Message-ID. Must be RFC-conformant.
$MessageDate string '' Override the Date header.
$XMailer string '' Overrides the X-Mailer header. Set to a single space to remove it entirely.
$Version string Read-only library version.
$ErrorInfo string '' The last error, including the server’s own text. Log this, not the exception message.

DKIM

Property Type Purpose
$DKIM_domain string Signing domain, normally the From domain.
$DKIM_selector string Selector; the key lives at <selector>._domainkey.<domain>.
$DKIM_private string Path to the private key. Keep it outside the web root.
$DKIM_private_string string The key as a string, for secret-manager setups.
$DKIM_passphrase string Passphrase, if the key is encrypted.
$DKIM_identity string Identity in the signature; usually $From.
$DKIM_extraHeaders array Additional headers to include in the signature.
$DKIM_copyHeaderFields bool Copy signed headers into the signature. Rarely needed.
$mail->DKIM_domain   = 'example.com';
$mail->DKIM_selector = 'phpmailer';
$mail->DKIM_private  = '/secure/dkim_private.pem';
$mail->DKIM_identity = $mail->From;

Transport

Property Type Default Purpose
$Mailer string mail mail, smtp, sendmail, qmail. Set by the is*() methods.
$Sendmail string /usr/sbin/sendmail Path to the binary. Use -bs so you get real status back.
$UseSendmailOptions bool true Pass -f for the sender. Disable for non-sendmail-compatible MTAs.
$action_function string '' Callback invoked after each send, receiving result, recipients, subject and body.

Constants worth knowing

Constant Value
PHPMailer::CHARSET_UTF8 utf-8
PHPMailer::CHARSET_ISO88591 iso-8859-1
PHPMailer::CHARSET_ASCII us-ascii
PHPMailer::ENCRYPTION_STARTTLS tls
PHPMailer::ENCRYPTION_SMTPS ssl
PHPMailer::ENCODING_BASE64 base64
PHPMailer::ENCODING_QUOTED_PRINTABLE quoted-printable
PHPMailer::ENCODING_8BIT 8bit
SMTP::DEBUG_OFFDEBUG_LOWLEVEL 04

Prefer the constants to their string values. They are self-documenting, and a typo in 'startls' fails at runtime while ENCRYPTION_STARTLS fails immediately.

A sane baseline

$mail = new PHPMailer(true);

$mail->isSMTP();
$mail->Host       = getenv('SMTP_HOST');
$mail->Port       = 587;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->SMTPAuth   = true;
$mail->Username   = getenv('SMTP_USER');
$mail->Password   = getenv('SMTP_PASS');
$mail->Timeout    = 30;
$mail->CharSet    = PHPMailer::CHARSET_UTF8;
$mail->XMailer    = ' '; // omit the X-Mailer header
$mail->Sender     = 'bounces@example.com';

Rather than repeating this everywhere, put it in a subclass, see Extending PHPMailer.

See also

Properties in practice

sunshyne works on technical SEO and email deliverability for French-speaking markets, and runs the digital consultancy at sunshyne.ch. Most of that work sits where the two overlap. On the SEO side: redirect mapping, crawl and indexation diagnostics, server log analysis, and recovering domains whose history has damaged them. On the email side: the authentication layer — SPF, DKIM and DMARC — sender reputation, and the reasons a technically valid message still gets filtered. These PHPMailer pages exist because the second half of that work keeps returning to the same questions: which transport to use, why an SMTP connection fails, and why a correctly formed message is rejected anyway. The examples here are the ones worth keeping after answering those questions more than once.

Comments are closed.