Lesefortschritt:

Word­Press-Beiträge völlig automatisch aus E-Mails erstellen – der 450. Beitrag von Dr. Code

20. April 2025 | functions.php, Word­Press

Trick # 450 | Dieser Beitrag beinhaltet 1284 Wörter. – Geschätzte Lesezeit: ca. 7 Minuten.

Word­Press bietet zwar bereits eine Möglichkeit, Beiträge per E-Mail zu erstellen; allerdings basiert diese Funktion auf dem POP3-Protokoll, das in die Tage gekommen ist und bei einigen Mailanbietern auch gar nicht mehr unterstützt wird. Wir haben darum eine zeitgemässe Lösung erarbeitet, die auf IMAP setzt. Ein nettes Schmankerl als 450. Beitrag von Dr. Code.

Die heute vorgestellte Lösung hat es in sich. Sie liest regelmässig E-Mails aus einem definierten Mailpostfach. Dabei werden die Absender-Domains der Mailadresse überprüft. Nach Empfang verarbeitet das Script die Inhalte und erstellt daraus einen neuen Word­Press-Beitrag – mit Status «Entwurf». Zusätzlich wird eine Benachrichtigung an eine definierte E-Mail-Adresse gesendet. Nach der Verarbeitung wird das Mail aus dem Posteingang gelöscht.

Doch beginnen wir ganz vorne.

1. Mailpostfach eröffnen

Erstellen Sie ein separates Mail-Postfach, das Sie ausschliesslich für die Word­Press-Beitragserstellung nutzen. Vergeben Sie dabei ein sicheres Passwort. Notieren Sie sich die Zugangsdaten sowie die nötigen Servereinstellungen Ihres Mailproviders.

2. Maildaten in der wp-config.php hinterlegen

Damit die Zugangsdaten zu Ihrem eben erstellten Mailpostfach sicher sind, empfehlen wir, diese in der Datei wp-config.php Ihrer Word­Press-Installation zu hinterlegen. Diese finden Sie im Stammverzeichnis Ihrer Word­Press-Installation. Suchen Sie danach mittels eines FTP-Programms (z.B. FileZilla) oder über die Dateiverwaltung des Administrationstools Ihres Website-Hosters.

In der Datei wp-config.php fügen Sie nun die folgenden Zeilen ein. Platzieren Sie diese nicht ganz am Ende der Datei; auf jeden Fall vor dem Eintrag /* That’s all, stop editing! Happy blogging. */:

define('IMAP_HOSTNAME', '{mail.ihr-mailserver.ch:993/imap/ssl}INBOX');
define('IMAP_USERNAME', 'ihr-mail-username');
define('IMAP_PASSWORD', 'ihr-mailpasswort');

Ersetzen Sie den Mailserver (in Zeile 1), den Mail-Usernamen (Zeile 2) und das Passwort (auf Zeile 3) mit den Angaben, aus der vohergehenden Postfach-Erstellung.

Die weiteren Angaben auf Zeile 1 sind: Portnummer (993), Protokoll (imap) und Sicherheitszertifikat (ssl). Diese Inhalte sind allgemeingültig und sollten in den allermeisten Fällen funktionieren. Ebenso der Term «INBOX» am Ende der Zeile, der besagt, wo allenfalls neue Mails liegen können.

3. Funktion zur Beitragserstellung in Word­Press einbinden

Soweit die Vorarbeiten. Nun müssen Sie Word­Press noch klart machen, was Sie von ihm wünschen. Dazu dient der folgende Code, den Sie in der Datei functions.php Ihrer Word­Press-Installation ablegen können. Unter Design/Theme-Datei-Editor:

function process_imap_emails() {
    $hostname = IMAP_HOSTNAME;
    $username = IMAP_USERNAME;
    $password = IMAP_PASSWORD;

    $inbox = @imap_open($hostname, $username, $password);
    if (!$inbox) {
        error_log('IMAP-Verbindung fehlgeschlagen: ' . imap_last_error());
        return;
    }

    $emails = imap_search($inbox, 'ALL');
    if (!$emails) {
        imap_close($inbox);
        return;
    }

    rsort($emails);

    foreach ($emails as $email_number) {
        $header = imap_headerinfo($inbox, $email_number);
        $from_email = isset($header->from[0]->mailbox, $header->from[0]->host) 
            ? sanitize_email($header->from[0]->mailbox . '@' . $header->from[0]->host) 
            : '';

        // Prüfung für gültige Absender-Domains
        if (!preg_match('/@(.*\.)?(string-im-domainnamen-1|string-im-domainnamen-2|string-im-domainnamen-3)(-[a-z0-9]+)?\.[a-z]+$/i', $from_email)) {
            continue;
        }

        $subject = sanitize_text_field(imap_utf8($header->subject));

        // Versuche zuerst, den Klartext-Body zu bekommen
        $body = imap_fetchbody($inbox, $email_number, 1);

        // Falls leer, versuche den HTML-Body (2) und entferne Tags
        if (empty($body)) {
            $html_body = imap_fetchbody($inbox, $email_number, 2);
            $body = !empty($html_body) ? strip_tags($html_body) : '';
        }

        // Fallback, falls der Body nach der Bereinigung noch leer ist
        if (empty($body)) {
            $body = '[Kein Inhalt verfügbar]';
        }

        $post_data = array(
            'post_title'    => $subject,
            'post_content'  => wp_kses_post($body),
            'post_status'   => 'draft',
            'post_author'   => 1,
            'post_category' => array(get_cat_ID('Input'))
        );

        $post_id = wp_insert_post($post_data);

        if (is_wp_error($post_id)) {
            error_log('Fehler beim Erstellen des Beitrags: ' . $post_id->get_error_message());
            continue;
        }

        // Word­Press-Admin-URL abrufen
        $admin_url = admin_url('edit.php?post_status=draft&post_type=post');

        // Sende HTML-E-Mail mit Beitrag
        send_html_mail(
            'mailadresse@domain.ch',
            'Neuer Beitrag erstellt',
            $subject,
            $admin_url
        );

        imap_delete($inbox, $email_number);
    }

    imap_expunge($inbox);
    imap_close($inbox);
}

// Hilfsfunktion für HTML-E-Mails
function send_html_mail($to, $subject, $post_title, $admin_url) {
    add_filter('wp_mail_content_type', function() { return 'text/html'; });

    $message = '
    <html>
        <body style="font-family: Arial, sans-serif; color: #333;">
            <h2 style="color: #538f38;">Neuer Beitrag erstellt</h2>
            <p>Ein neuer Beitrag wurde erstellt:</p>
            <p><strong>' . esc_html($post_title) . '</strong></p>
            <p><a href="' . esc_url($admin_url) . '" style="display: inline-block; padding: 10px 15px; background: #538f38; color: #fff; text-decoration: none; border-radius: 5px;">Beitrag bearbeiten</a></p>
        </body>
    </html>';

    wp_mail($to, $subject, $message);

    remove_filter('wp_mail_content_type', function() { return 'text/html'; });
}

// Word­Press Cron-Job für die Funktion registrieren
add_action('dr_code_process_emails', 'process_imap_emails');

if (!wp_next_scheduled('dr_code_process_emails')) {
    wp_schedule_event(time(), 'hourly', 'dr_code_process_emails');
}

Auch an diesem Code müssen (bzw. können) Sie noch einige Anpassungen vornehmen:

  • Auf Zeile 27 wird geprüft, ob bestimmte Zeichenfolgen in der Domain des Absendermails erscheinen. Dies empfehlen wir Ihnen: Damit können Sie verhindern, dass Kreti und Pleti Ihnen Word­Press-Beitragsentwürfe in die Website spülen können.
  • Auf Zeile 50 wird definiert, dass Beiträge zunächst als Entwurf (draft) gespeichert werden. Das lässt sich auch anders lösen: Mit dem Status «published» würde der Beitrag sofort tel quel veröffentlicht.
  • Auf Zeile 52 haben wir noch definiert, dass jeder Mailbetrag zunächst die Kategorie «Input» erhält. Dies ist praktisch und hat sich bewährt.
  • Auf Zeile 67 können Sie nun noch eine Mailadresse (mutmasslich Ihre eigene) eintragen. An diese Adresse wird ein Mail verschickt, sobald ein neuer Beitragsentwurf aus einem Mail verarbeitet wurde. Auf der Folgezeile (68) ist der Betreff dieses Hinweismails eingetragen – auch der lässt sich ändern.
  • Auf den Zeilen 87 bis 90 wir definiert, was alles in der Infomail stehen soll, wenn ein neuer Beitrag erstellt ist. Das ist hier recht spartanisch: Der Hinweis auf einen neuen Beitrag, dessen Titel sowie in Link auf das Backend – genauer: auf die Beitragsentwürfe.
  • Auf Zeile 103 wird noch festgelegt, dass die Mailabfrage einmal stündlich vonstatten geht. In den meisten Fällen wird dies reichen.

Mit dem obigen Setting weird der jeweilige Mailbetreff zum Beitragstitel und der eigentliche Mailtext zum Inhalt des neuen Beitrags.

Recht simpel und elegant zugleich. 

Werbung

Verkorkste Darstellung beim copy/pasten verhindern

Viele tippen ihre Texte für den Blog oder die Website nicht direkt im Editorfeld ihres CMS, sondern machen den «premier jet» z.B. in Word. Die später ins Netz übernommenen Texte können so aber bisweilen ganz schön verunstaltet daher kommen. Ein ...
Keine Inhalte gefunden.

Werbung

 

Pin It on Pinterest

Share This
Überblick über den Datenschutz

Diese Website verwendet Cookies, damit wir Ihnen die bestmögliche Benutzererfahrung bieten können. Cookie-Informationen werden in Ihrem Browser gespeichert und dienen dazu, Sie wiederzuerkennen, wenn Sie auf unsere Website zurückkehren, und unserem Team zu helfen, zu verstehen, welche Bereiche der Website Sie am interessantesten und nützlichsten finden.