【问题标题】:PHP cron send mail many timesPHP cron多次发送邮件
【发布时间】:2013-09-06 12:37:01
【问题描述】:

我有一个脚本可以生成我的大数据库的报告数据。
我创建了一个 cron,每周在 Sundat 23:00 生成此报告并将其发送到许多电子邮件。
如果我直接运行脚本(在浏览器中复制 php 脚本的链接并启动它),脚本可以正常工作,因为每个客户端都可以向我发送我想要的电子邮件。

如果 cron 启动脚本,我只收到第一个客户的电子邮件,而不收到另一个客户的电子邮件,我收到的电子邮件数量是正确的,但不是客户的。示例:
我必须有 5 个客户名称:a、b、c、d、e。
如果我直接在浏览器中启动脚本,我会收到:
一封电子邮件
给 b 的一封电子邮件
给 c 的一封电子邮件
给 d 的一封电子邮件
一封电子邮件

如果 cron 启动我收到的脚本:
5 封电子邮件

这怎么可能?剧本是一样的! cron 脚本在 crontab 中:

0 23    * * 0   root    wget http://127.0.0.1/reports/generate_reports_settimanale.php

另一个考虑因素是这个脚本需要大约 30 分钟或更长时间,因为我有大量数据和很多客户端。

PHP中的脚本很大,我删掉了部分数据计算器。

<?php
$db = DataManager::_getConnection();
ini_set("include_path", "../inc/phpmailer/");
require("class.phpmailer.php");
ini_set("memory_limit","64M");

//-----------------------------------REPORT SETTIMANALE------------------------------------------

$qry_inv = $db->query("SELECT * FROM customer WHERE ntype > 0 AND report_settimanale='1' ORDER BY name ASC");
while( $inv = $qry_inv->fetch_array() ) {
    //check if table exists
    $qry_tb = $db->query("SHOW TABLES LIKE 'chart_voltage_".$inv['id']."_".date('Y')."'");
    if($qry_tb->num_rows > 0){
        //saving the excel sheet
        //...
        //sending the emails
        $yourName = 'CLIENT';

        $mail = new PHPMailer();

        $mail->From     = 'email@email.com';
        $mail->FromName = 'Saeg';
        $mail->AddAddress('my_email@my_em.it'); 

        $mail->AddAttachment('/var/www/reports/my_reports.xls');

        $mail->WordWrap = 50;                              // set word wrap
        $mail->IsHTML(true);                               // send as HTML

        $mail->Subject  =  'Riepilogo settimanale dal '.$week_start_title.' al '.$week_end_title;

        $mail->Body     =  "Riepilogo settimanale dell'impianto: ".utf8_decode($inv['name']);

        $mail->AltBody  =  "Riepilogo settimanale dell'impianto: ".utf8_decode($inv['name']);

        if ( $mail->Send()){
            //ok
        }
        else{
        ?>
            <script type="text/javascript">
                alert('<?php echo ("ERROR");?>');
                window.close();
            </script>
        <?php
        }
    }
}

exit;

?>

我不知道问题是否出在脚本的持续时间...因为这是不可能的,如果我在浏览器中启动它可以正常工作并且没有 cron... 这是不可能的。为什么?

【问题讨论】:

  • 如果脚本与具有 cronjob 的服务器位于同一台服务器上,为什么不像 /usr/bin/php /path/to/the/script.php 一样运行它?
  • 因为不工作并且 wget 在 cron @mishu 内工作
  • 好的,我明白了.. 仅从这部分我看不到在 CLI 中不起作用的部分,除了相对路径和另一种类型的错误处理.. 但你知道你的系统当然:)
  • 如何将客户端添加到邮件中?
  • 以这种简单的方式,每次都能正常工作 $mail->AddAddress('my_email@my_em.it'); @artmees

标签: php email cron


【解决方案1】:

没有明显的理由说明代码在使用 wget 而不是浏览器时会有不同的行为。

您的代码中没有任何工具来记录其正在执行的操作 - 这可能会为您提供有关其失败原因的线索。作为最低要求,您应该确保您的 php 配置记录了错误,并检查相关日志是否有错误。

但是,期望持续 30 分钟的 HTTP 请求成功是相当乐观的。如果您可以在机器上设置 cron 作业,那么直接调用脚本而不是通过网络服务器和 http 客户端调用会更有意义:

0 23 * * 0   root /usr/bin/php -q /var/www/html/reports/generate_reports_settimanale.php

(将 /var/www/html 替换为您的文档根目录)。

【讨论】:

  • 这个 cron 似乎不起作用...我已经检查并且没有内部进程,我在 system.log 中没有错误没有发送邮件...
  • 但是您说“我只收到第一个客户的电子邮件,而没有收到另一个客户的电子邮件”-也许您需要返回并更彻底地重新测试一下
  • 但问题是另一个。为什么在浏览器中工作正常而在 cron 中却不行。我认为问题在于在这种情况下如何调用 php 脚本
猜你喜欢
  • 2018-11-15
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 2012-01-21
  • 2015-06-24
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多