在phpmailer电子邮件发送期间进度条/ animated.gif

时间:2014-06-25 22:49:51

标签: php email phpmailer

我创建了一个仅限会员的网站,当我发布新文章时(类似于博客文章),我使用phpmailer向所有要求发送电子邮件的成员发送电子邮件。

电子邮件包含新文章内容。标题,描述等。

我现在处于测试阶段,只有3个电子邮件帐户,当我发新帖时,发送3封电子邮件大约需要9秒。每封电子邮件约3秒钟。

我希望在这个网站上获得大约100个用户,这将是大约5分钟发送所有这些电子邮件。

问题

有没有办法可以连接实时进度条以显示发送电子邮件时剩余的时间?

我的设置是这样的:

我的表单已连接到此动作脚本。

<?php
include($_SERVER['DOCUMENT_ROOT'] . "/core/init.php");

// new data
$title          = $_POST['title'];
$description    = $_POST['description'];

// query

$addnotice = DB::getInstance()->insert('table1', array(
    'title' => $title,
    'description' => $description,

));                       


$id = isset($_POST['id']);
$users = DB::getInstance()->query("SELECT id, title, description FROM table1");

$users = DB::getInstance()->query("SELECT email FROM table2 WHERE notify= 'Yes'");

foreach($users->results() as $u){

User::sendNotification($u->email, $title, '<strong><h2>'.$title.'</h2></strong><p>'.$description.'</p>');

}

Session::flash('newarticle', '<h3 class="white-tx" align="center">The article has been added!</h3>');
Redirect::to('sitepage.php');
?>

User::sendNotification来自我的用户类文件,如下所示。

    public function sendNotification($to, $subject, $body) {
        require_once 'class.phpmailer.php';
        $from       = "notifier@*******.com";
        $mail       = new PHPMailer();
        $mail->IsSMTP(true);            // use SMTP
        $mail->IsHTML(true);
        $mail->SMTPAuth   = true;                  // enable SMTP authentication
        $mail->Host       = "host***.*******.com"; // SMTP host
        $mail->Port       =  465;                    // set the SMTP port
        $mail->Username   = "notifier@******.com";  // SMTP  username
        $mail->Password   = "********";  // SMTP password
        $mail->SetFrom($from, 'Email Robot');
        $mail->AddReplyTo($from,'Do Not Reply');
        $mail->Subject    = $subject;
        $mail->MsgHTML($body);
        $address = $to;
        $mail->AddAddress($address, $to);
        $mail->Send();
}

实时进度条是理想的,但我甚至会选择动画.gif加载图像。

我尝试将其添加到动作脚本中:

echo '<table align="center" width="100%" height="100%" border="0"><tr align="center" valign="center"><td><img src="images/sending.gif"></td></tr></table>';

但这甚至都没有被识别出来并直接滚过sent.gif图像并将文章发布到网站上并发送了电子邮件。

我在谷歌上搜索了关于这个主题的教程,但是干了。

对此情况的任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以显示进度条 - 在PHP 5.2中引入了对它的支持 - 通过从Javascript轮询来驱动它。 This nice example展示了如何将它与PHP和jQuery部分一起使用。该示例是监视文件上载,但您可以更改它以返回随时间变化的任何内容,例如在循环发送电子邮件时计数。

正如其他人所提到的,如果您要发送多条消息,则需要完全异步完成,因为页面加载实际上不是进行长时间操作的时间。对于队列,我建议使用beanstalkd Pheanstalk。你使用的电子邮件发送类没有任何区别,因为它们都可以通过这种方式运行(虽然我明显偏向PHPMailer!)。

你的循环也非常浪费 - 没有必要为每条消息创建,配置和销毁邮件程序实例 - 如果你的消息有很多共同之处,你可以使它更简单。

答案 1 :(得分:0)

如果您不发送个性化邮件,我建议您只使用一封电子邮件的BCC

如果你想进入进度条,这里有一个你可以采用的方式草图:

  • 使用字段notificationsuser_id
  • 添加数据库表notice_id
  • 为每个用户WHERE notify= 'Yes'插入一行(为什么BOOL不在这里?)和新通知
  • 每次都有一个cronjob轮询此表,然后发送邮件(通过从用户和通知表中获取相应的信息)并删除相应的待处理行
  • 提供返回当前待处理通知数(json)的脚本(通知表的num行)
  • 使用JS(即jquery)进行定期更新(上述脚本的http查询)

(如果您不想从通知表中删除行但想要跟踪通知,也可以使用布尔字段sent。)

你可以:

  • 一个submit.php,您可以在其中插入所需的通知
  • 邮件发送cronjob(即php脚本或其他),在发送
  • 后删除待处理的行
  • 一个poll.php,您可以在其中以JSON格式提供通知表的当前行数。
  • status.php您定期从poll.php请求数据并相应更新网页