代码之家  ›  专栏  ›  技术社区  ›  sdot257

如何安排电子邮件发送

  •  5
  • sdot257  · 技术社区  · 16 年前

    我想我需要某种消息队列系统,但是电子邮件部分是如何工作的呢?我需要另一个每分钟运行一次的cronjob来检查队列系统吗?

    5 回复  |  直到 16 年前
        1
  •  3
  •   nathan-unleashed    15 年前

    PEAR::Mail_Queue 以及相关教程。

    您可以在10分钟脚本运行时对邮件进行排队,并通过cron作业每隔10分钟清空一次邮件队列。您还可以让邮件队列每分钟清空一次,并在有问题的邮件的队列中实现一个“请勿提前发送”时间。

    这可以通过记录您上次发送警报的时间来实现(这样您就不会错过任何警报,也不会发送两次警报)

    希望有帮助。

        2
  •  3
  •   Ditto    15 年前

    我最近刚刚用PHP和MySQL为一个非常类似的问题编写了自己的解决方案。


    我编写了一个单独的PHP脚本来运行实际的作业(一个新闻稿系统),以使这种自动化更加有用。也就是说,我可以从它运行任何我想要的命令,我通过在automator脚本中存储实际命令的名称及其参数来实现这一点。

    exec("~/scripts/{$row['command']} {$row['args']}");
    

    允许我将参数存储到数据库以使我的新闻稿脚本更有用。您可以使用数组$argv来获取参数,$argv[0]是参数按顺序跟随的脚本名称。

    我将所有的新闻稿信息存储在数据库中一个单独的表中,该表按时间顺序对它们进行排序。另一个重要字段是电子邮件的主题和正文。然后我只需将两个参数传递给newsletter.php,使其完全符合我的要求:newsletter number和subscriber number(或all)。

    测试时间(10分钟前)可以用这样的方法完成(为了更容易理解,我过度简化了):

    date_default_timezone_set('America/Denver');
    $month=;//without leading zeros
    $day=;//without leading zeros
    $hour=;//24 hour without leading zeros
    $min=;//needs leading zeros
    if($month==date(n) and $day==date(j)){
        if($hour==date(G)){
            if(($min-date(i))<=10){
                //run command
            }
        }elseif(($hour-1)==date(g)){
            if(($min-date(i))<=(-50)){
                //run command
            }
        }
    }
    

    您需要将时区更改为自己的时区,并以某种方式从数据库中提取日期和时间信息。
    脚本的第二部分(在一小时的前9分钟内运行预定的命令)没有经过测试,但是第一部分我刚刚快速地测试了它。

        3
  •  1
  •   Alfred    16 年前

    PHP解决方案

    我已经考虑了你的问题多一点,这是PHP的解决方案,我想出了。

    #!/opt/lamp/bin/php 是我的php解释器的路径。你应该改变它 或者直接用php运行它

    调度程序.php

    #!/opt/lampp/bin/php
    <?php
    // For testing purpose I set this to 5 seconds. You should set it to 600.
    $time = 5;
    
    while (true) {
        /*  
        let's assume you store the emails scheduled from the database in this
        in memory array.
        */
        $array = array( 
            "Message to run last", #message which is scheduled last.
            "Message to run after first message",
            "Message to run immediately", #message which is scheduled first.
        );
    
        $message = array_pop($array);    
        while ($message != NULL) {
                echo $message . "\r\n";
                /* 
                For testing purpose I am just simply echoing out messages.
                In here you should sent mails using for exmample
                http://php.net/manual/en/function.mail.php
                */
                $message = array_pop($array); // Get next message.
        }
    
        /*
        sleep $time. This is the "cron" part of your problem.
        */
        sleep($time); 
    }
    

    您应该在bash脚本中运行此脚本,以查看它的功能。而且代码已经被很好地记录了。脚本应该永远运行(在后台)。

    Java解决方案

    这也不是一个只有PHP的解决方案

    谷歌应用引擎解决方案

    我知道这不是一个PHP解决方案,但当你不能安装一个消息队列我认为谷歌应用程序引擎是最好的解决方案 . 当我看到这个的时候 video introduction 从brettslatkin到使用pythonsdk的googleappengine,我被卖给了googleappengine。这只需要10分钟的时间,您将学习如何创建一个基本的留言簿并将其部署到云中。下面如果有兴趣,我将试图解释哪些部分你需要做谷歌的应用程序引擎这一点。


    排队系统

    taskqueue 完成任务。taskqueue甚至还有一个 eta 可以设置为在特定时间运行。谷歌应用引擎有一个慷慨的 free quota . 您可以添加 100,000 每天免费排队参加任务。

    但是电子邮件部分是如何工作的呢

    mail 服务。它也有一个慷慨的免费配额(每天2000个收件人)。我建议您只需从队列中调用邮件api即可发送消息。

        4
  •  0
  •   Gray Area    16 年前

        5
  •  0
  •   bobsoap    16 年前

    您希望多久发送一次电子邮件?如果它出现(在现有cronjob发现它的那一分钟,即每10分钟一次),您可以让查找“提醒我”标志的脚本执行以下操作:

    $reminders = array(1, 3, 212);
    

    数组中的每个元素都引用tasks表的一个主键,这里我使用了“tasks”。

    2-数据库查找完成后,查看$reminders是否不为空,然后运行如下查询

    $query = "SELECT * FROM tasks WHERE id = '".implode(',', $reminders)."'";
    

    3-使用以下方式向自己发送包含此数据的电子邮件 mail .

    推荐文章