Reputation: 41
I have been using PHPMailer 5.2 with a standalone LAMP server and it has been working fine. However, after studying more modern ways to set up a webserver, I tried docker-compose
with php8 and apache2.
PHPMailer also got an updated version, and I am having trouble how to use the updated PHPmailer (version 6.4.1) with docker-compose
.
My configuration for docker-compose:
version: "3"
services:
webserver:
build:
context: ./bin/${PHPVERSION}
container_name: '${COMPOSE_PROJECT_NAME}-${PHPVERSION}'
restart: 'always'
ports:
- "${HOST_MACHINE_UNSECURE_HOST_PORT}:80"
- "${HOST_MACHINE_SECURE_HOST_PORT}:443"
links:
- database
volumes:
- ${DOCUMENT_ROOT-./www}:/var/www/html
- ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
- ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
- ${LOG_DIR-./logs/apache2}:/var/log/apache2
- ./config/opt:/opt
environment:
APACHE_DOCUMENT_ROOT: ${APACHE_DOCUMENT_ROOT-/var/www/html}
PMA_PORT: ${HOST_MACHINE_PMA_PORT}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
database:
build:
context: "./bin/${DATABASE}"
container_name: '${COMPOSE_PROJECT_NAME}-database'
restart: 'always'
ports:
- "127.0.0.1:${HOST_MACHINE_MYSQL_PORT}:3306"
volumes:
- ${MYSQL_DATA_DIR-./data/mysql}:/var/lib/mysql
- ${MYSQL_LOG_DIR-./logs/mysql}:/var/log/mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: '${COMPOSE_PROJECT_NAME}-phpmyadmin'
links:
- database
environment:
PMA_HOST: database
PMA_PORT: 3306
PMA_USER: root
PMA_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
ports:
- '${HOST_MACHINE_PMA_PORT}:80'
volumes:
- /sessions
- ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/conf.d/php-phpmyadmin.ini
redis:
container_name: '${COMPOSE_PROJECT_NAME}-redis'
image: redis:latest
ports:
- "127.0.0.1:${HOST_MACHINE_REDIS_PORT}:6379"
php runs fine. Now, as per the documentation for PHPMailer, I downloaded the package as zip file and unzipped it under the folder having my email.php
file.
The directory structure is,
www
'--php/
'-----/email.php
'-----/PHPMailer-master/
'----------------------/src
'-------------------------/PHPMailer.php
'-------------------------/POP3.php
'-------------------------/SMTP.php
'-------------------------/Exception.php
'-------------------------/OAuth.php
The content of the email.php
file is below:
<?php
//Import PHPMailer classes into the global namespace
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
//Import the PHPMailer class into the global namespace
require './PHPMailer-master/src/Exception.php';
require './PHPMailer-master/src/PHPMailer.php';
require './PHPMailer-master/src/SMTP.php';
//----------------------------------------
$title='<h2><p style="color:DarkBlue ;">SAMPLE title</h2></p><br> ';
$msg1='<p style="color:Black ;">sample message </p>';
$sampleTxt=$title.$msg1;
//----------------------------------------
//Create a new PHPMailer instance
$mail = new PHPMailer();
$mail->isSMTP();
//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
$mail->Port = 587;
//Set the encryption mechanism to use - STARTTLS or SMTPS
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
//Whether to use SMTP authentication
$mail->SMTPAuth = true;
//Username to use for SMTP authentication - use full email address for gmail
$mail->Username = '<[email protected]>';
//Password to use for SMTP authentication
$mail->Password = '<my_password>';
//Set PHPMailer to use the sendmail transport
$mail->isSendmail();
//Set who the message is to be sent from
$mail->setFrom('<[email protected]>', 'Name');
//Set an alternative reply-to address
////Set who the message is to be sent to
$mail->addAddress('<[email protected]>', 'Receiver');
//Set the subject line
$mail->Subject = 'PHPMailer sendmail test';
//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
//$mail->msgHTML(file_get_contents('contents.html'), __DIR__);
$mail->Body = $sampleTxt;
//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';
//send the message, check for errors
if (!$mail->send()) {
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo 'Message sent!';
}
Upon executing the php file, I receive Error as : Mailer Error: Could not execute: /usr/sbin/sendmail -t -i
Could someone help regarding this? Thanks.
PS:
1.) I do provide the correct email addresses in the php file which I have replaced here.
2.) I am trying to use Gmail for sending emails.
Many examples on the internet mention the need to use, require 'vendor/autoload.php';
but I do not have this directory in my folder or in any include_paths
.
composer:
restart: 'no'
container_name: composer
image: "composer"
command: install
volumes:
- ./config/composer:/app
Inside the config/composer folder is the composer.json with
{
"require": {
"phpmailer/phpmailer": "^6.2"
}
}
Added the above lines in the yml file, and composer gives error as ,
composer | - Installing phpmailer/phpmailer (v6.4.1): Extracting archive
composer | 5 package suggestions were added by new dependencies, use `composer suggest` to see details.
composer | Generating autoload files
composer | 1 package you are using is looking for funding.
composer | Use the `composer fund` command to find out more!
composer exited with code 0
Upvotes: 2
Views: 4261
Reputation: 41
This was solved by the installation of composer with docker-compose. The following block was included in the docker-compose.yml
composer:
restart: 'no'
container_name: composer
image: "composer"
command: install --no-suggest
volumes:
- ./www/admin/php:/app
The last line above defines the location where phpmailer will be installed. Inside this folder we keep the php script which will use phpmailer.
Inside the folder /www/admin/php/
, composer will create a folder vendor
in which there is script called autoloader.php
as well as phpmailer
source.
Hence, inside the folder /www/admin/php/
the script mail.php
is placed whose content is below.
<?php
//Import PHPMailer classes into the global namespace
//These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
//Load Composer's autoloader
require 'vendor/autoload.php';
//-------------------------------------------------------
// this function (for sending email) needs editing the sender's email details
function send_email($receiver, $receiver_name, $subject, $body_string){
// SERVER SETTINGS
$mail = new PHPMailer(true);
$mail->isSMTP(); //Send using SMTP
$mail->Host = 'smtp.gmail.com'; //Set the SMTP server to send through
$mail->SMTPAuth = true; //Enable SMTP authentication
$mail->Username = '<username at gmail.com>'; //SMTP username
$mail->Password = '<login password>'; //SMTP password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; //Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged
$mail->Port = 587;
//-------------------------------------------
//Recipients (change this for every project)
$mail->setFrom('<from address email>', '<name>');
$mail->addAddress($receiver, $receiver_name); //Add a recipient
$mail->addReplyTo('<reply to email address>', '<name>');
//Content
$mail->isHTML(true); //Set email format to HTML
$mail->Subject = $subject;
$mail->Body = $body_string; // html
//send the message, check for errors
if (!$mail->send()) {
//echo 'Mailer Error: ' . $mail->ErrorInfo;
return 0;
} else {
//echo 'Message sent!';
return 1;
}
}
//----------------------------------------------------------------------
// set parameters
$subject = 'string';
$body_string = 'Hello,<br><br>Some message.<br> This is an example.';
$receiver='<receiver email>';
$receiver_name='<receiver's name>';
// set email
$result = send_email($receiver, $receiver_name, $subject, $body_string);
?>
This works well, and also with the examples given in phpmailer documentation and examples.
Upvotes: 2