无法使用Zend库发送邮件

时间:2012-01-26 03:32:04

标签: php zend-framework email

require_once 似乎无效。我试图使用Zend库来发送邮件,但有些东西不起作用。我正在使用我的网络托管服务器提供商,所以我必须将库放在一个子目录中(不安装任何框架)。

// $path= dirname(__FILE__)."/ZendLibrary:".get_include_path() ;
$path= "./ZendLibrary".PATH_SEPARATOR.get_include_path() ;
set_include_path($path);
//echo $path ;

echo "Spot 0" ;
require_once 'Zend/Mail.php';
echo "Spot 1" ;

收到了“Spot 0”消息但我没有收到“Spot 1”消息。我只选择了两个Zend库:

 ZendLibrary/Zend/Mail/* (directory)
 ZendLibrary/Zend/Mime/* (directory)
 ZendLibrary/Zend/Mail.php (script)
 ZendLibrary/Zend/Mime.php (script)

ZendLibrary是我脚本所在目录中的一个文件夹。会发生什么事?

更新#1:

我的问题是,当我运行 require_once 时,代码会停止正常工作。它不会回显“Spot 1”消息。我已经尝试了 set_include_path 的绝对路径,我试图在没有内部require_once语句的情况下加载.php库脚本,但没有任何东西可以使它工作。由于我的测试是从互联网上的网络托管网站运行的,我无法访问日志!..还是我?

$path= realpath(dirname(__FILE__).'/ZendLibrary').PATH_SEPARATOR.get_include_path() ;
// $path= "./ZendLibrary".PATH_SEPARATOR.get_include_path() ;
set_include_path($path);

4 个答案:

答案 0 :(得分:1)

Zend Mail有一些dependencies。 硬依赖

  1. Zend_Exception异常
  2. 那么Zend_Loader
  3. Zend_Mime
  4. Zend_Validate的
    • 从Zend_Locale
    • Zend_Date的运算
    • Zend_Filter的
    • 要是Zend_Registry

    最好的是PHP中的add all Zend library to the include path,所有组件都会自动加载依赖项。

答案 1 :(得分:0)

您还没有遇到所有依赖项...至少您还需要Zend_Exception(框架中所有特定于组件的异常都会扩展为此形式)但我非常确定还有其他Mail和{ {1}}取决于。为了方便自己,我还会抓住Mime并将其用于自动加载。

<强>更新

我看了一下,好像你还需要Zend/LoaderZend/Validate这是Zend/Loader组件中某个类所必需的 - 虽然Mail只使用{{1 (这取决于Validate和Validate的抽象类和接口),所以你可以逃脱而不是抓住Zend/Validate/Hostname,但你可能也会利用它用于通用自动加载。

作为一个建议,你可以使用Zend_Validate_Ip] 1代替......你将成为避免依赖地狱的罢工,无论如何我更喜欢它。只有它是用于发送邮件的,而Zend/Loader也可以让你在本地或远程服务器上读取邮件存储。

答案 2 :(得分:0)

之前我使用Zend_Mail和SMTP独立,这里是我需要的文件。如果你只想使用sendmail,我也会把它减少到你所需要的。

如果您想使用Sendmail,那是最简单的。您的依赖项是:

  • 的Zend / Exception.php
  • 的Zend / Mail.php
  • 的Zend / Mime.php
  • 的Zend /邮件/ Exception.php
  • 的Zend /邮件/运输/ Abstract.php
  • 的Zend /邮件/运输/ Exception.php
  • 的Zend /邮件/运输/ Sendmail.php
  • 的Zend / MIME / Exception.php
  • 的Zend / MIME / Message.php
  • 的Zend / MIME / Part.php

使用这些文件,这是一个使用示例:

<?php
// optionally
// set_include_path(get_include_path() . PATH_SEPARATOR . '/path/to/Zend');

require_once 'Zend/Mail.php';
require_once 'Zend/Mail/Transport/Sendmail.php';

$transport = new Zend_Mail_Transport_Sendmail();

$mail = new Zend_Mail();
$mail->addTo('user@domain')
     ->setSubject('Mail Test')
     ->setBodyText("Hello,\nThis is a Zend Mail message...\n")
     ->setFrom('sender@domain');

try {
    $mail->send($transport);
    echo "Message sent!<br />\n";
} catch (Exception $ex) {
    echo "Failed to send mail! " . $ex->getMessage() . "<br />\n";
}

如果您需要SMTP,那么正如prodigitalson所示,您还有一些依赖关系。除了上述内容,您至少需要:

  • 的Zend / Loader.php
  • 的Zend / Registry.php
  • 的Zend / Validate.php
  • 的Zend /邮件/协议/ Abstract.php
  • 的Zend /邮件/协议/ Smtp.php
  • 的Zend /邮件/运输/ Smtp.php
  • 的Zend /验证/ Abstract.php
  • 的Zend /验证/ Hostname.php
  • 的Zend /验证/ Interface.php
  • 的Zend /验证/ Ip.php
  • 的Zend /验证/主机名/ *
  • 的Zend /邮件/协议/ SMTP /认证/ *

然后你可以这样做:

<?php

require_once 'Zend/Mail.php';
require_once 'Zend/Mail/Transport/Smtp.php';

$config    = array(//'ssl' => 'tls',
                   'port' => '25', //465',
                   'auth' => 'login',
                   'username' => 'user',
                   'password' => 'password');

$transport = new Zend_Mail_Transport_Smtp('smtp.example.com', $config);

$mail = new Zend_Mail();
$mail->addTo('user@domain')
     ->setSubject('Mail Test')
     ->setBodyText("Hello,\nThis is a Zend Mail message...\n")
     ->setFrom('sender@domain');

try {
    $mail->send($transport);
    echo "Message sent!<br />\n";
} catch (Exception $ex) {
    echo "Failed to send mail! " . $ex->getMessage() . "<br />\n";
}

答案 3 :(得分:0)

<强>答案:

我的ISP(也是网络托管)设置为禁用 require_once 。我能够在VirtualBox上设置一个Unbuntu虚拟机并设置一个Web服务器。我在我的Unbuntu中复制了我的测试网站的内容,并发现require_once确实按预期工作!这也许可以解释为什么服务器端包含对我来说也不起作用。以下是一个有用的检查,它表明我的文件在预期的位置。

$file = 'ZendLibrary/Zend/Mail.php'; 

if ((!is_file($file)) or (!is_readable($file))) 
   die("File does not exists or is not readable."); 

现在我必须找出它被禁用的原因,如何启用它,或者只是切换网络托管公司。 更新:我必须每年为提供商支付20美元的费用才能启用PHP(在这种情况下可以包含)。

This site可以告诉你更多相关信息。