Zum Inhalt springen
Startseite » WP Snippets » Neu EMail to Post mit Kategorie

Neu EMail to Post mit Kategorie

komplettes PHP-Skript, das E-Mails per IMAP abruft, filtert (Absender + Betreff) und automatisch WordPress-Beiträge erstellt. Es kann als Plugin oder in functions.php genutzt werden und ist cron-kompatibel.

<?php
/**
 * E-Mail → WordPress Post Automatisierung
 * Filter: Absender & Betreff
 * Voraussetzung: PHP IMAP, WordPress-Installation
 */

function filter_email_to_post_settings($from, $subject) {
    $rules = [
        'news@domain.de' => [
            'Newsletter*' => ['category' => 'News', 'author' => 1, 'status' => 'publish'],
            '*'           => ['category' => 'News', 'author' => 1, 'status' => 'draft'],
        ],
        'support@domain.de' => [
            'Support*'    => ['category' => 'Support', 'author' => 2, 'status' => 'publish'],
        ],
        '*@partner.com' => [
            '*'           => ['category' => 'Partner', 'author' => 3, 'status' => 'draft'],
        ],
    ];

    foreach ($rules as $rule_from => $subjects) {
        $pattern_from = '/^' . str_replace(['*', '.'], ['.*', '\.'], $rule_from) . '$/i';
        if (!preg_match($pattern_from, $from)) continue;

        foreach ($subjects as $pattern_subject => $actions) {
            $pattern_subject = '/^' . str_replace('*', '.*', $pattern_subject) . '$/i';
            if (preg_match($pattern_subject, $subject)) return $actions;
        }
    }

    return ['category' => 'Unsorted', 'author' => 1, 'status' => 'draft'];
}

function fetch_emails_and_create_posts() {
    $mailbox = '{imap.example.com:993/imap/ssl}INBOX';
    $username = 'dein@email.de';
    $password = 'passwort';

    $inbox = imap_open($mailbox, $username, $password);
    if (!$inbox) return;

    $emails = imap_search($inbox, 'UNSEEN');
    if ($emails) {
        rsort($emails); // Neueste zuerst
        foreach ($emails as $email_number) {
            $overview = imap_fetch_overview($inbox, $email_number, 0)[0];

            $message = imap_fetchbody($inbox, $email_number, 1.1);
            if (empty($message)) $message = imap_fetchbody($inbox, $email_number, 1);

            $settings = filter_email_to_post_settings($overview->from, $overview->subject);

            // Beitrag erstellen
            wp_insert_post([
                'post_title'   => $overview->subject,
                'post_content' => $message,
                'post_status'  => $settings['status'],
                'post_author'  => $settings['author'],
                'post_category'=> [get_cat_ID($settings['category'])],
            ]);

            imap_setflag_full($inbox, $email_number, "\\Seen"); // Als gelesen markieren
        }
    }

    imap_close($inbox);
}

// Cron-Hook registrieren (z.B. alle 5 Minuten)
if (!wp_next_scheduled('cron_fetch_emails')) {
    wp_schedule_event(time(), 'five_minutes', 'cron_fetch_emails');
}
add_action('cron_fetch_emails', 'fetch_emails_and_create_posts');

// Optional: Intervall „five_minutes“ definieren
add_filter('cron_schedules', function($schedules) {
    $schedules['five_minutes'] = ['interval' => 300, 'display' => 'Every 5 Minutes'];
    return $schedules;
});
  • $rules definiert die Zuordnung von Absendern → Betreff → Aktionen.
  • Wildcards (*) werden für Domain-Matches oder beliebige Betreffzeichen verwendet.
  • Gibt ein Array zurück: Kategorie, Autor, Status.
  • Kann direkt in einen IMAP-Abruf oder Cron-Job integriert werden, um Beiträge automatisch zu erstellen.