我正在使用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,我们知道这绝不是一个好主意。
答案 0 :(得分:1)
你错过了这一行的结束语
if (($_GET['Type'] == 'Poststay') && (!empty($_GET['crs'])) {`
这应该是:
if(isset($_GET['Type']) && $_GET['Type'] == 'Poststay') {
这会验证参数是否在请求中设置,如果它等于Poststay
,则会执行其他内容。