Trick # 450 | Dieser Beitrag beinhaltet 1284 Wörter. – Geschätzte Lesezeit: ca. 7 Minuten.
WordPress 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 WordPress-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 WordPress-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 WordPress-Installation zu hinterlegen. Diese finden Sie im Stammverzeichnis Ihrer WordPress-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 WordPress einbinden
Soweit die Vorarbeiten. Nun müssen Sie WordPress noch klart machen, was Sie von ihm wünschen. Dazu dient der folgende Code, den Sie in der Datei functions.php Ihrer WordPress-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;
}
// WordPress-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'; });
}
// WordPress 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 WordPress-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


