Maison  >  Article  >  développement back-end  >  Conseils pour contrôler le nombre d’e-mails avec PHP

Conseils pour contrôler le nombre d’e-mails avec PHP

WBOY
WBOYoriginal
2023-05-23 08:46:471402parcourir

Avec le développement et la vulgarisation d'Internet, le courrier électronique, en tant que moyen de communication efficace, pratique et économique, devient de plus en plus populaire et largement utilisé. Cependant, le nombre d'e-mails envoyés est devenu un problème.Pour l'expéditeur, l'envoi excessif d'e-mails affectera non seulement le travail et la vie normale du destinataire, mais affectera également l'impression et l'évaluation de l'expéditeur par le destinataire. En particulier pour les opérateurs, les fournisseurs de services et d'autres entreprises, l'envoi d'un grand nombre d'e-mails entraînera non seulement une congestion du système de messagerie, mais affectera également les performances et la stabilité du serveur de messagerie. Dans les cas graves, cela peut déclencher des politiques de filtrage du spam et en provoquer. email identifié à tort comme spam.

Par conséquent, lors de la mise en œuvre de la fonction d'envoi d'e-mails, il est très nécessaire et important de contrôler le nombre d'e-mails. En tant que langage de programmation populaire, PHP dispose d'une multitude d'outils et de technologies permettant de contrôler facilement le nombre d'e-mails. Voici plusieurs techniques pour contrôler le nombre d’emails.

1. Restrictions basées sur le serveur SMTP

Lors de l'utilisation d'un serveur SMTP pour envoyer des e-mails, le serveur SMTP a généralement certaines restrictions, telles que le nombre maximum d'e-mails pouvant être envoyés. envoyé par heure ou par jour. Nous pouvons donc contrôler le nombre d’emails envoyés en fonction des limites du serveur SMTP. L'implémentation spécifique est la suivante :

//连接SMTP服务器
$mail = new PHPMailer(true);
$mail->SMTPDebug = 0;
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'username';
$mail->Password = 'password';
$mail->SMTPSecure = 'ssl';
$mail->Port = 465;

//添加收件人、主题、正文等信息

//发送邮件
if ($mail->send()) {
  echo '邮件发送成功';
} else {
  echo '邮件发送失败';
}

//获取SMTP服务器的发送限制
$limit = $mail->getSMTPInstance()->getSendLimit();
if ($limit) {
  echo 'SMTP服务器每小时最多可以发送'.$limit.'封邮件';
}

Dans le code ci-dessus, nous nous connectons au serveur SMTP via la classe PHPMailer, et définissons les informations pertinentes du serveur SMTP, puis ajoutons le destinataire, le sujet, le corps et d'autres informations, et enfin appeler La méthode send() envoie des e-mails. Si l'e-mail est envoyé avec succès, "E-mail envoyé avec succès" est affiché, sinon "E-mail envoyé a échoué" est affiché. send()方法发送邮件。如果邮件发送成功,则输出“邮件发送成功”,否则输出“邮件发送失败”。

接着,我们通过getSMTPInstance()方法获取SMTP服务器的实例对象,然后调用getSendLimit()方法获取SMTP服务器每小时最多可以发送的邮件数量。如果返回值为0,则表示没有限制,否则返回具体的发送限制。

2、基于邮件队列的控制

邮件队列是一种常见的技术,通过将待发送的邮件暂存到队列中,然后按照特定的规则逐一发送,从而达到控制邮件发送数量和发送速度的目的。具体实现方式如下:

//将待发送的邮件添加到队列中
function addToQueue($to, $subject, $message) {
  $queueFile = 'mail_queue.txt';
  $data = serialize(array('to'=>$to, 'subject'=>$subject, 'message'=>$message));
  file_put_contents($queueFile, $data."
", FILE_APPEND | LOCK_EX);
}

//按照队列中的顺序发送邮件
function processQueue() {
  $queueFile = 'mail_queue.txt';
  if (!file_exists($queueFile) || !is_readable($queueFile)) {
    return false;
  }
  $f = fopen($queueFile, 'r');
  while ($data = fgets($f)) {
    $mail = unserialize(trim($data));
    $to = $mail['to'];
    $subject = $mail['subject'];
    $message = $mail['message'];
    //发送邮件
    //...
  }
  fclose($f);
  //清空队列
  file_put_contents($queueFile, '');
  return true;
}

在上面的代码中,我们定义了两个函数:addToQueue()processQueue()addToQueue()函数用于将待发送的邮件添加到队列中,其中包含邮件的收件人、主题和正文等信息。processQueue()函数用于从队列中取出邮件,并按照队列的顺序逐一发送邮件。

具体实现时,我们可以将待发送的邮件信息序列化后,存储到一个文本文件中,然后在后台定时调用processQueue()

Ensuite, nous obtenons l'objet instance du serveur SMTP via la méthode getSMTPInstance(), puis appelons la méthode getSendLimit() pour obtenir la limite maximale du serveur SMTP par heure. Le nombre de messages envoyés. Si la valeur de retour est 0, cela signifie qu'il n'y a pas de limite, sinon la limite d'envoi spécifique est renvoyée.

2. Contrôle basé sur la file d'attente de courrier

La file d'attente de courrier est une technologie courante qui stocke temporairement les e-mails à envoyer dans la file d'attente, puis suit des règles d'envoi spécifiques une par une. pour contrôler le nombre et la vitesse d’envoi des emails. L'implémentation spécifique est la suivante :

//连接数据库
$conn = new mysqli('localhost', 'username', 'password', 'database');
if ($conn->connect_error) {
  die('数据库连接失败:'.$conn->connect_error);
}

//查询发送数量
$count = $conn->query("SELECT COUNT(*) as total FROM emails WHERE sent_date >= DATE_SUB(NOW(), INTERVAL 1 HOUR)");
if (!$count) {
  die('查询失败:'.$conn->error);
}
$row = $count->fetch_assoc();
$total = $row['total'];

//判断发送限制
if ($total >= 100) {
  die('发送数量已达限制');
}

//插入邮件信息
$stmt = $conn->prepare("INSERT INTO emails (recipient, subject, content, sent_date) VALUES (?, ?, ?, NOW())");
$stmt->bind_param('sss', $to, $subject, $content);
if (!$stmt->execute()) {
  die('邮件发送失败:'.$conn->error);
} else {
  echo '邮件已添加到队列';
}
$stmt->close();
$conn->close();

Dans le code ci-dessus, nous définissons deux fonctions : addToQueue() et processQueue(). La fonction addToQueue() est utilisée pour ajouter un e-mail à envoyer à la file d'attente, qui contient des informations telles que le destinataire, l'objet et le corps de l'e-mail. La fonction processQueue() permet de supprimer les emails de la file d'attente et de les envoyer un par un dans l'ordre de la file d'attente.

Dans une implémentation spécifique, nous pouvons sérialiser les informations de courrier électronique à envoyer, les stocker dans un fichier texte, puis appeler régulièrement la fonction processQueue() en arrière-plan, selon dans la file d'attente Lisez les informations de l'e-mail une par une dans l'ordre et effectuez l'opération d'envoi de l'e-mail. Cette méthode peut éviter le problème de panne du système de messagerie provoqué par un envoi soudain d'une grande quantité de courrier, et peut également réaliser un traitement par lots et un contrôle de l'envoi de courrier.

3. Restrictions basées sur la base de données#🎜🎜##🎜🎜#La base de données est également un moyen courant de contrôler l'envoi d'e-mails. Nous pouvons définir des paramètres pertinents dans la base de données, tels que le nombre maximum d'e-mails pouvant être envoyés par heure ou par jour, puis interroger et déterminer si la limite d'envoi a été dépassée lors de l'envoi de l'e-mail. L'implémentation spécifique est la suivante : #🎜🎜#rrreee#🎜🎜#Dans le code ci-dessus, nous nous connectons à la base de données via mysqli, recherchons le nombre d'e-mails envoyés dans la base de données au cours de la dernière heure, puis déterminons si la limite d'envoi a été dépassée. Si la limite est dépassée, l'envoi du courrier est arrêté, sinon les informations du courrier sont insérées dans la base de données et attendent le traitement du programme en arrière-plan. #🎜🎜##🎜🎜#Il convient de noter que lors de l'utilisation d'une base de données pour contrôler le nombre d'e-mails envoyés, nous devons installer et configurer un logiciel de base de données approprié et définir les paramètres pertinents. De plus, une série d'opérations complexes telles que la connexion à la base de données, l'interrogation, l'insertion et la fermeture sont nécessaires, ce qui rend l'écriture de code plus difficile. #🎜🎜##🎜🎜# En résumé, contrôler le nombre d'e-mails envoyés est très nécessaire dans les applications pratiques pour éviter la congestion et l'effondrement du système de messagerie et assurer le fonctionnement normal du système de messagerie. En PHP, les techniques de contrôle du nombre d'e-mails incluent principalement des restrictions basées sur le serveur SMTP, des contrôles basés sur la file d'attente de courrier et des restrictions basées sur la base de données. Lors du choix d’une méthode de mise en œuvre spécifique, il est nécessaire de considérer et d’évaluer de manière globale la situation et les besoins spécifiques pour sélectionner la solution optimale. #🎜🎜#

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn