【发布时间】:2016-07-08 18:39:17
【问题描述】:
我正在使用 PHP 开发票务系统。我把邮件转换成票。当用户从票务系统回复邮件时,它会将邮件作为新邮件发送给客户。没有消息/邮件线程。
我认为,我的问题与主题末尾添加的票证 ID 有关。 (例如Subject: Installation Problem [#EMSY45])
我已在标头中传递了消息 ID 和引用
我正在使用 PHPMailer 发送邮件。
这是我的代码:
$mail = new PHPMailer();
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = str_replace('/', '', $host); // Specify main and backup SMTP servers
if($outgoing_server_details['smtp_auth'] == 1)
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = $outgoing_server_details['server_username']; // SMTP username
$mail->Password = $outgoing_server_details['server_password']; // SMTP password
$mail->SMTPSecure = $protocol; // Enable TLS encryption, `ssl` also accepted
$mail->Port = $port;
$mail->setFrom($outgoing_server_details['from_email_field'], $from_name);
$mail->addAddress($data['_from'], $to_name); // Add a recipient
$mail->addReplyTo($outgoing_server_details['from_email_field'], $reply_to_name);
$message_id = $data['message_id'];
$mail->AddCustomHeader('In-Reply-To', $message_id);
$mail->AddCustomHeader('References', $message_id);
//$mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments
//$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = $data['subject'];
$mail->Body = $mail_content;
$mail->send();
【问题讨论】:
-
您通过设置这些标头做正确的事情,但您确实需要检查收到的消息中的标头 - 您确定消息 ID 填充正确,并且与之前的消息匹配到底是身份证?
-
@Synchro 我确定,我正在正确添加消息 ID。当我使用 IMAP 获取邮件时。我也得到消息ID。我也在为 References 标头添加相同的消息 ID。
-
有些客户比其他客户更善于关注这些标题 - 有些有点没用,而是依赖于启发式匹配主题行 - 或者甚至同时使用两者。您是否在所有客户端应用中都看到了这种行为?
-
@Synchro 我现在使用的是 Mac 默认邮件客户端。有时,它在那里正确显示了线程。但在 Gmail 中,我一开始并没有看到该线程。当主题更新时,它开始了自己的线程。是否必须将先前的回复与回复一起发送?
-
我不确定,但 gmail 作为邮件客户端通常表现得很糟糕。除了众所周知的破坏 HTML 的能力之外,它还会得到完全错误的回复处理。要以正确的方式进行线程,我建议阅读this 和this。 this question.
标签: php email phpmailer ticket-system