Lisää viestiketju (quoted thread) tikettivastausten loppuun

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 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 02:08:03 +02:00
parent 4086409f99
commit 9ba239478c

45
api.php
View File

@@ -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(['<br>', '<br/>', '<br />', '</p>', '</div>'], "\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 .= '<br><div style="padding-left:0.5em;border-left:2px solid #ccc;color:#555;">'
. '<small><strong>' . htmlspecialchars($sender) . '</strong> — ' . $date . '</small><br>'
. '<div>' . $msgBody . '</div>'
. '</div>';
}
// 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)