Mailq-Output von Postfix mit Telegram checken
Wenn Postfix Mails auf Hold setzt und diese nicht ausliefert, bekommt man das als Admin nur durch Zufall oder regelmäßige Überprüfungen der Mailschlange beispielsweise per mailq
oder per postqueue -p
mit. Vor kommt das unter anderem wenn eigene Mails bei der Zustellung zu einem anderen Server beim Greylisting hängen bleiben oder die eigene DMARC-Prüfung die eingehende Mail auf Hold setzt und diese einfach nicht zugestellt wird.
In diesem Fall lässt sich der Output von mailq
per Cronjob an beispielsweise den eigenen Telegram-Servicekanal schicken. Die Telegram-Bot-API ist ziemlich gut dokumentiert und folgendes PHP-Script hilft dabei, wenn man sowohl einen eigenen Bot und auch die zugehörige Chat_id hat. Die einzige Hürde dabei ist im Markdown-Modus alle Zeichen vom Output zu ersetzen, die als Formatierung interpretiert werden könnten.
Alternativ ließe sich das auch mittels sendxmpp
auf einen Jabberaccount schicken.
#!/usr/bin/php
<?php
function telegram($m)
{
$bot_id = 'BOTID';
$chat_id = 'CHATID';
$url = 'https://api.telegram.org/bot'.$bot_id.'/sendMessage?chat_id='.$chat_id.'&parse_mode=Markdown&text=';
$url .= urlencode($m);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$json=json_decode($response,true);
$message_id=$json['result']['message_id'];
}
/////////////////////////////////////////////////////////////////////
$message = shell_exec('/usr/bin/mailq');
if (strpos ($message,'Mail queue is empty') !== false) {exit (0);}
else {
$message = str_replace([ '_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '|', '{', '}' ],
[ '\_', '\*', '\[', '\]', '\(', '\)', '\~', '\`', '\>', '\#', '\+', '\|', '\{', '\}' ]
, $message);
$message = "*Postfix:*\n\n".$message;
telegram($message);
}
?>
Der zugehörige Cronjob-Eintrag wäre dann dieser:
55 */3 * * * root php SCRIPTVERZEICHNIS/mailq2telegram.php >/dev/null 2>&1
Alle auf Hold gesetzte Mails lassen sich dann mit dieser Befehlskombination sofort zustellen: postsuper -H ALL; postqueue -f
. Für eine einzelne Mail ist deren ID notwendig: postsuper -H MAILID; postqueue -f
. Unerwünschte Mails lassen sich wiederum mit postsuper -d MAILID
löschen.