【问题标题】:Outputting an echo statement to another page without running the first page在不运行第一页的情况下将 echo 语句输出到另一页
【发布时间】:2016-05-04 22:09:28
【问题描述】:

我正在使用 PHPMailer,并且有一个 test.php 文件。每当在浏览器中重新加载此页面时,test.php 文件就会执行并发送电子邮件消息并回显所使用的电子邮件地址。我有一个 cronjob 设置,每天执行一次。我创建了另一个文件body.php,其中包括:

<?php
$homepage = file_get_contents('http://www.myrealsite.com/mailer/test.php');
echo $homepage;
?>

这会返回我想要的信息,这基本上只是我发送电子邮件的人的输出,但问题是:每次我重新加载 body.php 时,它都会执行 test.php 文件并再次发送电子邮件。我希望能够在不运行body.php 的情况下重新加载body.php。我是新手。

【问题讨论】:

  • 这里有一件事我不明白,我很犹豫是否要发布答案(好吧,我之前做过,但我最终删除了它)。您正在加载一个包含 phpmailer 代码的文件,但您正在使用具有相同代码的 cron 作业。
  • 你问的是不可能的。您不能使用 file_get_contents() 运行包含 phpmailer 代码的文件并在 cron 作业中使用它。这是一个或另一个。
  • 也许我在做一些愚蠢的事情,但让我试着澄清一下。每当test.php 在浏览器中重新加载时,它都会发送电子邮件。我创建了一个 cronjob 来自动执行该文件,每天一次。它做到了。因此,无论何时加载/执行该文件,无论是通过我手动执行还是通过 cronjob 在计划时执行,它都会发送邮件。
  • 我正在整理另一个答案,请给我一分钟左右。我想我有你应该使用的东西。
  • 我取消删除并覆盖了我原来的内容。看看那个。

标签: php phpmailer


【解决方案1】:

您可以通过在对 body.php 的调用中添加一个参数来加载 body.php,而无需发送电子邮件:

http://whatever.your.server.is/body.php?send=no

然后,您只需要 $_GET 该参数并实现一个简单的 IF:

if (!$_GET['send'] != 'no'){
    //send the e-mail

【讨论】:

  • 我不希望我的电话是:http://whatever.your.server.is/test.php?send=no
  • 是的,假设你的脚本是test.php,也是一样的想法。
【解决方案2】:

好的,我想通了。我的 cronjob 最初是这样的:

0 17 * * * php /var/www/html/mailer/test.php &gt;&gt; /var/www/html/mailer/cron_status.log

这将在每天下午 5 点执行test.php 文件并写入此cron_status.log 文件。通过删除一个 &gt; 并将 cronjob 更改为:

0 17 * * * php /var/www/html/mailer/test.php &gt; /var/www/html/mailer/cron_status.log

删除cron_status.log 中的内容并将其写入。然后对于body.php,我刚刚使用:

$emailLog = file_get_contents("http://www.bartdangus.com/mailer/cron_status.log"); echo $emailLog;

现在显然最好有一个日志文件记录所有内容,但我需要满足的要求不包括记录所有内容,我只需要过去 24 小时内发生的事情。

【讨论】:

  • 很高兴看到您得到了您想要的解决方案。但是,我需要注意的是,如果您需要回溯失败的邮件,您将陷入困境。
  • 是的,我知道这会是个问题。
【解决方案3】:

每当您运行 body.php 时,它都会向 test.php 发出 http 请求,因此它会发送电子邮件。如果我理解正确,您希望列出 Cron Job 运行时向其发送电子邮件的所有电子邮件地址。

因此,最好将结果保存在单独的文本文件中,然后在 body.php 中读取该文件。像这样,在你的 cron 文件(test.php)中:

$yourFile = fopen("email_logs.txt", "a"); //make sure this file is writeable by php

$fileContents = date('Y-m-d H:i:is')."\r\n"; //write the time of file saved
$fileContents .= 'email_address_here'; //all email addresses here
$fileContents .= '\r\n=======\r\n'; //a separator line.

fwrite($yourFile, "\n". $fileContents);
fclose($yourFile);

在您要阅读电子邮件的其他文件中,执行以下操作:

$emailLog = file_get_contents("http://www.myrealsite.com/mailer/email_logs.txt");

【讨论】:

  • 旁注:文本文件最好使用时间/日期附加名称,因为该文件可能会随着时间的推移而变得相当大。
  • 我注意到您投了反对票,但我不知道为什么。那不是我的,如果你想知道的话。
  • 我不在乎投反对票,只要它可以为读者提供有关如何解决此问题的总体思路。对于您的旁注,是的,这是一个好主意,但我认为他还想使用 php 列出数据,因此将迭代所有文件并显示在此阶段会变得复杂的所有数据,因为他说他是新的在 php 中。
【解决方案4】:

你问的是不可能的。您不能使用 file_get_contents() 运行包含 phpmailer 代码的文件并在 cron 作业中使用它。你可以,但这就是为什么它没有像你希望的那样为你工作。

  • 这是其中之一。

旁注:用于捕获每封电子邮件地址的方法和数组未知。

所以,基于以下内容,写入文件并从中读取,并检查文件是否首先存在。

body.php

<?php 

if(file_exists('/path/to/email_sent_to.txt')){
    $show_emails = file_get_contents('/path/to/email_sent_to.txt');
    echo $show_emails;
}

您的 cron 作业文件,效果如下:

<?php 

// your phpmailer code

$emails = array("email1@example.com", "email2@example.com", "email3@example.com");

foreach($emails as $value) {

    $value = $value . "\n";
    $file = fopen("email_sent_to.txt", "a");
    fwrite($file, $value);
    fclose($file);

}

上面将写入文件的内容为:

email1@example.com email2@example.com email3@example.com

脚注:

您可能希望为文件命名约定使用日期/时间格式,否则该文件可能会随着时间的推移变得相当大。这只是一个建议。

即:

$prefix = "email_logs_";
$date = date('Y-m-H');

$time = date('h_i_s'); 

$logfile = $prefix . $date . "_" . $time . ".log";

这会创建类似email_logs_2016-05-23_11_59_40.log 的东西。

然后使用 PHP 的 filemtime() 函数根据当前写入的文件读取您的文件。

从这个问题中借用,并在使用日期/时间文件命名约定时使用不同的方法,正如我已经建议你做的那样:

How to get the newest file in a directory in php

$files = scandir('logfiles', SCANDIR_SORT_DESCENDING);
$newest_file = $files[0];

【讨论】:

  • phpmailer 代码仅包含在 test.php 中,并且 cron 作业执行该文件。对于body.php,我唯一要做的就是显示上次执行test.php 时发送的电子邮件。目前,当执行 cronjob 时,它会将结果记录到 cron_status.log
  • @BartDangus 我在这里很困惑。
  • @BartDangus 那么为什么在 body.php 中使用file_get_contents('http://www.myrealsite.com/mailer/test.php') 是我不明白的。您已经在 cron 中使用 test.php 发送邮件。所以获取日志文件的内容而不是 test.php
  • 对。我只是想有一个单独的页面,它将只显示我上次发送的电子邮件,并且使用 file_get_contents 是我想出的。
  • @BartDangus 啊...现在我知道全貌了 ;-) 好吧,这就是事情开始变得更复杂的地方(但并非不可能),就像我建议的那样在我的脚注中使用日期/时间命名约定...但是您需要使用条件语句使用 PHP 的 filemtime() 函数 php.net/manual/en/function.filemtime.php 并与今天的日期进行比较,或者使用 w 开关而不是 @ fwrite 中的 987654339@ 仍使用日期/时间文件命名约定。这就是我现在这个阶段想到的所有内容。
猜你喜欢
  • 2015-08-30
  • 1970-01-01
  • 2015-09-24
  • 2015-03-23
  • 2013-05-13
  • 1970-01-01
  • 2022-01-20
  • 2019-01-14
  • 2019-01-19
相关资源
最近更新 更多