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

    Ändern der Länge Ihrer Postauszüge

    Im Word­Press-Blog-Index werden normalerweise kurze Auszüge aus Ihren Beiträgen angezeigt, um den LeserInnen einen Eindruck davon zu vermitteln, was auf sie zukommt. Wenn Sie die Standardlänge dieser Auszüge ändern möchten, interessiert Sie ...
    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.