Teaser Mail als Beitrag in Blog speichern

Mail als Beitrag in Blog speichern

Beiträge mit PHP-Mail an die Seite senden und veröffentlichen

home » php » blog beitrag mit php mail an die webseite senden

Inhalt

Beiträge via Mail veröffentlichen

Wenn das Admin-Backend des CMS nicht verwendet werden kann oder die Webseite headless betrieben wird, kann das folgende kleine PHP-Script verwendet werden, um Beiträge via E-Mail (imap) an die Webseite zu senden und automatisch zu veröffentlichen. Das Script ist speziell für die Verwendung in den CMS Yellow, Automad oder PICO gedacht, da in diesen CMS traditionelle ASCII-Dateien bzw. Flat-Files verwendet werden.

Ein Postfach anlegen

Damit die Webseite neue Beiträge empfangen kann, muss ein geheimes Mail-Postfach angelegt werden, dessen Namen niemand kennt. Zusätzlich wird es noch einen Schlüssel geben, der im Betreff die Erzeugung eines neuen Beitrags initiiert, denn es können durchaus auch mal Service-Mails des Providers eintrudeln die herausgefiltert werden müssen.

Der Code

Der Code ist zunächst so aufgebaut, das er eine besondere Signatur als Betreff zwingend erwartet. Die Betreff-Zeile muss mit einem Schlüsselbegriff beginnen, gefolgt vom Dateinamen des neu zu erstellenden Post, in etwa so:

#key;das-ist-der-neue-beitrag.md

Code

Der Schlüssel dient dazu, eventuelle Service-Mails oder Mail-Werbung des Providers herauszufiltern, um dadurch zu verhindern, das bei jeder SPAM-Mail ein Beitrag erzeugt wird. Im Body der Nachricht, wird dann der eigentliche Content als Markdown-Text verfasst.

$server   = '{imap.provider.de:143}INBOX';    // bitte anpassen
$adresse  = 'geheimes@postfach.de';           // bitte anpassen
$password = 'das-kennwort';                   // bitte anpassen
$mailbox  = imap_open($server, $adresse, $password, CL_EXPUNGE);
$emails   = imap_search($mailbox, 'UNSEEN '); // ungelesene Mails

foreach ($emails as $m) {
    $header    = imap_headerinfo($mailbox, $m);
    $message   = imap_fetchbody($mailbox, $m, 1);
    $structure = imap_fetchstructure($mailbox, $m);

    $part = $structure->parts[1]; // Kodierung ermitteln

    if($part->encoding == 3) {
        $message = imap_base64($message);
    } else if($part->encoding == 1) {
        $message = imap_8bit($message);
    } else {
        $message = imap_qprint($message);
    }

    $keyword = explode(";", imap_utf8($header->subject))[0];
    $post    = explode(";", imap_utf8($header->subject))[1];

    if ($keyword == "#key") {
        echo 'Job verarbeitet: '.$post_name;
        file_put_contents($post, mb_convert_encoding(
            $message, 
            'UTF-8', 
            'Windows-1252'));
    }
}

imap_expunge($mailbox); // Verbindung beenden
imap_close($mailbox);  // Postfach schliessen

Code

Der wichtigste Bestandteil des kleinen Scripts ist die Decodierung der Zeichentabelle mittels mb_convert_encoding(), da Mails meist von Windwos-Rechnern erstellt werden und diese in das UTF-8 Format konvertiert werden müssen, damit Sonderlaute korrekt angezeigt werden können. Weitere Besonderheit ist die Decodierung mit imap_base64(), imap_8bit() und imap_qprint().

Script automatisiert einbinden

Das Script kann in die index.php einkopiert werden oder mittels include() dazugeladen werden, es wird dann bei jedem Aufruf der Domain ausgeführt und veröffentlicht Beiträge aus dem Mail-Postfach.

Alternativ kann auch mit $header->fromaddress die Mail-Adresse des Senders abgefragt werden, um den Zugriff auf bestimmte, bekannte Mailadressen zu gewähren, etwa so:

if($header->fromaddress == "mail@domain.de") {
    // erlaubte Verarbeitung
    ...
    ...
}

Code

Die Verarbeitung neuer Beiträge durch ein Mail-Programm ist recht simpel implementiert, jedoch sollte bedacht werden, das dies unter Umständen ein Risiko für die Webseite eröffnet. Zudem löscht das Script keine alten Mails aus dem Postkorb, dies muss der Besitzer selbst erledigen.

Es ist zu beachten, das viele Mailprogramme lange Zeilen ab 70 Zeichen umbrechen, zwar ist dies für den Absatztext nicht tragisch, jedoch für Title und Description.


FlightCMS
2024-01-28
Beitrag,Sortieren,Datum,Titel,ASC,DESC
post