PHPMailer Cli работает, CGI не, почему? - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть две машины с установленными копиями Ubuntu 16.04, php 7 и PHPMailer. Сообщения отправляются через Gmail с использованием ssmtp и связанной с ним заглушки sendmail. Если я запускаю ту же программу (фактически код из учебника в Wiki) из командной строки и cgi (Apache2), командная строка работает, а cgi - нет, и выдает сообщение об ошибке «Ошибка почтовой программы: не удалось создать экземпляр почты функция ".

Пожалуйста, не говорите, прочитайте руководство по устранению неполадок, которое у меня есть, и извините, но небольшая критика, это немного загадочно, я не понимаю. (Что-то, что мы все делаем, пытаясь сделать это коротким и простым.)

Однако, если я проверяю файл php.ini, они одинаковы в областях, влияющих на электронную почту.

Есть ли требуемая разница, которую я пропустил? Что не так?

<?php

require_once('phpmailer.php');
require_once('exception.php');

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

$bodytext = "This is a test EMail sent from the sever.    

Frank\n";

$email = new PHPMailer();
$email->From      = 'reception@xxx.xxx.uk';
$email->FromName  = 'Frank';
$email->Subject   = 'Test Email';
$email->Body      = $bodytext;
$email->AddAddress( 'frank@xxxx.xxx.uk' );

return $email->Send();

echo "Done";

?>

Я знаю, что это мусор для cgi, но дело в том, что он должен работать в обоих.

В журнале mail.err отображается

Apr 30 10:14:02 Desktop-Frank sSMTP[5579]: Unable to connect to "smtp.gmail.com" port 597.
Apr 30 10:14:02 Desktop-Frank sSMTP[5579]: Cannot open smtp.gmail.com:597

Что соответствует сообщению об ошибке интерфейса.

Я предполагаю, что часть данных отсутствует или отличается между двумя методами. Возвращенное сообщение об ошибке из ssmtp неправильно понимается.

Я даже пытался обновить php.ini, чтобы дать полностью разрешенный путь к двоичному заглушке sendmail.

Может кто-нибудь помочь мне решить эту проблему?

Спасибо, Фрэнк

ОБНОВЛЕНИЕ: рабочий код в обеих средах

Я до сих пор не понимаю, почему оригинальный код не работал в среде cgi, но хорошие новости: следующие программы работают как в cgi, так и в cli!

Не забудьте поместить phpmailer.php, exception.php и smtp.php в / usr / share / php / и посмотреть имена файлов.

<?php

require_once('phpmailer.php');
require_once('exception.php');
require_once('smtp.php');

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;

$bodytext = "This is a test EMail sent from the sever.";

$email = new PHPMailer();
$email->From      = 'xxx@xxx.xx.xx'; # replaced by google with Username
$email->FromName  = 'Appears in From ahead of your gmail address';
$email->Sender    = 'xxx@xxx.xx.xx'; # not visible to recipient
$email->Subject   = 'Appears in the subject field';
$email->Body      = $bodytext;
$email->AddAddress( 'xxx@xxxx.xx.xx' );
$email->AddAttachment( '/fullpath/file.name' );
$email->isSMTP();
$email->SMTPAuth = true;
$email->SMTPDebug = 4; # lots of debug 0 for production
$email->SMTPSecure = 'tls';
$email->Port = 587;
$email->Username = 'gmail email address';
$email->Password = 'gmail password';
$email->Host = 'smtp.gmail.com';

echo "<table border=1>\n";
echo "<tr><td>Name</td><td>Value</td></tr>\n";
foreach($email as $key=>$item) {
    echo "<tr><td>".$key."</td><td>".$item."</td></tr>\n";
}
echo "</table>";

return $email->Send();

echo "Done";

?>

Спасибо всем, особенно Synchro, за его терпение.

Frank

1 Ответ

0 голосов
/ 30 апреля 2018

Включить SMTP безопасный вариант, а также изменить порт на 465.

$mail->SMTPSecure = 'ssl'; 
$mail->Port       =  465;                    // set the SMTP port

Установить пароль почты SMTP

$mail->Password   = "mailpassword";  // SMTP password
...