【问题标题】:I finally was able to use cron... but I'm not sure if it will work with my code. How can i change it?我终于能够使用 cron ......但我不确定它是否适用于我的代码。我怎样才能改变它?
【发布时间】:2012-01-01 01:04:03
【问题描述】:

我的虚拟主机支持 cronjobs。我很新,所以我几乎不知道自己在做什么。我安排 cron 运行一个发送电子邮件的脚本。但我不知道该怎么办!这是我的 cron:0 0 28 * * php -f /home/a7269592/contact.php 现在我该如何调整我的代码,以便在 28 号时,该代码将发送一封电子邮件。这是 PHP:

<?php    
if(isset($_POST['email']))
{

 $headers = "From: Memory Jet <your_company@example.com>\r\n";


$to_visitor = $_POST["email"];
$common_data = $_POST["message"];
mail($to_visitor, "Your Memory", $common_data, $headers);

} ?>

这是html表单:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<html> <body><form method="post" action="contact.php">
 Email: <input name="email" type="text"><br> name:<br> 
<textarea name="name" rows="15" cols="40"></textarea><br> 
Message:<br> <textarea name="message" rows="15" cols="40"></textarea><br>
 <input type="submit"> </form> <body> <html>
</body>

那么我将如何更改 php 以便 cron 安排它?提前致谢! -本

【问题讨论】:

  • 这不会做你想做的事。你需要重新设计你的代码。
  • 哦,我明白了...但是我该怎么做呢??
  • 首先你需要弄清楚你想让它做什么。
  • contact.php 应该直接使用 mail 函数,而不是作为对 HTML 表单的响应,您输入所需的值而不是从 $_POST 获取它们。
  • 是的,它应该可以工作,但是如果您的 cronjob 已经安排在 28 日(而不是更多),您可以省略 if 语句。所以你只需要&lt;?php mail('to@example.com', 'hi', 'works');(但请看下面 devdRew 的帖子,我认为他在你想做的事情上是对的)。

标签: php html email cron


【解决方案1】:

到目前为止,我的情况完全一样。在我看来,您正试图将邮件从“在发布时刻”精确到预定的时间表。所以,首先你需要知道的是:

当您运行 CRON 时,您无法访问 $_SERVER、$_POST 和其他全局变量

那是因为你运行 PHP,而不是通过服务器,它是全局变量的作者。

因此,您需要为您的邮件创建临时存储,例如邮件任务文件(在执行时附加任务可能会出现问题,例如,如果您 cron 邮件程序发送邮件,同时您的前端 PHP脚本想要添加一些任务,以便任务文件可能被我损坏)或数据库,或任何你想象的东西。

之后,您需要设置您的 cron 任务,例如前 500 个邮件任务并将其发送出去。当然,你现在可以邮寄所有的邮件任务,没问题。

希望,它会有所帮助。

【讨论】:

  • 如何制作邮件任务文件?会涉及什么?
  • 它只是一个文本文件,在我的例子中,它是一个序列化的字母数组,具有以下字段:to、subject、text、from、when。每次有人通过您的方法向您发送邮件时,您将打开文件,将数据反序列化到某个 $var,添加带有元信息 $var[] 的字母,然后将其序列化回文件,(file_put_contents('/my/location/of /mail/tasks',序列化($var)))。当 cron 脚本运行时,它会反序列化存储在邮件任务文件中的字母数组,如果没有基于块的邮件分区,则只进行 foreach 循环。
【解决方案2】:

我知道您要做什么,但是您是否计划仅在 28 日发送电子邮件或将其存储并在 28 日发送?如果您使用的是第一个选项,则应将其更改为这样。

<?php   
$today = getdate()
if(isset($_POST['email']) && $today['mday'] == 28)
{

$headers = "From: Memory Jet <your_company@example.com>\r\n";


$to_visitor = $_POST["email"];
$common_data = $_POST["message"];
mail($to_visitor, "Your Memory", $common_data, $headers);

} ?>

至于存储,cmets 是对的,你应该重新设计你的代码。 crontab 将运行代码而无需从表单中获取 gettimg 数据 - 基于 Web 和 CLI 请求的处理方式不同。我会明确添加另一个文件来处理表单请求并将其授权给表单或数据库。由 crontab 运行的那个将从该文件或数据库中读取。

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2022-01-24
    • 1970-01-01
    • 2021-05-02
    相关资源
    最近更新 更多