我创建了一个仅限会员的网站,当我发布新文章时,(类似于博客文章),我使用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实例——如果你的消息有很多共同之处,你可以使它更简单。