Linuxspicker

Admins kleiner Zettelkasten für die Lösung von Linuxproblemen

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.


Stichworte: , , , ,