$v) $data[$k] = trim($v);
// Check required fields
$missing = array_filter($required, fn($f) => empty($data[$f] ?? ''));
if ($missing) {
showError(
'Missing required fields: ' . implode(', ', $missing) .
'. Remember: you must click Sign Message on the Digital Signature tab before sending.'
);
}
// Limit newsgroups to 3
$groups = array_slice(
array_filter(array_map('trim', explode(',', $data['newsgroups']))),
0, 3
);
$data['newsgroups'] = implode(', ', $groups);
// Build raw email
$hdr = [];
$hdr[] = 'From: ' . $data['from'];
$hdr[] = 'To: mail2news@localhost'; // dummy for sendmail -t
$hdr[] = 'Newsgroups: ' . $data['newsgroups'];
$hdr[] = 'Subject: ' . $data['subject'];
if (!empty($data['references'])) $hdr[] = 'References: ' . $data['references'];
$hdr[] = 'X-Hashcash: ' . $data['xhashcash'];
$hdr[] = 'X-Ed25519-Sig: ' . $data['x-ed25519-sig'];
if (!empty($data['x-ed25519-pub'])) {
$hdr[] = 'X-Ed25519-Pub: ' . $data['x-ed25519-pub'];
}
$hdr[] = 'X-No-Archive: Yes';
$hdr[] = 'Mime-Version: 1.0';
$hdr[] = 'Content-Type: text/plain; charset=UTF-8';
$hdr[] = 'Content-Transfer-Encoding: 7bit';
$hdr[] = ''; // blank line before body
$raw = implode("\r\n", $hdr) . "\r\n" . $data['message'] . "\r\n";
// Send via sendmail using the custom transport
$sendmail = '/usr/sbin/sendmail';
$cmd = escapeshellcmd($sendmail) . ' -i -oTransport=mail2news -t';
$descriptors = [
0 => ['pipe', 'r'],
1 => ['pipe', 'w'],
2 => ['pipe', 'w'],
];
$proc = proc_open($cmd, $descriptors, $pipes);
if (!is_resource($proc)) showError('Failed to invoke sendmail.');
fwrite($pipes[0], $raw);
fclose($pipes[0]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
$code = proc_close($proc);
if ($code !== 0) {
showError('Sendmail error (code ' . $code . '):
' . nl2br(htmlspecialchars($stderr)));
}
// ------------------ success page ------------------
?>
Your article was handed off to mail2news and should appear in the newsgroups soon.
= $msg ?>