Documentation

✉️ Email Delivery

Documentation, reference material and tutorials for CRM-NG SMTP Email: setup guides for every mail service, troubleshooting, and one article per error message.

Securing settings with wp-config constants

Updated

By Duane GarnerChief Executive Officer (CEO)
Summarize: Claude ChatGPT View Markdown
On this page

Keep mail passwords and API keys out of the database by defining CRM-NG SMTP settings in wp-config.php, with the full list of constants per mailer.

You can define CRM-NG SMTP's main settings in your site's wp-config.php file instead of on the settings screens. Secrets then never sit in the database, and nobody can change them from the admin area. This article lists every supported constant, mailer by mailer. It is for developers, agencies and hosts who manage sites through code.

Turn constants on

Constants are ignored until you add this line to wp-config.php, above the line that says "That's all, stop editing!":

define( 'CRMNG_SMTP_ON', true );

It must be exactly true. Then add the constants you need below it. Any setting you do not define keeps working from the screens.

What you see on the screens

Each field fixed by a constant is greyed out and cannot be edited. Underneath it reads: The value of this field was set using a constant followed by the constant's name, most likely inside wp-config.php of your WordPress installation. The real value of secrets is never displayed.

To change a fixed value, edit wp-config.php. To hand it back to the screen, delete the constant.

Sender and mailer

Constant Setting Example value
CRMNG_SMTP_MAILER Mailer 'sendgrid'
CRMNG_SMTP_MAIL_FROM From Email 'hello@example.com'
CRMNG_SMTP_MAIL_FROM_FORCE Force From Email true
CRMNG_SMTP_MAIL_FROM_NAME From Name 'Example Shop'
CRMNG_SMTP_MAIL_FROM_NAME_FORCE Force From Name true
CRMNG_SMTP_SET_RETURN_PATH Return Path true

Mailer values: mail, sendlayer, smtpcom, sendinblue (Brevo), elasticemail, gmail, mailgun, mailjet, mailersend, mandrill, pepipostapi, postmark, resend, sendgrid, smtp2go, sparkpost, smtp (Other SMTP), amazonses, outlook (365 / Outlook), zoho.

Constants per mailer

Mailer Constants
Other SMTP CRMNG_SMTP_SMTP_HOST, CRMNG_SMTP_SMTP_PORT, CRMNG_SMTP_SSL ('' for none, 'ssl' or 'tls'), CRMNG_SMTP_SMTP_AUTH (true/false), CRMNG_SMTP_SMTP_AUTOTLS (true/false), CRMNG_SMTP_SMTP_USER, CRMNG_SMTP_SMTP_PASS
SendLayer CRMNG_SMTP_SENDLAYER_API_KEY
SMTP.com CRMNG_SMTP_SMTPCOM_API_KEY, CRMNG_SMTP_SMTPCOM_CHANNEL (Sender Name)
Brevo CRMNG_SMTP_SENDINBLUE_API_KEY, CRMNG_SMTP_SENDINBLUE_DOMAIN (Sending Domain)
Elastic Email CRMNG_SMTP_ELASTICEMAIL_API_KEY
Google / Gmail CRMNG_SMTP_GMAIL_CLIENT_ID, CRMNG_SMTP_GMAIL_CLIENT_SECRET
Mailgun CRMNG_SMTP_MAILGUN_API_KEY, CRMNG_SMTP_MAILGUN_DOMAIN, CRMNG_SMTP_MAILGUN_REGION ('US' or 'EU')
Mailjet CRMNG_SMTP_MAILJET_API_KEY, CRMNG_SMTP_MAILJET_SECRET_KEY
MailerSend CRMNG_SMTP_MAILERSEND_API_KEY, CRMNG_SMTP_MAILERSEND_HAS_PRO_PLAN (Professional Plan, true/false)
Mandrill CRMNG_SMTP_MANDRILL_API_KEY
Pepipost CRMNG_SMTP_PEPIPOST_API_KEY
Postmark CRMNG_SMTP_POSTMARK_SERVER_API_TOKEN, CRMNG_SMTP_POSTMARK_MESSAGE_STREAM
Resend CRMNG_SMTP_RESEND_API_KEY
SendGrid CRMNG_SMTP_SENDGRID_API_KEY, CRMNG_SMTP_SENDGRID_DOMAIN (Sending Domain)
SMTP2GO CRMNG_SMTP_SMTP2GO_API_KEY
SparkPost CRMNG_SMTP_SPARKPOST_API_KEY, CRMNG_SMTP_SPARKPOST_REGION ('US' or 'EU')
Amazon SES CRMNG_SMTP_AMAZONSES_CLIENT_ID (Access Key ID), CRMNG_SMTP_AMAZONSES_CLIENT_SECRET (Secret Access Key), CRMNG_SMTP_AMAZONSES_REGION (for example 'eu-west-1')
365 / Outlook CRMNG_SMTP_OUTLOOK_TENANT_ID (Tenant ID), CRMNG_SMTP_OUTLOOK_CLIENT_ID (Application (Client) ID), CRMNG_SMTP_OUTLOOK_CLIENT_SECRET (Client Secret)
Zoho Mail CRMNG_SMTP_ZOHO_DOMAIN (Data Center, for example 'zoho.eu'), CRMNG_SMTP_ZOHO_USER (Mailbox Email Address), CRMNG_SMTP_ZOHO_PASS (Application-Specific Password)

Fields that stay on the screen

For Google / Gmail, the constants hold the app details, but you still press the authorisation button on screen once.

Other settings

Constant Setting
CRMNG_SMTP_DO_NOT_SEND Do Not Send on the Misc tab (true stops all email except tests)
CRMNG_SMTP_SUMMARY_REPORT_EMAIL_DISABLED Disable Email Summaries (true or false)
CRMNG_SMTP_OPTIMIZED_EMAIL_SENDING_ENABLED Optimize Email Sending (true or false)
CRMNG_SMTP_DEBUG_EVENTS_RETENTION_PERIOD Events Retention Period on Tools → Debug Events, in seconds (for example 2628000 for one month)

The Alerts tab's addresses can be pinned too; a pinned field is greyed out on screen and the tab says which constants are in force.

Constant Alerts field
CRMNG_SMTP_ALERT_EMAIL_SEND_TO Alert email addresses (comma-separated)
CRMNG_SMTP_ALERT_CUSTOM_WEBHOOK_URL Generic webhook URL
CRMNG_SMTP_ALERT_SLACK_WEBHOOK_URL, CRMNG_SMTP_ALERT_DISCORD_WEBHOOK_URL, CRMNG_SMTP_ALERT_TEAMS_WEBHOOK_URL the chat webhook URLs
CRMNG_SMTP_ALERT_TWILIO_SMS_ACCOUNT_SID, CRMNG_SMTP_ALERT_TWILIO_SMS_AUTH_TOKEN, CRMNG_SMTP_ALERT_TWILIO_SMS_FROM_PHONE_NUMBER, CRMNG_SMTP_ALERT_TWILIO_SMS_TO_PHONE_NUMBER Twilio SMS
CRMNG_SMTP_ALERT_WHATSAPP_ACCESS_TOKEN, CRMNG_SMTP_ALERT_WHATSAPP_PHONE_NUMBER_ID, CRMNG_SMTP_ALERT_WHATSAPP_TO_PHONE_NUMBER WhatsApp Cloud API

The other settings on the Email Log, Smart Routing and Email Controls tabs, and the backup SMTP transport, have no constants; their secrets are stored encrypted.

The encryption key

Passwords and keys saved through the screens are encrypted with a key the plugin creates and stores in the database. To keep that key out of the database too, define your own:

define( 'CRMNG_SMTP_CRYPTO_KEY', 'exactly-32-characters-long-key!!' );

It must be exactly 32 characters. Use your own random value, not the example above. Set it before you save any secrets. If you add or change it later, values saved earlier can no longer be read, and you must enter them again.

A complete example

define( 'CRMNG_SMTP_ON', true );
define( 'CRMNG_SMTP_MAILER', 'sendgrid' );
define( 'CRMNG_SMTP_MAIL_FROM', 'hello@example.com' );
define( 'CRMNG_SMTP_MAIL_FROM_FORCE', true );
define( 'CRMNG_SMTP_MAIL_FROM_NAME', 'Example Shop' );
define( 'CRMNG_SMTP_SENDGRID_API_KEY', 'SG.your-key-here' );

Protect wp-config.php

wp-config.php now holds live credentials. Keep it out of version control and public backups, and make sure your server never serves it as a file.

Go to Top