phpmailer电子邮件发送过程中的进度条/ animated.gif


Progress bar / animated.gif during phpmailer email send

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

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

我现在正处于beta测试阶段,只有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>';

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

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

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

如果你想使用进度条,这里有一个草图,你可以这样做:

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

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

你可以:

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

可以显示一个进度条——PHP 5.2中引入了对它的支持——通过从Javascript轮询来驱动。这个很好的示例展示了如何将它与PHP和jQuery部件一起使用。这个例子是监控一个文件上传,但是你可以修改它来返回任何随时间变化的东西,例如在循环中发送电子邮件时的计数。

正如其他人所提到的,如果要发送多个消息,则需要完全异步地执行,因为页面加载确实不适合执行长时间操作。对于队列,我建议使用beanstalk和Pheanstalk。你使用什么邮件发送类没有任何区别,因为它们都可以这样操作(尽管我显然偏爱PHPMailer!)。

你的循环也相当浪费——没有必要为每条消息创建、配置和销毁mailer实例——如果你的消息有很多共同之处,你可以使它更简单。