Dkim Php Mail Signature

Dkim Php Mail Signature

Packagist Version Packagist Dependency Version License EUPL 1.2 Become a sponsor to JV-conseil Follow JV conseil on StackOverflow Follow JVconseil on Twitter Follow JVconseil on Mastodon Follow JV conseil on GitHub

Usage

Sample lines to import into your mail code to start signing with DKIM:

require_once __DIR__ . '/../vendor/autoload.php' ; // Autoload files using Composer autoload
use JVconseil\DkimPhpMailSignature\DKIMsign ;
use JVconseil\DkimPhpMailSignature\DKIMconfig ;

// init
$config = new DKIMconfig('/www/inc/config/jv-conseil/dkim-php-mail-signature/config.inc.php') ;
$sign = new DKIMsign(
 $config->private_key,
 $config->passphrase,
 $config->domain,
 $config->selector
) ;

// sign
$signed_headers = $sign->get_signed_headers($to, $subject, $message, $headers) ;

// send email
mail($to, $subject, $message, $signed_headers.$headers) ;

Installation

Step by Step guide to generate your encryption keys and populate them through your DNS records.

Installation & loading

DkimPhpMailSignature is available on Packagist (using semantic versioning), and installation via Composer is the recommended way to install DkimPhpMailSignature. Just add this line to your composer.json file:

"jv-conseil/dkim-php-mail-signature": "^1.0"

or run

composer require jv-conseil/dkim-php-mail-signature

Note that the vendor folder and the vendor/autoload.php script are generated by Composer; they are not part of DkimPhpMailSignature.

Make your own copy of config file

Before starting you should make a copy of folder config/ and store it outside your vendor/ Composer repository in a non-public area of your website e.g.:

/www/inc/config/jv-conseil/dkim-php-mail-signature/

Failing to do so will expose you to lose all your settings in case of a future Composer udpate.

Generate your Public & Private Encryption keys

In Terminal enter this command line to start working under the path of your config/ folder:

cd /www/inc/config/jv-conseil/dkim-php-mail-signature/

In Terminal enter this command line to generate a new private 2048 bit encryption key:

openssl genrsa -des3 -out private.pem 2048

Enter your Pass Phrase and save it for editing your config.inc.php file in the next step.

Then retrieve your public key:

openssl rsa -in private.pem -out public.pem -outform PEM -pubout

You can delete the two originals *.pem file keys stored in the config/ folder if they create a conflict in the creation process of your keys.

Edit your DNS with a new DKIM record

Access your registrar interface (e.g.: OVH.com) and create a new DKIM record to declare your public key:

selector._domainkey  IN TXT  ( "v=DKIM1;k=rsa;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ekggNf9vuzzL4SlVc8QZyyqbEwR5bVTPC9cEZ8hFqTKOc7go180n3RZilYJZvveaxBkLCVJSTQaMPtKuSptY5au6Pi3AkFlizzhUJ80+0zgZXSGx7gfbginbRwhD+XdGOe9NXpo0PfrD6dEJ49Ytx4/nHB0TKiL227C0kGWb7RfWTVWccgJq4+kQb4l+4" "oDU5rGomSYK+zmMV13QTSETcJnoXhmjoJ30omyJfEXAsK5Ny0LJo8rWCucLD31BxHrM9/+M/Ye+TWxcrD2mRh5Jxqcnyj00/7kCnWeGPTftVKkAJBP3JMRqCNShLUchLhaz0qeXUtxAe9dx7ltr8042QIDAQAB;" )

DKIM works better with SPF and DMARC records, you should consider editing them too:

3600     IN TXT  "v=spf1 include:_spf.google.com ~all"
_dmarc   IN TXT  "v=DMARC1; p=quarantine; rua=mailto:me@yourdomain.name"

Further reading:

Edit your Config File

Under config/config.sample.inc.php you will find a config file example to help you set your own details.

Now you can drop .sample in the filename and start editing it:

  • domain: your domain name e.g: google.com
  • selector: selector used in your DKIM DNS record, e.g.: selector._domainkey.MAIL_DKIM_DOMAIN
  • passphrase: your pass phrase used to generate your keys e.g.: myPassPhrase.
  • … other parameters can be omitted.

Simple Use

Sample lines to import into your mail code to start signing with DKIM:

require_once __DIR__ . '/../vendor/autoload.php' ; // Autoload files using Composer autoload
use JVconseil\DkimPhpMailSignature\DKIMsign ;
use JVconseil\DkimPhpMailSignature\DKIMconfig ;

// init
$config = new DKIMconfig('/www/inc/config/jv-conseil/dkim-php-mail-signature/config.inc.php') ;

// set: this calls __set()
$config->domain = "mynewdomain.name" ;

// get: this calls __get()
$config->domain ; // => "mynewdomain.name" ;

Introducing DKIMmail class

📬 Stand-alone class to send DKIM signed emails with a 2048 bit private key hashed with SHA-256 algorithm.

// init
$mail = new DKIMmail('/www/inc/config/jv-conseil/dkim-php-mail-signature/config.inc.php') ;

// parameters
$mail->from    = "Sender" <sender@yourdomain.com> ;
$mail->to      = "Recipient" <recipient@yourdomain.com> ;
$mail->subject = "Your Mail Subject" ;
$mail->body    = "Your Mail Message." ;
$mail->attach("/path/to/your/attachment.jpg", "NameOfYourAttachment.jpg") ;

// send!
$mail->send() ;

Documentation

Documentation is available online, though it may not be quite up to date or match your version exactly.

You can generate API documentation by running phpdoc in the top-level folder of this project, and documentation will be generated in this folder:

php ~/vendor/bin/phpdoc -d ~/dkim-php-mail-signature/ -t ~/dkim-php-mail-signature/docs/

You will need to have phpDocumentor installed.

Sponsorship

If this project helps you reduce time to develop, you can give me a cup of coffee ☕️ :-)

Become a sponsor to JV-conseil