PHP PEAR Mail存在问题

17

我正在尝试使用 PEAR Mail 来使用外部 SMTP 服务器发送邮件。它似乎会卡住一段时间,然后脚本就结束了。它输出了所有的 "echo" 语句,直到发送后的那个语句。在 "before send" 的 echo 后面没有任何输出。有人能告诉我这里可能出了什么问题吗?(smtp 值用虚拟值替换)。邮件未被发送。谢谢你的帮助!

echo "start";
$n = $_POST['txtName'];
$e = $_POST['txtEmail'];
$t = 'Kenny <email@host.com>';
$f = 'Kenny <email@host.com>';
$s = 'CPA TEST';
$b = "name: $n email: $e"; 

include("mail.php");
echo "after include";
/* mail setup recipients, subject etc */
$recipients = $t;
$headers["From"] = $f;
$headers["To"] = $t;
$headers["Subject"] = $s;
$mailmsg = $b;
/* SMTP server name, port, user/passwd */
$smtpinfo["host"] = "my_smtp_host";
$smtpinfo["port"] = "25";
$smtpinfo["auth"] = true;
$smtpinfo["username"] = "my_email";
$smtpinfo["password"] = "my_password";
echo "before object";
/* Create the mail object using the Mail::factory method */
$mail_object =& Mail::factory("smtp", $smtpinfo);
echo "before send";
/* Ok send mail */
$send = $mail_object->send($recipients, $headers, $mailmsg);
echo "after send";
if (PEAR::isError($send)) { print($send->getMessage());}else{print "end";} 
echo "done";
7个回答

49

如果某人在Linux上遇到与Jayme相同的问题,这里有另一个简单的解决方案可以安装缺失的"Net /"类。这些缺失的类会导致脚本中断。

sudo pear install Net_SMTP


1
这是解决我的方法。 - smoothgrips
这是我的解决方案。谢谢 ;) - daniherculano
1
在Windows下,只需执行pear install Net_SMTP即可完成安装,尽管如此,这对我仍然有所帮助! - LittleTreeX
你也可以运行 apt install php-net-smtp - Tofandel

16

我遇到了同样的问题,它在发送命令时停顿。我的第一步是从命令行运行,以查看完整的错误消息(正如上面Rap建议的那样)。

php mymailsample.php

它输出了以下内容

Warning:  include_once(Net/SMTP.php): failed to open stream: No such file or directory in mail/Mail/smtp.php on line 348
PHP Warning:  include_once(): Failed opening 'Net/SMTP.php' for inclusion (include_path='.:/usr/lib/php') in mail/Mail/smtp.php on line 348
PHP Fatal error:  Class 'Net_SMTP' not found inmail/Mail/smtp.php on line 349

我下载了以下文件,并将它们放在/Net目录下:

http://pear.php.net/package/Net_SMTP/download
http://pear.php.net/package/Net_Socket/download

我需要调整SMTP和Socket库的权限,以便Apache可以读取它们。

然后,就成功了!


11
如果可以从命令行运行pear,则只需运行sudo pear install Net_SMTP即可。 - Justin Jenkins

6

尝试以下方法以确保您的邮件正常工作:

<?php
require_once "Mail.php";

$from = "Sandra Sender <sender@example.com>";
$to = "Ramona Recipient <recipient@example.com>";
$subject = "Hi!";
$body = "Hi,\n\nHow are you?";

$host = "mail.example.com";
$username = "smtp_username";
$password = "smtp_password";

$headers = array ('From' => $from,
  'To' => $to,
  'Subject' => $subject);
$smtp = Mail::factory('smtp',
  array ('host' => $host,
    'auth' => true,
    'username' => $username,
    'password' => $password));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
  echo("<p>" . $mail->getMessage() . "</p>");
 } else {
  echo("<p>Message successfully sent!</p>");
 }
?>

如果这不起作用,那么您需要检查您的PHP配置。 有关更多信息,请参见http://php.net/manual/en/function.mail.php

你好。我测试了你的脚本,发现它和“真实”的代码有相同的效果。它会卡住,没有警告,没有错误。我的PHP配置包含error_reporting = E_ALL | E_STRICT以及display_errors = On。还有其他建议吗? - Joris Mans
1
按照Rap和Jayme Dunlap的建议,在命令行上运行它以查看错误。 - Todd Moses

4
重新安装channel://pear.php.net/Mail-1.2.0对我没用。(Ubuntu 12.04)
只需在new前删除字符"&"即可。
sudo vi /usr/share/php/Mail/smtp.php
    349         /*$this->_smtp = &new Net_SMTP($this->host, */
    350         $this->_smtp = new Net_SMTP($this->host,

1

Todd的脚本非常出色,但无法解决您的问题,即浏览器在SMTP之前超时。这就是为什么您只能看到页面的一半,而没有看到任何可用于调试SMTP设置的错误消息。

解决方案是直接运行PHP脚本。没有超时。

如果您无法执行此操作,因为您的ISP不提供shell访问权限,请创建一个每分钟运行的cron工作。 Cron将通过电子邮件向您发送输出,其中将包含完整的调试详细信息。


1

对于PHP版本7,您需要安装php-net-smtp:

sudo apt-get update
sudo apt-get install php-net-smtp

0

我曾经遇到过同样的问题。一个生产脚本崩溃了,我花了很长时间来排查它。主要是因为有太多的代码防止错误显示出来。最终,我使用了Kenny Ray的代码,修改它以适应我的环境,并进行了测试。结果发现Net_Socket不知怎么消失了。我卸载并重新安装了它,一切都重新开始工作了。希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接