PHPMailer cli有效,cgi没有,为什么?

时间:2018-04-30 09:49:19

标签: php apache2 cgi phpmailer ssmtp

我有两台机器,安装了Ubuntu 16.04,php 7和PHPMailer的最新副本。电子邮件是使用ssmtp通过gmail发送的,它与sendmail存根相关联。如果我从命令行和cgi(Apache2)运行相同的程序(实际上是Wiki中的教程中的代码)命令行工作,而cgi没有,并给出错误消息“Mailer error:无法实例化邮件功能“。

请不要说阅读我的故障排除指南而且我很抱歉但是小批评它有点神秘,我不明白。 (我们所做的一切都是为了保持简洁和简单。)

但是,如果我检查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的耐心。

1 个答案:

答案 0 :(得分:0)

启用SMTP安全选项,并将端口更改为465。

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

设置SMTP邮件密码

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