我创建了一个仅限会员的网站,当我发布新文章时(类似于博客文章),我使用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图像并将文章发布到网站上并发送了电子邮件。
我在谷歌上搜索了关于这个主题的教程,但是干了。
对此情况的任何想法都将不胜感激。
答案 0 :(得分:0)
您可以显示进度条 - 在PHP 5.2中引入了对它的支持 - 通过从Javascript轮询来驱动它。 This nice example展示了如何将它与PHP和jQuery部分一起使用。该示例是监视文件上载,但您可以更改它以返回随时间变化的任何内容,例如在循环发送电子邮件时计数。
正如其他人所提到的,如果您要发送多条消息,则需要完全异步完成,因为页面加载实际上不是进行长时间操作的时间。对于队列,我建议使用beanstalkd Pheanstalk。你使用的电子邮件发送类没有任何区别,因为它们都可以通过这种方式运行(虽然我明显偏向PHPMailer!)。
你的循环也非常浪费 - 没有必要为每条消息创建,配置和销毁邮件程序实例 - 如果你的消息有很多共同之处,你可以使它更简单。
答案 1 :(得分:0)
如果您不发送个性化邮件,我建议您只使用一封电子邮件的BCC
。
如果你想进入进度条,这里有一个你可以采用的方式草图:
notifications
,user_id
notice_id
WHERE notify= 'Yes'
插入一行(为什么BOOL不在这里?)和新通知(如果您不想从通知表中删除行但想要跟踪通知,也可以使用布尔字段sent
。)
你可以:
submit.php
,您可以在其中插入所需的通知poll.php
,您可以在其中以JSON格式提供通知表的当前行数。status.php
您定期从poll.php
请求数据并相应更新网页