Mir ist mal wieder ein Problem aufgefallen, welches mit Google und seinem Regulationanspruch zusammen hängt. Es ist nämlich so, dass manche WP-Systeme keine Mails an Google-Empfänger verschicken können. Man bekommt dann in der Logdateie eine Fehlermeldung wie:

<ein-user@gmail.com>: host gmail-smtp-in.l.google.com[142.251.175.26] said:
550-5.7.26 This mail is unauthenticated, which poses a security risk to the
550-5.7.26 sender and Gmail users, and has been blocked. The sender must
550-5.7.26 authenticate with at least one of SPF or DKIM. For this message,
550-5.7.26 DKIM checks did not pass and SPF check for
[h2412yxyz.stratoserver.ne 550-5.7.26 t] did not pass with ip:
[85.214.x.y]. The sender should visit 550-5.7.26
https://support.google.com/mail/answer/81126#authentication for 550 5.7.26
instructions on setting up authentication.
s24-20020a632158000000b0055acc7f8088si4258738pgm.301 - gsmtp (in reply to
end of DATA command)

Das hat schon eine gewisse Berechtigung, weil das WordPress-System hier keine sinnvolle Absenderadresse gesetzt hat, sondern www-data als Absender genommen hat. Das ergänzt das Mailsystem dann noch um den Servernamen. Damit schlagen dann die genannten Checks fehl.

Zur Beseitigung des Problems gibt es mehrere Möglichkeiten:

  1. Nutzung eines Plugins wie WP Mail SMTP/ 
  2. Anpassung der functions.php

Das vielgelobte Plugin hat mich genervet, weil es gleich eine Pro-Version anbietet. Ich habe also unter Design -> Theme-Datei-Editor die Datei functions.php (Theme-funktionen) um die folgenden Zeilen erweitert (einfach angehängt):

// Mail Hook mail_from
add_filter( 'wp_mail_from', function ( $original_email_address ) {
return 'testpress@meine-domain.de';
} );

// Mail Hook mail_from_name
add_filter( 'wp_mail_from_name', function ( $original_email_from ) {
return 'Testpress';
} );

//Action Hook phpmailer_init
add_action( 'phpmailer_init', 'my_phpmailer_init' );
function my_phpmailer_init( $phpmailer ) {
$phpmailer->Sender = $phpmailer->From;
}

Die beiden Mail-Hooks setzten die Absender-Adresse auf einen gewünschten Wert, wobei der Hook eigentlich eine funcion einbindet, die hier jeweils gleich integriert ist. In vielen Beschreibungen ist das auch getrennt (https://wordpress.org/support/topic/change-sender-name-and-email-address-wordpress/) .
Diese Einstellungen reichen aber nicht aus, weil damit die Adresse im Envelope (Umschlag) nicht geändert wird und das ist die entscheidende Stelle. Dafür gibt es einen Action-Hook, über den man die Initialisierung des Mailers vornehmen kann. Hier ändern wir nur den Wert für Sender und zwar auf den gerade davor gesetzten Wert von From.

Auch wenn innerhalb der WordPress Options, eventuelle durch eine Erweiterung,  eine Mailadresse gesetzt ist, wie z.B. wpmembers_email_wpfrom, so wird die erst durch die se Initialisierung aktiv.

Damit sollten jetzt auch Mails an z.B. Google-Adressen funktionieren, sofern der eingestellte Absender grundsätzlich entsprechende Mails verschicken kann.

Damit die Änderung nicht bei nächsten Update des Themes überschieben wird, sollte man ein Child-Theme anlegen, in dem diese Ergänzung realisiert wird.

Weitere Informationen:

https://developer.wordpress.org/reference/hooks/wp_mail_from/
https://developer.wordpress.org/reference/hooks/wp_mail_from_name/
https://developer.wordpress.org/reference/hooks/phpmailer_init/

 

In der letzten Zeit habe ich mich mit der flexibleren Installation von PHP beschäftigt (https://www.debacher.de/wiki/Verschiedene_PHP-Versionen_für_Apache). Dabei ist eine Auto-Vervollständigung für apt recht hilfreich. Auf aktuellen Ubuntu-Rechnern ist das für normale Nutzer aktiviert, aber nicht für root.

Ein paar Zeilen helfen hier weiter:

apt install bash-completion

Eventuell ist das Paket schon installiert. Auf alle Fälle muss man dann in der Datei /etc/bash.bashrc ein paar Kommentarzeichen entfernen (ab Zeile 34):

# enable bash completion in interactive shells
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

Wenn man sich jetzt erneut anmeldet, dann funktioniert die Vervollständigung.

WordPress hat hinsichtlich seiner Mails in paar Merkwürdigkeiten:

1. Absenderadresse

Bei ausgehenden Mails benutzt WordPress standardmäßig die Absenderadresse wordpress@<Domain>, hier im konkreten Fall also wordpresse@debacher.de . Falls man das ändern möchte, weil ein anderer Userteil oder eine andere Domain gewünscht wird, so kann man das nirgends direkt einstellen. Man muss ein paar Zeilen Code in die Datei functions.php mit aufnehmen:

add_filter('wp_mail_from', 'new_mail_from');
add_filter('wp_mail_from_name', 'new_mail_from_name');

function new_mail_from($old) {
 return 'no-reply@debacher.de';
}

function new_mail_from_name($old) {
 return 'Debacher.de';
}

Durch diese beiden Filter wird der Absender bei den ausgehenden Mails auf die gewünschten Einstellungen gesetzt.

 

2. Administrator-E-Mail-Adresse

Manchmal hat man mehrere Administratoren und möchten allen die entsprechenden Mails zukommen lassen. Im Backend ist es aber nicht möglich mehrere Mailadressen anzugeben, das geht nur direkt in der Datenbank.
Hier sucht man die Tabelle wp_optins aus (eventuell haben die Tabellen ein anderes Präfix) und dort den Eintrag admin_email

Dort kann man dann mehrere Mailadressen, durch ein Komma getrennt eingeben, also so, wie sie der Mailserver als Liste von Adressen akzeptiert.

Dieser Eintrag ist dann auch so im Backend zu sehen, kann dort aber nicht verändert werden, da in diesem Formular bei einer Eingabe eine gültige Mailadresse erzwungen wird.

Auf mehreren Systemen habe ich aktuell die Aktualisierung ausführen lassen. Ausgangspunkt war jeweils die Version 20.0.14, die nicht mehr unterstützt wird. Zum Glück ist bei Nextcloud das Update kein großes Problem, wobei der Teufel im Detail steckt.

1. Update auf 21.0.9

Beim Update teilt Nextcloud mit, dass zwei Erweiterungen deaktiviert werden müssten:

  • Deck
  • Talk (speed)

Die Erwähnung von Talk irritierte mich, es ist aber nach dem Update ganz normal vorhanden.

In der Einstellungsübersicht wurde dann auf fehlende Indices hingewiesen. Das lässt sich prinzipiell lösen mittels:

 sudo -u www-data php occ db:add-missing-indices

Doch gab es hier eine Warnung über ein Fehlen von einem  APC Modul. Daher musste ich erst die Zeile

apc.enable_cli=1

in der Datei  /etc/php/7.4/cli/php.ini ergänzen.

Danach ließen sich die Indizes ergänzen.

Bei einem der Systeme gab es dann Fehlermeldungen im Zusammenhang mit Unterverzeichnissen von .well-known. Eigentlich war meine Konfiguration stimmig, ich habe aber dann trotzdem den Alias-Eintrag nochmals für Port 80 und 443 gesetzt:

 Alias /.well-known /var/www/vhosts/beispiel-domain.de/httpdocs/.well-known

Nach einem Neustart des Apache war der Fehler beseitigt.

Und nun noch der nette Hinweis:

Für Deine Installation ist keine Standard-Telefonregion festgelegt....

Das muss man händisch in der Datei config/config.php machen. Dort ergänzt man die Zeile:

'default_phone_region' => 'DE',

Bei einem der Systeme tauchte die Meldung auf:

Dem Modul php-imagick fehlt die SVG-Unterstützung...

Das lässt sich lösen, indem man ein Paket nachinstalliert:

sudo apt install libmagickcore-6.q16-6-extra:amd64

 

2. Update auf 22.2.5

Unter Einstellungen -> Übersicht geht es dann an die nächste Runde des Updates. Danach wurden wieder fehlende Indices moniert, also erneut

 sudo -u www-data php occ db:add-missing-indices

Nun noch in der Apache Konfiguration ergänzen

 Header add Strict-Transport-Security "max-age=15768000"

und dann blieb noch die Fehlermeldung

Eine Hintergrundaufgabe, die nach vom Benutzer importierten SSL-Zertifikaten sucht, läuft noch. Bitte später erneut versuchen.

Das ließ sich nach etwas Recherche beseitigen mittels:

sudo -u www-data php -f ./cron.php

Nun sind alle Prüfungen bestanden.

Wenn das immer so einfach wäre 😉

Veröffentlicht unter linux.

Ein sehr nützliches Tool um die Temperaturen der Hardwarekomponenten auf einem Linux-Rechner anzuzeigen ist Psensor.

Screenshot Psensor

Es kann ja immer mal sein, dass ein Kühler ausfällt oder Staub seine Wirkung verringert. Mit Psensor kann man auch Grenzwerte einstellen, deren Überschreitung einen Alarm auslöst.

Eine Installationsbeschreibung kann ich mir hier schenken, die gibt es unter:

https://pinguin.gws2.de/ubuntu-temperaturen-des-systems-anzeigen-diagnosetool/

https://wiki.ubuntuusers.de/Psensor/

 

Zurzeit bin ich dabei mit mehreren dieser kleinen Geräte Anwendungen zu realisieren. Dabei tauchen immer wieder Informationen auf, die ich nicht verlieren möchte. Dazu dient dieser Beitrag.

Raspis Temperatur

Der Raspi verfügt über einen eingebauten Temperatur-Sensor. Dieser Sensor lässt sich folgendermaßen abfragen:

cat /sys/class/thermal/thermal_zone0/temp

Dieser Aufruf liefert momentan konkret:

42345

Das ist als Temperatur von 42,3° zu interpretieren (einfach durch 1000 teilen).

Etwas direkter erhält man diese Temperatur mittels

vcgencmd measure_temp

Das liefert die Ausgabe

temp=42.3'C

 

In der letzten Zeit ist es nicht einfacher geworden PDF-Dokumente in einer Webseite darzustellen. Zwar beherrscht Firefox das problemlos, aber z.B. nicht die Android-Version. Auch auf verschiedenen Apfel-Geräten funktioniert das nicht von Haus aus.

Zum Glück gibt es das Projekt https://github.com/mozilla/pdf.js mit dessen Javascript die Einbindung auf sehr vielen Geräten identisch funktioniert. Ich habe mir die Software von https://mozilla.github.io/pdf.js/getting_started/ geladen und die ZIP-Datei in ein Verzeichnis /pdfjs entpackt.

Leider ist die Nutzung des Scripts etwas aufwendig. Eine einfache Lösung besteht darin die mitgelieferte Viewer-Seite aus dem Unterverzeichnis /pdfjs/web zu nutzen und über einen Iframe einzubinden:

<iframe id="pdf-js-viewer" 
        src="/pdfjs/web/viewer.html?file=/fileadmin/user_upload/netthelp.pdf" 
        title="webviewer" 
        frameborder="0" 
        width="500" 
        height="600">
</iframe>

Leider ist diese Lösung so nicht responsiv. Mit Hilfe von https://www.w3schools.com/ habe ich mir folgende Lösung erarbeitet (hier für eine Typo3 Installation):

<div style="position: relative;
            width: 100%;
            overflow: hidden;
            padding-top: 141%;
           ">
  <iframe id="pdf-js-viewer"
          src="/pdfjs/web/viewer.html?file=/fileadmin/user_upload/netthelp.pdf#zoom=auto"
          title="webviewer"
          frameborder="0"
          style="position: absolute;
                 top: 0;
                 left: 0;
                 bottom: 0;
                 right: 0;
                 width: 100%;
                 height: 100%;
                 border: none;
          ">
  </iframe>
</div>

Der Trick besteht darin ein DIV Element zu nutzen, das die ganze verfügbare Breite einnimmt und über padding-top eine darauf basierende Höhe bekommt. Bei den DIN Ax Dokumenten ist das Höhen-Breiten-Verhältnis 1,41:1 bei Portrait und 1:1,41=0,71:1 bei Landscape.

In dieses Element hinein wird dann der IFrame geladen und bekommt den vollständigen Platz zur Verfügung gestellt.

Mittels #zoom=auto wird erreicht, dass sich auch der PDF-Viewer an den zur Verfügung stehenden Platz anpasst. Hinter zoom=… könnten folgende Angaben stehen:

  •  200 (oder eine beliebige Prozentzahl)
  • page-width
  • page-height
  • page-fit
  • auto

Außer zoom gibt es noch den Parameter page=, damit kann angegeben werden, mit welcher Seite des PDFs die Darstellung startet. Weitere Möglichkeiten finden sich auf der Seite https://github.com/mozilla/pdf.js/wiki/Viewer-options.

Weitere Informationen:

Gelegentlich kann es sinnvoll sein die Passworteingabe beim SSH-Login zu vermeiden. Wenn man den SSH-Login z.B. aus einen Script heraus vornehmen will oder wenn andere Nutzer das Passwort auf dem Server ändern können.

In solch einem Fall kann man mit vorab ausgetauschten Schlüsseln arbeiten.

Dazu meldet man sich einmal normal per SSH- mit Passwort an:

ssh benutzer@server

Das kann auch schon lang vorher einmal geschehen sein. Dann erzeugt man sich sein Schlüsselpaar:

 ssh-keygen -t rsa

Auf eine Passphrase kann man verzichten, wenn man den Zugang für ein Script benötigt.

Es werden hiermit zwei Schlüsseldateien im Ordner .ssh erzeugt:

  • id_rsa
    das ist der private Schlüssel den man nicht weitergegeben darf
  • id_rsa.pub
    das ist der öffentliche Schlüssel, den wir auf den Zielrechner übertragen

An einfachsten kann man mit folgendem Befehl den Schlüssel in einem Rutsch übertragen:

 cat .ssh/id_rsa.pub | ssh benutzer@server 'cat >> .ssh/authorized_keys'
Veröffentlicht unter linux.

Kürzlich hatten wir das Problem, dass in der Mail-Warteschlange sehr sehr viele Mail auftauchten. Da waren zum größten Teil fehlgelaufene Systemmeldungen von Arpwatch.

Da habe ich micht etwas mit dem Mailserver Exim beschäftigt.

Für die grundlegenden Befehle gibt es unter http://www.florian-fritsch.com/exim4-kleines-mailqueue-howto/ eine nettes HowTo.

Spannend finde ich auch die Informationen unter http://bradthemad.org/tech/notes/exim_cheatsheet.php, speziell der Befehl

exiqgrep

bietet ungeahnte Möglichkeiten.

Einige Provider haben Sender Policy Framework (SPF) aktiviert. Damit kann der empfangende Server erreichen, dass er nur noch Mails von Servern annimmt, die im SPF-Record der absendenden Domain eingetragen sind. Das sollte theoretisch SPAM verhindern. Mehr Informationen zu dem Problem unter https://www.heinlein-support.de/blog/news/gmx-de-und-web-de-haben-mail-rejects-durch-spf/ .

Leider verhindert das auch alle Weiterleitungen von Mails der absendenden Domain. Eine Lösung für dieses Problem ist ein Umschreiben der Absenderadresse bei der Weiterleitung mittels Sender Rewrite Schema (SRS). Da Postfix dafür von Haus aus keine Komponenten mitbringt braucht man zusätzliche Software.

Im Web finden sich mehrere Projekte für diesen Zweck, die in der Regel mit einem zusätzlichen Dämon arbeiten:

Ich habe mich für postsrsd entschieden und bin der Anleitung unter https://seasonofcode.com/posts/setting-up-dkim-and-srs-in-postfix.html gefolgt.

zipper -i cmake
cd /tmp
wget https://github.com/roehling/postsrsd/archive/master.zipunzip -e master.zip
cd postsrsd-master
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ../
make
sudo make install

Der letzte Befehlt hat dann folgende Aktionen ausgelöst:

[100%] Built target postsrsd
Install the project...
-- Install configuration: ""
-- Installing: /usr/sbin/postsrsd
-- Installing: /usr/share/doc/postsrsd/README.md
-- Installing: /usr/share/doc/postsrsd/README_UPGRADE.md
-- Installing: /usr/share/doc/postsrsd/main.cf.ex
-- Chroot jail: /usr/lib/postsrsd
-- Installing: /etc/default/postsrsd
-- Installing: /etc/systemd/system/postsrsd.service
-- Generating secret key
-- Installing: /etc/postsrsd.secret

Danach waren die notwendigen Dateien vorhanden. Ein

service postsrsd status

liefert aber die Fehlermeldung:

systemd[1]: [/etc/systemd/system/postsrsd.service:13] Unknown lvalue 'RuntimeDirectory' in section 'Service'

Anscheinend gibt es den Wert RuntimeDirectory in der auf dem Server vorliegenden Version von Systemd noch nicht https://www.freedesktop.org/software/systemd/man/systemd.exec.html . Konsequenterweise startet des Dämon auch nicht, ich musste erst das Verzeichnis /run/postsrsd/ per Hand anlegen.

Danach muss man dann noch die Postfix-Konfiguration zu erweitern, dass der neue Dämon auch eingebunden wird:

sender_canonical_maps = tcp:localhost:10001
sender_canonical_classes = envelope_sender
recipient_canonical_maps = tcp:localhost:10002
recipient_canonical_classes= envelope_recipient,header_recipient

Ich muss das alles einmal in Ruhe testen.

Weitere Anleitungen, die ich testen will: