After phpmailer sends a message return the method of whether the recipient read the message

  • 2021-07-09 07:46:25
  • OfStack

After using phpmailer to send an email, many people want to know if the other party has read the email. Generally speaking, we can't know this, so is there any way?

There is a simple solution to this problem. We know that the email content can be sent in the form of html, and we can insert pictures into the content, so the key lies in this picture.

Suppose the content of our email is like this:

The code for the file content. php is as follows:


<table width="555" height="50" border="0" align="center" cellpadding="0" cellspacing="0" background="<?=$bg?>">
<tr>
 <td> This is the test content </td>
   </tr>
   <tr>
 <td>&nbsp;</td>
   </tr>
   <tr>
 <td>&nbsp;</td>
   </tr>
 </table> 

How do you write this $bg? What if the mail is sent to more than one person? How to distinguish here?

Suppose the link is like this: http://www.xxx.com/image.php? email = $email Look again at the code for image. php

The code for the file image. php is as follows:


<?php 
$email=$_GET["email"]; 
if($id) 
{ 
  include_once("/conn.php"); 
  mysql_query("update mail_list set has_read='yes' where email='$email'"); 
} 
header("Content/type:image/gif"); 
$im=imagecreatefromgif("bg.gif"); 
imagegif($im); 
imagedestroy($im); 
?>

You may understand when you see this. So the content of the email I sent is like this:


<?php 
ob_start(); 
include_once("content.php"); 
$content=ob_get_contents(); 
ob_end_clean(); 
?>

At this point, we didn't replace the background image in the email content. The next problem will solve this problem step by step. This is part of the code for sending email with phpmail:


<?php 
/* 
$contact=array("userA"=>"aaaa@sina.com","userB""=>"bbb@163.com","userC"=>"ccc@qq.com"); 
*/ 
foreach ($contact as $unm=>$email) 
{ 
  $bg_file="http://{$_SERVER['SERVER_NAME']}/image.php?email=$email"; 
  $str=str_replace('background=""',"background=\"$bg_file\"",$content); 
  $mail->MsgHTML($str); 
  $mail->AddAddress($email,$unm); 
  $mail->Send(); 
} 
?>

Why do you want to send it one by one in a circular way here? Because in order to distinguish which contact has read the email, the background picture of the content of each email is displayed differently. Before sending, we process the content and replace the background, so that the src of the background image of the message content we see becomes this: http://www.domain.com/image.php? email=aaa @ sina. com and so on.

Note that there is another problem here. After you execute the above code, you will find a problem. Three letters are sent to the first person, two letters are sent to the second person, and one letter is sent to the third person. Why here? Here we will look at the AddAddress method. The modification is to open class. phpmailer. php, find line 310, and change private $to = Array () to public $to = Array ().

Then add:


$mail->to=Array();
$mail->AddAddress($email,$unm);

At this point, there is no need to explain too much.


Related articles: