PHP + PHPMailer - 检查电子邮件是否已打开/读取

时间:2016-07-19 06:40:38

标签: php email phpmailer

我正在使用PHPMailer发送系统电子邮件,现在需要能够检查收件人是否已打开邮件。 PHPMailer提供了类似于Deposition-Notification-To函数的类$mail->ConfirmReadingTo = 'yourown@emailaddress.com';,但我无法开始工作。

唯一的选择是空白图像解决方案,我设法在已发送的电子邮件中实现,但无法在我的服务器上执行,返回语法错误,这在包含我的数据库凭据时没有意义(完全相同的代码正在运行在许多其他脚本......)。

我怀疑标题声明存在一些问题,因为php文件需要作为正版图像返回,以确保它适用于大多数提供者。

任何人都可以指出我正确的方向,我在这个问题上花费了太长时间并且看不到它......

email.php

...
    $mail->addAddress($email);                                      // Send TO
    $mail->Subject = $subject;                                      // Email subject
    $mail->Body = $message . "
        <img src='http://www.qcisource.com/ihg/pages/poststay/email_tracker/record.php?type=Poststay&holidex=".urlencode($holidex)."&user=".urlencode($user)."&sent_to=".urlencode($email)."&crs=".urlencode($crs)."' width='1' height='1' border='0' alt=''/>";       // message and tracker pic in body
    $mail->isHTML(TRUE);                                            // HTML body? true/false
    $mail->ConfirmReadingTo = 'qcisource@gmail.com';

record.php

<?php
error_reporting(E_ALL);

//Begin the header output
header('Content-Type: image/gif');

if(isset($_GET['type']) && $_GET['type'] == 'Poststay') {

    // Start MySQLi connection
    include '../../../plugins/MySQL/connect_db.php';
    $mysqli = new mysqli($dbhost,$dbuser,$dbpass,$dbname);

    if($mysqli->connect_errno > 0){
    die('Unable to connect to database [' . $mysqli->connect_error . ']'); }

    // define and sanitize GET variables    
    $type = mysql_real_escape_string($_GET['type']);
    $holidex = mysql_real_escape_string($_GET['holidex']);
    $user = mysql_real_escape_string($_GET['user']);
    $sent_to = mysql_real_escape_string($_GET['sent_to']);
    $crs = mysql_real_escape_string($_GET['crs']);

    // check if submitted record already exists
    $sql = "SELECT Holidex FROM qci_email_log WHERE Holidex = '$holidex' AND CRS = '$crs'";
    $result = $mysqli->num_rows($sql);

    if( $result == 0 ) {
        $sql = "INSERT INTO `qci_email_log`(`Type`,`Holidex`,`User`,`Sent_To`,`CRS`) VALUES ('".$type."','".$holidex."','".$user."','".$sent_to."','".$crs."')";
        if(!$result = $mysqli->query($sql)) {
        die('Unable to insert email logging into database [' . $mysqli->error . ']'); }
    }

    // free result and close connection
    $result->free();
    $mysqli->close();
}

// disregarding if the database was affected, output an empty image

// URI to the image
$graphic_http = 'http://www.website.com/path/to/blank.gif';

// Get image filesize for header
$filesize = filesize( 'blank.gif' );

// Image output
header( 'Pragma: public' );
header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
header( 'Cache-Control: private',false );
header( 'Content-Disposition: attachment; filename="blank.gif"' );
header( 'Content-Transfer-Encoding: binary' );
header( 'Content-Length: '.$filesize );
readfile( $graphic_http );

?>

现在,我在这里遇到语法错误:

include '../../plugins/MySQL/connect_db.php';

编辑:错误消息如下: 解析错误:语法错误,意外';'在第9行的Z:\ xampp \ htdocs \ ihg \ pages \ poststay \ email_tracker \ record.php

问题出在include(不太可能)或$ _GET切换,我在mail.php脚本中添加了url-encode()函数

编辑3: 更新了缺失的paranthesis,但代码仍然没有更新数据库......

编辑4: 将$ db变量更改为$ mysqli以确认整个脚本中的所有调用,但仍然没有写入数据库的记录。在插入失败的情况下添加了错误消息,但没有返回...

编辑5: 我没有对原始代码进行任何更改,而是想指出两件事。 (a)你正在使用mysql_real_escape_string,我认为你应该使用mysqli_real_escape_string。 (b)我几乎按照你的方式尝试了你的代码,并且能够将你的问题复制到信中。通过调试,我发现当通过mysqli_real_escape_string和mysql_real_escape_string进行过滤时,全局$ _GET中的值会被破坏。所以,这可能是您问题的根本原因。我只能通过直接引用$ _GET或$ _REQUEST来写入MySQL,我们知道这绝不是一个好主意。

1 个答案:

答案 0 :(得分:1)

你错过了这一行的结束语

if (($_GET['Type'] == 'Poststay') && (!empty($_GET['crs'])) {`

这应该是:

if(isset($_GET['Type']) && $_GET['Type'] == 'Poststay') {

这会验证参数是否在请求中设置,如果它等于Poststay,则会执行其他内容。