我是phpmailer的新手,我试图向一组用户发送电子邮件。我在Google上搜索过并使用了phpmailer参考指南,这是我迄今为止创建的内容。
$oggetto_email = 'Kondo Manager: nuova comunicazione condominio';
// Creo il link per il login
$link_login = BASE_URL . '/index.php';
// Ottengo il tema html per il layout della email
$message = file_get_contents(BASE_URL .'/email-templates/client-new-group-post.html');
// Passo la variabile link a %linkripristino% che poi inserisco nel tema
$message = str_replace('%linklogin%', $link_login, $message);
$message = str_replace('%titolo%', $group_message_subject, $message);
$user_emails = mysqli_prepare($conn, "SELECT user_email FROM user_group_join LEFT OUTER JOIN users ON user_group_join . user_join_id = users . user_id WHERE group_join_id = ?");
mysqli_stmt_bind_param($user_emails, 'i', $group_id);
mysqli_stmt_execute($user_emails);
mysqli_stmt_store_result($user_emails);
mysqli_stmt_bind_result($user_emails, $tot_user_emails);
$tot_users_emails = mysqli_stmt_num_rows($user_emails);
// Inserisco le emails dentro ad un array
$emails = array();
if($tot_users_emails > 0){
while(mysqli_stmt_fetch($user_emails)){
$emails[] = $tot_user_emails;
}
}
foreach ($emails as $email) { //This iterator syntax only works in PHP 5.4+
// uso la funzione smtpmailer per inviare la mail passando i parametri richiesti
$send_mail = smtpmailer($email, $oggetto_email, $message);
// controllo la presenza di possibil errori nell'invio
if($send_mail === 'fail') {
echo "manage errors here, to be developed";
}
}
它似乎工作正常,但我只测试过一组三封电子邮件,我想知道这是否是正确的方法,如果它仍然可以使用大量的电子邮件50- 100。 我相信浏览器加载页面需要一些时间才能给最终用户带来一些问题。 我在线阅读我可以将电子邮件放入队列中,然后在后台发送。我知道可以使用RabbitMq完成,但我想是否可以使用mysql方法将消息保存到数据库中,然后以某种方式运行后台进程以从数据库获取所有电子邮件并处理它们使用stmp phpmailer。如果可能的话怎么办?另外考虑到所有群组成员的电子邮件是相同的,您认为使用addBcc会有助于减少页面加载时间吗?非常感谢您的帮助
答案 0 :(得分:1)
根据"mailing list" example中的these PHPMailer examples,您的一般方法似乎与示例中给出的方法类似。如果您认为在此过程中发送50-100封电子邮件对于用户来说会慢得令人无法接受 - 至少对于发送过程开始后的用户界面(UI)响应时间,以下主题是处理您的情况的几种可能性。
如您所述,可以将“待发送”邮件数据存储到数据库表中。这使您可以选择安排cron作业运行不同的脚本,以实际邮寄这些“待发送”电子邮件,而不会妨碍原始用户的体验。
然而,这里的缺点可能与让用户知道邮件是否成功的额外复杂性有关。
尽管PHP可能不是使用线程最简单的语言,但是当需要执行像这样的时间密集型任务时,可能需要考虑使用线程以释放UI。
基本上,您可能想要设置一个用于发送消息的线程。这样,当用户去发送一堆邮件时,实际的发送任务将在除UI之外的线程中运行,因此用户不一定要等待任务完成才能继续应用程序。如果您决定尝试这条路线,This article可能会让您开始使用PHP中的线程。
正如您所提到的,可以使用消息队列发送任务以便以后执行操作,但如果您的一般用例一次不超过50-100封电子邮件,则可能使用消息队列比你特定的情况更复杂。
然而,这些方法更具理论性,在其他情况下可能更有帮助。
对于PHP中的这种类型的邮件,你可能想尝试查看邮件队列,例如emailqueue或Mail_Queue(如this post中所述),但我不知道如果这些工具仍然是最新的。
最后,针对您关于密件抄送的问题,some people seem to think使用密件抄送可能会以更快的方式发送邮件,但您可能想尝试使用密件抄送而不是使用密件抄送来测试那是为了你自己。