From 9ba239478c5cecb7e424fc8aa4568e03f1b6b06b Mon Sep 17 00:00:00 2001
From: Jukka Lampikoski
Date: Fri, 13 Mar 2026 02:08:03 +0200
Subject: [PATCH] =?UTF-8?q?Lis=C3=A4=C3=A4=20viestiketju=20(quoted=20threa?=
=?UTF-8?q?d)=20tikettivastausten=20loppuun?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Sekä Zammad- että SMTP-vastaukset sisältävät nyt koko viestiketjun
vastauksessa. Zammad-vastauksissa HTML-blockquoteilla, SMTP:ssä
plain-text > -quoting-muodossa. Vain uusi viesti tallennetaan
tietokantaan, ketju näkyy vain lähetettävässä sähköpostissa.
Co-Authored-By: Claude Opus 4.6
---
api.php | 45 +++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 43 insertions(+), 2 deletions(-)
diff --git a/api.php b/api.php
index f716b90..235673f 100644
--- a/api.php
+++ b/api.php
@@ -3400,6 +3400,24 @@ switch ($action) {
}
$emailBody = $signature ? $body . "\n\n-- \n" . $signature : $body;
+ // Rakenna viestiketju (quoted thread) vastaukseen
+ $threadMessages = _dbFetchAll(
+ "SELECT from_name, from_email, timestamp, body, type FROM ticket_messages WHERE ticket_id = ? ORDER BY timestamp DESC",
+ [$t['id']]
+ );
+ if (!empty($threadMessages)) {
+ $emailBody .= "\n";
+ foreach ($threadMessages as $tm) {
+ $tmSender = $tm['from_name'] ?: $tm['from_email'];
+ $tmDate = date('d.m.Y H:i', strtotime($tm['timestamp']));
+ $tmBody = strip_tags(str_replace(['
', '
', '
', '
', ''], "\n", $tm['body'] ?: ''));
+ $tmBody = html_entity_decode($tmBody, ENT_QUOTES, 'UTF-8');
+ $tmBody = trim(preg_replace('/\n{3,}/', "\n\n", $tmBody));
+ $quoted = implode("\n", array_map(fn($l) => "> " . $l, explode("\n", $tmBody)));
+ $emailBody .= "\n{$tmSender} — {$tmDate}:\n{$quoted}\n";
+ }
+ }
+
// CC: käytä frontendistä annettua CC:tä, tai tiketin alkuperäistä CC:tä
$ccToSend = $replyCc !== '' ? $replyCc : ($t['cc'] ?? '');
@@ -5322,16 +5340,39 @@ switch ($action) {
$z = new ZammadClient($integ['config']['url'], $integ['config']['token']);
$to = !empty($input['to']) ? trim($input['to']) : ($ticket['from_email'] ?? '');
$cc = !empty($input['cc']) ? trim($input['cc']) : '';
+
+ // Muunna uusi viesti HTML:ksi
+ $newMsgHtml = nl2br(htmlspecialchars($body, ENT_QUOTES, 'UTF-8'));
+
+ // Rakenna viestiketju (quoted thread) vastaukseen
+ $messages = _dbFetchAll(
+ "SELECT from_name, from_email, timestamp, body, type FROM ticket_messages WHERE ticket_id = ? ORDER BY timestamp DESC",
+ [$ticketId]
+ );
+ $quotedThread = '';
+ foreach ($messages as $msg) {
+ $sender = $msg['from_name'] ?: $msg['from_email'];
+ $date = date('d.m.Y H:i', strtotime($msg['timestamp']));
+ $msgBody = $msg['body'] ?: '';
+ $quotedThread .= '
'
+ . '
' . htmlspecialchars($sender) . ' — ' . $date . ''
+ . '
' . $msgBody . '
'
+ . '
';
+ }
+
+ // Yhdistä: uusi viesti (HTML) + viestiketju
+ $fullBody = $newMsgHtml . $quotedThread;
+
$result = $z->createArticle(
(int)$ticket['zammad_ticket_id'],
- $body,
+ $fullBody,
$to,
$ticket['subject'] ?? '',
'email',
$cc
);
- // Tallenna myös paikalliseen tietokantaan
+ // Tallenna myös paikalliseen tietokantaan (vain uusi viesti, ei ketjua)
$msgId = substr(uniqid(), -8) . bin2hex(random_bytes(2));
_dbExecute(
"INSERT INTO ticket_messages (id, ticket_id, type, from_email, from_name, body, timestamp, zammad_article_id)