X-Git-Url: http://git.shiar.net/minimedit.git/blobdiff_plain/e6c3f4fe5f308ca6ff56bb9c4fb28df0411fb0d3..0fc7deecbeed58bc99c94a1e0b89ac51f006a163:/mail/index.php diff --git a/mail/index.php b/mail/index.php index 76ec033..9f57064 100644 --- a/mail/index.php +++ b/mail/index.php @@ -1,52 +1,111 @@ path, '/')); +if (!function_exists('parsemailhead')) { function parsemailhead($headerdata) { $headlist = iconv_mime_decode_headers($headerdata, ICONV_MIME_DECODE_CONTINUE_ON_ERROR); $headlist['date'] = DateTime::createFromFormat(DateTimeInterface::RFC2822.'+', $headlist['Date']); - $headlist['from'] = mailparse_rfc822_parse_addresses($headlist['From']); - //TODO: imap_rfc822_parse_adrlist() alternative + $headlist['from'] = imap_rfc822_parse_adrlist($headlist['From'], ''); + array_walk($headlist['from'], function ($row) { + $row->display = $row->personal ?? $row->mailbox; + }); return $headlist; } +} if ($msgid) { $filename = "$mailbox/$msgid"; + if (!is_readable($filename)) { + return TRUE; + } + list ($headerdata, $rawbody) = explode("\n\n", file_get_contents($filename), 2); $head = parsemailhead($headerdata); + $head['date']->setTimezone(new DateTimeZone(date_default_timezone_get())); - $Article->title = 'Mailbericht ' . $head['date']->format('Y-m-d H:i'); + $Page->title = 'Mailbericht ' . $head['date']->format('Y-m-d H:i'); printf("

%s

\n", htmlspecialchars($head['Subject'] ?? 'Mailbericht zonder onderwerp')); - print '
'; - printf('
Ontvangen:
%s
', $head['date']->format('c')); - printf('
Verzender:
%s
', htmlspecialchars($head['from'][0]['display'])); + printf('

%s %s

'."\n", + htmlspecialchars($head['From']), + htmlspecialchars(implode(', ', array_column($head['from'], 'display'))), + htmlspecialchars($head['Date']), + showdate(preg_split('/\D/', $head['date']->format('c'))) + ); print '
'; - if (preg_match('{^text/plain}', $head['Content-Type'] ?? 'text/plain')) { + $type = preg_replace('/;.*/', '', $head['Content-Type'] ?? 'text/plain', 1); + switch ($type) { + case 'text/plain': $body = $rawbody; if (($head['Content-Transfer-Encoding'] ?? '') === 'quoted-printable') { $body = quoted_printable_decode($body); } - printf('
%s
', htmlspecialchars($body)); - } - else { - printf('

Geen ondersteuning voor %s.

', htmlspecialchars($head['Content-Type'])); - - /* TODO + $body = nl2br(htmlspecialchars($body)); + print "

$body

\n"; + break; + case 'multipart/alternative': $mime = mailparse_msg_parse_file($filename); - $part = mailparse_msg_get_part($mime, '1'); - mailparse_msg_extract_part_file($part, $filename); - */ + foreach (mailparse_msg_get_structure($mime) as $section) { + print "

$section

\n"; + $part = mailparse_msg_get_part($mime, $section); + if ($section === '1') { + continue; // do not access container to prevent segfault + } + $pinfo = mailparse_msg_get_part_data($part); + #printf('
%s
', htmlspecialchars(print_r($pinfo,TRUE))); + $phead = $pinfo['headers']; + list ($ptype) = explode(';', strtolower($phead['content-type'])); + list ($pmedia) = explode('/', $ptype); + switch ($pmedia) { + case 'multipart': + continue 2; + case 'text': + $body = mailparse_msg_extract_part_file($part, $filename, NULL); + #iconv($pinfo['charset'], 'UTF-8', $body); #TODO test if needed + switch ($ptype) { + case 'text/plain': + $body = htmlspecialchars($body); + print "

$body

\n"; + break; + case 'text/html': + $body = preg_replace('{ + (
) | <[^>]+> # keep line breaks, replace other elements + }x', "\\1\n", $body); # strip_tags + print "

$body

\n"; + break; + } + break; + case 'image': + if (!preg_match('/^inline;/', $phead['content-disposition'])) { + continue 2; + } + $name = iconv_mime_decode($phead['disposition-filename']); + $body = mailparse_msg_extract_part_file($part, $filename, NULL); + printf('%s', + $ptype, base64_encode($body), + htmlspecialchars($phead['name'] ?? '-') + ); + break; + } + } + mailparse_msg_free($mime); + break; + default: + printf('

Geen ondersteuning voor %s.

', htmlspecialchars($type)); } return; } +if ($Page->api) { + return; +} if (!$User->admin('user')) { http_response_code(403); - $Place['warn'] = "Geen gebruikersrechten om e-mails in te zien."; - $Place['maillist'] = ''; + $Page->place['warn'] = "Geen gebruikersrechten om e-mails in te zien."; + $Page->place['maillist'] = ''; return TRUE; } @@ -54,22 +113,39 @@ $rows = glob("$mailbox/*"); if (!$rows) { throw new Exception('Kon inbox niet openen.'); } -array_splice($rows, 0, -50); + +$nav = [ + 'start' => $_GET['start'] ?? 0, + 'n' => $_GET['n'] ?? 10, + 'total' => count($rows), +]; +$rows = array_slice(array_reverse($rows), $nav['start'], $nav['n']); ob_start(); print '\n"; -$Place['maillist'] = ob_get_clean(); + +print $Page->widget('nav', $nav); + +$Page->place['maillist'] = ob_get_clean();