【问题标题】:unable to send emails from cakephp shell on ubuntu server无法从 ubuntu 服务器上的 cakephp shell 发送电子邮件
【发布时间】:2011-07-28 15:20:28
【问题描述】:

我无法从本地服务器上的 cakephp shell 接收电子邮件。

我已经建立了一个 ubuntu 服务器,并且 report.php 位于 myapp/vendors/shellsreport.php 包括:

<?php 
class EmailShell extends Shell {    

    function main() {
        App::import('Core', 'Controller');
        App::import('Component', 'Email');
        $this->Controller =& new Controller();
        $this->Email =& new EmailComponent(null);
        $this->Email->initialize($this->Controller);

        $this->Email->to = 'me@gmail.com';
        $this->Email->subject = 'spain';
        $this->Email->from = 'blabla <me@gmail.com>';
        $this->Email->send('test email');
        $this->out('email sent');
    }

}
?>

我可以在控制台中运行此 shell 并接收“已发送电子邮件”输出,但我的收件箱中没有电子邮件。我还可以在控制器中运行类似的操作,成功将电子邮件发送到我的电子邮件地址。在这两种情况下,当电子邮件脚本运行时,它会在成功/不成功发送电子邮件之前挂起 1 分钟

我很欣赏这有很多变数,但由于我能够从控制器发送电子邮件,但不能从 shell 发送电子邮件,我认为这消除了服务器问题。

非常感谢任何帮助。

【问题讨论】:

  • 发送本地邮件应该是即时的。您是否使用了一些可能会超时的外部 SMTP 服务器,从而导致回退到本地服务?
  • 我没有外部 SMTP 服务器(我不认为)只是安装了 sendmail 的本地 ubunter 服务器

标签: php email cakephp ubuntu


【解决方案1】:

这可能是 DNS 问题 - 如果 sendmail 没有作为守护程序运行,它会在每个邮件发送事件时启动。如果 sendmail 在启动时无法查找/解析服务器的主机名,它将等待 DNS 查找超时。最终它会继续,但每次 sendmail 启动时都会进行此查找。

【讨论】:

    【解决方案2】:

    这是一个非常奇怪的情况。它完全可以从控制器工作是令人毛骨悚然的。 *nix 发行版默认喜欢滚动 sendmail。 PHP 将能够从控制器发送电子邮件,因为 PHP 作为系统用户运行,通常具有 Apache 的权限。另一方面,Cron 会获取调用它的人(即你)的权限,除了(quel shock!)邮件服务器等东西。然后还有其他两千万可能阻止 cron 使用的东西发邮件。

    或者,嘿,那些 Google SMTP 设置怎么样::)

    $this->Email->smtpOptions = array(  'port'=>'465',
                                        'timeout'=>'30',
                                        'host' => 'ssl://smtp.gmail.com',
                                        'username'=>'you@gmail.com',
                                        'password'=>'frosting',
                                );
    

    请注意,我自己之前没有在 shell 中设置过 gmail,所以没有任何承诺,但这直接来自我服务器上的控制器,对我来说效果很好。

    -- $this->Email->send() 是实际发送,还是只是没有出错?

    if($this->Email->send('test email')) {
        $this->out('email sent');
    } else {
        $this->out('email falled');
    }
    

    -- 如果它说它正在发送,它试图发送什么?

    $this->Email->delivery = 'debug';
    // Untested, but you get the idea
    $mail = $this->Email->send();
    $this->out($mail);
    

    除了在 app/tmp/logs/、/var/log/message、maillog、secure 和 Apache 的服务器日志中的 Cake 的应用程序日志(如果需要,打开调试和日志记录),都会反映这一点。

    -- HTH :)

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 1970-01-01
      • 2021-06-17
      • 2021-01-25
      • 2013-04-08
      • 2013-04-01
      • 2012-06-14
      • 2016-10-07
      • 2018-07-27
      相关资源
      最近更新 更多