У меня есть две машины с установленными копиями 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 = '[email protected]';
$email->FromName = 'Frank';
$email->Subject = 'Test Email';
$email->Body = $bodytext;
$email->AddAddress( '[email protected]' );
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 = '[email protected]'; # replaced by google with Username
$email->FromName = 'Appears in From ahead of your gmail address';
$email->Sender = '[email protected]'; # not visible to recipient
$email->Subject = 'Appears in the subject field';
$email->Body = $bodytext;
$email->AddAddress( '[email protected]' );
$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 за его терпение.
Фрэнк
включить SMTP
безопасный вариант, а также изменить порт на 465.
$mail->SMTPSecure = 'ssl';
$mail->Port = 465; // set the SMTP port
Установить пароль почты SMTP
$mail->Password = "mailpassword"; // SMTP password
Других решений пока нет …