使用 PEAR Mail 包发送邮件时出错

Posted

技术标签:

【中文标题】使用 PEAR Mail 包发送邮件时出错【英文标题】:Error while sending mail using PEAR Mail package 【发布时间】:2017-10-26 20:11:02 【问题描述】:

我正在尝试通过 php Pear Mail 包发送邮件,我这里有 2 个场景,在第一个场景中邮件发送正确,没有任何错误,但在第二个场景中我收到错误消息。

场景 1:

文件名:testmail.php

<?php
 require_once "Mail.php";

 $from = "erp@askspidy.com";
 $to = "support@askspidy.com";
 $subject = "Landing Page Enquiry From -";
 $body = "Hello just testing";

 $host = "ssl://mail.askspidy.com";
 $port = "465";
 $username = "support@askspidy.com";
 $password = "askspidy@1234";

 $headers = array ('From' => $from,
   'To' => $to,
   'Subject' => $subject,
   'MIME-Version' => 1,
    'Content-type' => 'text/html;charset=iso-8859-1'
   );

 $smtp = Mail::factory('smtp',
   array ('host' => $host,
     'port' => $port,
     '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>");
  
 ?>

如果我直接在 url 中运行文件,那么邮件发送没有任何错误。

场景 2: 文件名:sendmail.php

<?php


    function send_mail($subject,$body)
    
         require_once "Mail.php";

         $from = "erp@askspidy.com";
         $to = "support@askspidy.com";

         $host = "ssl://mail.askspidy.com";
         $port = "465";
         $username = "support@askspidy.com";
         $password = "askspidy@1234";

         $headers = array ('From' => $from,
           'To' => $to,
           'Subject' => $subject,
           'MIME-Version' => 1,
            'Content-type' => 'text/html;charset=iso-8859-1'
           );

         $smtp = Mail::factory('smtp',
           array ('host' => $host,
             'port' => $port,
             'auth' => true,
             'username' => $username,
             'password' => $password));


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

    

?>

现在我从不同的文件中调用这个 send_mail 函数

文件名:service/process.php

<?php

require_once("../sendmail.php");

$subject="Landing page enquiry";
$email_body="Hello Just Testing! ";

send_mail($subject,$email_body);

?>

当这个文件在浏览器中执行时,我在线收到错误消息

send_mail($subject,$email_body);

错误:

Warning: include_once(Net/SMTP.php): failed to open stream: No such file or directory in /usr/local/lib/php/Mail/smtp.php on line 348

Warning: include_once(): Failed opening 'Net/SMTP.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /usr/local/lib/php/Mail/smtp.php on line 348

Fatal error: Class 'Net_SMTP' not found in /usr/local/lib/php/Mail/smtp.php on line 349

在场景 1 中一切正常,那么为什么在场景 2 中我收到此错误,我猜路径有问题,但我不确定路径应该是什么以及我应该在哪里包含它。

文件夹结构:

在文件 Mail/smtp.php 中包含代码

 require_once "Net/SMTP.php";

注意:我在 Cpanel 账户中手动安装了 PEAR 包,并没有在 php.ini 文件中进行任何设置

【问题讨论】:

【参考方案1】:

您可以使用__DIR__作为当前文件的目录路径

require_once __DIR__ . "/Net/SMTP.php";

【讨论】:

您是否更改了所有的require_once。当你更改为这个时,错误信息是什么? 我在 'require_once "home/askspidy/public_html/Mail/Net/SMTP.php";' 中使用了这个路径,我收到相同的错误消息,对于我的场景 1,我还收到错误消息,例如 Fatal error: require_once(): Failed opening required 'home/askspidy/public_html/Mail/Net/SMTP.php' (include_path='. :/opt/php55/lib/php/php') 在 /home/saniserv/public_html/Mail/smtp.php 第 358 行 你为什么不使用我的代码。在这里,您无法将 __DIR__ 值更改为您的路径。你需要在你的代码中写require_once "__DIR__/Net/SMTP.php";__DIR__是一个php变量,代表当前文件的路径。 即使我添加 DIR 我也会遇到同样的错误,致命错误:require_once(): Failed opening required '__DIR__/Mail.php' (include_path=' .:/usr/lib/php:/usr/local/lib/php') __DIR__ 常量不会被插入到双引号字符串中。您需要使用. 来连接它。【参考方案2】:

将 dirname(FILE) 添加到代码中任何地方的路径名中,并且有效

require_once dirname(__FILE__)."/Net/SMTP.php";

【讨论】:

以上是关于使用 PEAR Mail 包发送邮件时出错的主要内容,如果未能解决你的问题,请参考以下文章

PHP Pear Mail 无法发送带有 Unicode 字符的名称

这个使用 Pear Mail 发送邮件的 PHP 脚本有啥问题?

使用 PEAR 邮件发送测试消息时出现错误消息

如何使用 Pear 邮件发送数字签名电子邮件

使用 PHP PEAR MAIL 发送多个 CC 和 BCC

使用 Pear Mail 发送纯文本和 html 电子邮件(如何设置“Content-Type”并正确使用边界)