Software development, photography, jokes, ....

Sites by me

 
tas-logoTransportation Administration System
snoezelkussen-logo-kleinstSnoezelkussens voor verstandelijk gehandicapten
ikzoekeenbegeleider-logoBegeleiders voor gehandicapten
Laat uw hond het jaarlijkse vuurwerk overwinnen
Betuweroute en Kunst
logo 50x50Hey Vos! Je eigen naam@vos.net emailadres?
Kunst in huis? Nicole Karrèr maakt echt bijzonder mooie dingen
nettylogo2Kunst in huis? Netty Franssen maakt ook bijzonder mooie dingen
Professionele opvang bij Gastouderbureau
Kind-Zijn
Salarisadministratie en belastingadvies bij
De Zaak Loont
Zutphense Bomenstichting

Hosting Favorites

 
ANU Internet Services
XelMedia .internet Services
register.com

Blogroll

 
Bomenstichting
LassoSoft
MacFreak
Quality that computes
The Economy of Motion
Wheel 2.0
IntrAktv



Website Hosting bij Xel Media

Marc's Place


 

Install PHPMailer on MacOS X 10.11 El Capitan or higher




Why use PHPMailer?


Nowadays, emails and their 'roots' are checked more and more to prevent spam. If you run your own server somewhere, like I do, and run various websites and domains for various customers, like I do, and each wants to have the ability to send emails, like I have, then you might run into problems when the mailserver is hosted elsewhere, normally with the registrar.

To illustrate this with a common example: you buy a domain name for a customer. In the DNS records, you only modify the server address for the website and you leave the mail server DNS record intact - it points to the mail server of your registrar.

Next, you send email from you server with PHP mail. The receiving mailserver checks the domain name and it leads back to your server. But the MX-records of your domain actually do not. They lead back to the servers of the company where you purchased that domain name. So there is the difference, and some mailservers accept this and others do not and see your server as a spammer.

Apple's iCloud , for example, does not care. I can send email from my server with 123.456.789.10 and it will arrive. The mailserver is actually the default mailserver of, say xel.nl or register.com . Sending the same email to a Microsoft hotmail or live account however, or some other email providers, does not work. These mailservers see the difference in IP-addresses and do not accept it.

So, to prevent being seen as a spammer, and to ensure your email arrives at its destination, you need to use the remote SMTP server of the domain, like your normal email apps.
But the default PHP mail function does not support this. And that is why some clever people created PHPMailer . 👍🏻

Check and prepare your PHP installation


1) Check your PHP installation for possible paths where PHPMailer can be installed

$ php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File: (none)
Scan for additional .ini files in: /Library/Server/Web/Config/php
Additional .ini files parsed: (none)


2) The instructions to install PHPMailer on Unix are to copy everything to /usr/share/php.
But on Mac OS 10.11 and higher, this is not possible anymore because of Apple's new System Integrity Protection . It is not allowed to put stuff in /usr anymore, because of enhanced security of MacOS X.

Therefore, I had to check my PHP installation first, to see what, how and where.
Open Terminal and take the following steps to create a PHP script which lists which paths PHP uses to look for files to include for the require-statements:

$ cd ~/downloads
$ vi test.php


Type, or copy/paste, the following lines in the editor:

#!/usr/bin/php
<?php
echo get_include_path();
?>


Save and quit.
To be able to run this script, add the exec authorization, and then run it:

$ chmod a+x test.php
$ php test.php

.:

What you see is that my default MacOS X PHP installation does not look in any paths, except . (= current working directory).
On your Mac, it may be different, but I doubt it. If it's different, copy this path, you need it later.

3) In step (1) you saw that my PHP installation does not use a php.ini file, which I found strange. I checked which files were actually there:

$ ls /etc/php.ini*
-r--r--r-- 1 root wheel 69266  9 sep 2015 /etc/php.ini.default
-r--r--r-- 1 root wheel 69266 26 feb 2015 /etc/php.ini.default-5.2-previous
-r--r--r-- 1 root wheel 65459 24 sep 2014 /etc/php.ini.default-5.2-previous~orig


Aha, there is one. I copied that one to be the new php.ini:

$ cd /etc
$ sudo cp php.ini.default php.ini


4) The next step is to edit this file and add a common include path to be used by PHP.
The new MacOS X allows us to put stuff in /usr/local/ and I decided I want to use /usr/local/share/php:

$ sudo vi php.ini

Find the text include_path. Remove the semicolon and replace the example path by pasting the previously copied path between the double quotes.
Next, add :/usr/local/share/php to the path. My include_path looks like this:

; UNIX: "/path1:/path2"
include_path = ".:/usr/local/share/php"


Save and quit.
Create that PHP folder, if it is not there yet:

$ sudo mkdir /usr/local/share/php

5) I checked again if PHP now uses the new php.ini and the new include path.

$ php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File: /etc/php.ini
Scan for additional .ini files in: /Library/Server/Web/Config/php
Additional .ini files parsed: (none)


$ php test.php
.:/usr/local/share/php

Download and install PHPMailer


6) Download PHPmailer as a zip file from https://github.com/PHPMailer/PHPMailer
phpmailer-github

7) Unzip and (re)move the examples folder and any other files/folders you do not need. Leave the languages folder.
For example, I moved the file extras/htmlfilter.php one level up into the PHPMailer-master folder and then deleted the extras folder.

Then in Terminal, and do not forget the slashes at the end of the paths, type the following command:

$ sudo cp -R ~/downloads/phpmailer-master/ /usr/local/share/php/

8) Check if the installation was successful by creating and running the following little PHP-script:

$ cd ~/downloads
$ vi test.php


Type, or copy/paste, the following lines of code to check if the installation works:

require 'PHPMailerAutoload.php';
$mail = new PHPMailer;


Save, quit and run it:

$ php ./test.php

If no errors occur, your installation succeeded.

Use a SMTP server with PHPMailer


9) And finally, to use a remote SMTP-server to avoid that your server IP will be listed as a spammer:

$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'mail.xel.nl'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'myuser'; // SMTP username
$mail->Password = 'mypass'; // SMTP password


Tips for using PHPMailer


When you use client-side editors as <textarea> replacements in your web-forms, like TinyMCE or CKeditor , or convert HTML < and > to &lt; and &gt; yourself, before writing the text into a database table, you might end up with these converted HTML characters in the emails you are sending out.

10) So, before you use this kind of text data, convert these characters back to normal characters first:

$maildata = htmlspecialchars_decode($mysqlresultobject->textfield, ENT_QUOTES | ENT_HTML401);

11) When you store multi-line data from a <textarea>, that data contains \n (= <LF> = Linefeed) as line endings.
For the HTML body, you have to replace \n with <br> for this text to arrive correctly:

$mail->Body = str_replace("\n", '<br> ', $maildata); // HTML email

For the plain text part, you might have to replace \n with \r\n:

$mail->AltBody = str_replace("\n", "\r\n", $maildata); // Plain text email

12) To sign your outgoing email with a logo, add an <img> tag to the end of the body:

$mail->Body .= '<br><img src="https://www.example.com/your-logo.png" alt="your-logo" height="36" /><br>';

12) And at last, to preserve special characters like ü, ç, é, ñ etc, in your emails, always start your new PHPMailer-object like this:

$mail = new PHPMailer;
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';


That's it! Happy coding!
© 1997- Marc Vos (and others) Contact Me