2

我有时间在另一个帖子上及时回复,对不起。

该过程的目的是在一定时间后将邮件发送给网站的用户。

我有一个在特定时间执行 php 文件的 cron

例如,每周一上午 8:00

* 8 ** 1 php-f / $ filepath ()

这个 php 文件发送数千封电子邮件,但不是从早上 8 点开始连续发送,而是从 8:00 开始每分钟发送 30 封邮件,例如

那是:

08:00 -> 0-30 封邮件

08:01 -> 30-60 封邮件

08:02 -> 60-90 封邮件……等等。

由于启动 cron 在早上 8 点运行一次,我考虑过使用 php sleep 功能在几分钟之间暂停但不尊重命令,系统失败并被锁定。根据我使用 C 的经验,睡眠功能始终可以正常工作。

我将运输设置为在何时发送 30 封邮件并使用计数器退出循环

 ***** php-f /$filepath ()

因此强制系统每分钟运行一次文件。

我的代码

    $res = $admin->array_mixed(); //Array with all mails address

    $send_per_min=30;
    $send = 0;

    foreach ($res as $r){
    $mails->AddAddress("$r['invitacion_email']");
    .
    .
    .
    $mails = new PHPMailer(true);
$mails->Mailer = "smtp";
    .
    .
    .
    if($mails->Send()){                                      
    $send++;
    $log_OK .= $mail." Send!!! \n";
    }else{                              
    $log_KO .= $mail." Failed!!! \n";
    }


    if ($send == $send_per_min){//With this line I checked that after making 30 shipments out of the loop until the next minute the cron rerun
    //I want to replace it with a sleep that once sent 30 mails, wait until the next minute. In this way, you could set the cron at a specific time
    break;
    }

    }//End for

我希望你比上一篇文章更清楚(https://stackoverflow.com/questions/15393432/sending-emails-with-phpmailer-partitioned)。

向社区问好。

Pd-对不起我的英语不好

4

1 回答 1

0

您可以在 cron 中每 30 分钟调用一次 php,不要使用睡眠。如果您愿意,可以将要发送的邮件数量的参数传递给 PHP。执行 PHP 并发送所有邮件(仅 30 或数据库中配置的数量)。从 cron 执行新调用后,您发送更多邮件(仅 30 或数据库中配置的数量),并在您有邮件要发送时再次重复。为此,您可以在数据库或文件中写入最后发送的电子邮件(使用 id 或其他控件)。继续发送电子邮件,但不重复发送电子邮件。您可以使用 SQLite、XML、文本、MySQL 或其他方式编写发送和日志的设置。

您只用未发送的 30 封邮件填写了您的 $res。

仅举例:

SELECT 
    * 
FROM 
    `my_mail` m
WHERE 
    m.`isSent` = 'notsend'
LIMIT 30;

$res 接收 SQL 的返回或者你可以格式化之前的返回,并且每一个发送的邮件都没有错误

$log_OK .= $mail." Send!!! \n";

将发送成功的信息写入数据库。

仅举例:

UPDATE
    `my_mail`
SET
    `isSent` = 'send'
WHERE 
    id = '$id';

下面的其他解决方案:

我创建了一个类,为您的问题提供了一种可能的解决方案,方法“getMail”是您获取邮件的函数,替换此函数,方法“sentMail”是您通过 PHPMailer 发送邮件的函数,方法“sentScheduleMail”是来自的引擎每分钟发送一次,但如果发送邮件慢于 60 秒,该功能将仅在下一分钟发送邮件。

<?php

class SentMailByPart {

    /**
     * SQL to recovery the quantity of mails specified
     * @param int $quantity
     */
    private function getMail($quantity) {
        return array(array("test1"), array("test2"));
    }

    /**
     * Function main to send mail
     */
    public function sentScheduleMail() {
        /**
         * While system is running
         */
        while (1) {
            /**
             * Time in unixtime
             */
            $res = $this->getMail(30);
            foreach ($res as $r) {
                // $this->sentMail($r);
                $this->sentMail($r);
            }
            unset($res, $r);
            $time = mktime();
            sleep($time % 60);
        }
    }

    /**
     * Settings of mail, subject and message (Your function to sent e-mail)
     * @param stdClass $settings
     */
    private function sentMail($r) {
        /**
         * New instance of PHP
         */
        $mails = new PHPMailer(true);
        /**
         * Mail address
         */
        $address = $r['invitacion_email'];
        /**
         * Sent by smtp
         */
        $mails->Mailer = "smtp";
        /**
         * Mail of destination
         */
        $mails->AddAddress($address);

        /**
         * Check mail is sent
         */
        if ($mails->Send()) {
            return true;
        } else {
            /**
             * Write error in error log
             */
            error_log(fprintf("Mail (%s) is not send. Erro: %s"
                            , $address
                            , $mails->ErrorInfo), 0);
            return false;
        }
    }

}

$sent = new SentMailByPart();
$sent->sentScheduleMail();

/**
 * if wish stop the send of mail alter $isRunning = 0, is run
 */
?>

对不起,如果我的英语很糟糕,我的成语是“pt-br”。

于 2013-03-14T14:39:58.517 回答