У меня есть две машины с установленными копиями 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