PHP Mails versenden lassen ohne eigenen Mailserver

Ein Mailserver ist nicht nur Konfigurationsaufwand, sondern man muss auch ziemlich genau wissen, was zu konfigurieren ist. Sich in die Materie einzuarbeiten und den Konfigurationsaufwand zu betreiben stand bei mir in keinem Verhältnis. Ich wollte nur Benachrichtigung von dieser - und von meiner Nextcloud bekommen. Mein Mail-Postfach habe ich sowieso „extra“ gehostet. Um über PHP – egal ob mit WordPress, Nextcloud oder Selbst entwickelt – Mails zu verschicken, bedarf es nur dem Programm msmtp. Es ist für Arch, /Debian und CentOS verfügbar. Im weiteren Verlauf erkläre ich Schritt für Schritt die notwendige Konfiguration der E-Mail-Konten und php.ini-Datei.

Installation

Unter Ubuntu bzw. Debian via Aptitude:

sudo apt install msmtp

Arch via Pacman:

sudo pacman -S msmtp

Beim Betriebssystem CentOS ist kein RPM package für MSMTP dabei. Deshalb muss es von Sourceforge heruntergeladen und kompiliert werden:

yum install make gcc pkgconfig
wget https://sourceforge.net/projects/msmtp/files/msmtp/1.6.6/msmtp-1.6.6.tar.xz/download
tar -xvf msmtp-1.6.6.tar.xz
cd msmtp-1.6.6
./configure
make
make install

Falls eine ältere Version von tar installiert ist, sollte vorher ein „yum “ durchgeführt werden. Die ein .xz-Tarball wird erst ab Version 1.22 unterstützt.

Konfigurationsdatei erstellen

Damit msmtp E-Mails über externe Mail-Server verschickt, müssen die Zugangsdaten hierfür in einer Konfigurationsdatei abgelegt werden. Es empfiehlt sich hierfür ein genau für diesen Zweck erstelltes Mail-Postfach zu nutzen. Sollte der eigene Server einmal kompromitiert werden, darf wenigstens das private Mailpostfach verschont bleiben. Die Konfigurationsdatei speichert Ihr am besten im Ordner /etc ab. Den Dateinamen könnt Ihr frei wählen. Hier als Beispiel dient uns „.msmtp_mailaccounts„.

Beispielkonfiguration anhand von Google Mail:

account gmail
logfile /var/log/msmtp.log
tls on
tls_certcheck off
auth on
host smtp.gmail.com
port 587
user bitpage.mailversand@gmail.com
from bitpage.mailversand@gmail.com
password irgendeinLangesNichtLeichtzuerratendesPassword$=?_

Falls der Mail-Provider kein starttls unterstützt, sollte noch bspw. nach „tls on“ die Zeile „tls_starttls off“ eingefügt werden. In der Konfigurationsdatei können mehrere Mailaccount-Zugangsdaten angegeben werden. Die Account-Namen (nach account, im Beispiel gmail) müssen allerdings eindeutig sein.

Damit der Webserver auf die Config-Datei zugreifen kann müssen die Gruppe und der Eigentümer auf www-data gesetzt werden. Falls Ihr einen anderen User und Gruppe für Euren Webserver nutzt, müsst Ihr die nachfolgenden Befehle entsprechend anpassen. Ebenso darf nur der Eigentümer der Konfig-Datei für msmtp Lese- und Schreibrechte (chmod 600) haben, da ansonsten msmtp den Dienst verweigert.

sudo chown www-data:www-data /etc/.msmtp_mailaccounts
sudo chmod 600 /etc/.msmtp_mailaccounts

PHP.ini konfigurieren

Fast geschafft! Jetzt muss dem PHP Interpreter nur noch mitgeteilt werden, wie er msmtp ansprechen soll, um Mails zu versenden. Hierzu müsst Ihr die Zeile mit der Konfiguration „sendmail_path =“ in der php.ini suchen und durch folgende ersetzen:

sendmail_path = „/usr/bin/msmtp -C /etc/.msmtp_mailaccounts -a gmail -t“

Damit auch im Fehlerfall auch eine Logdatei existiert müsst Ihr diese manuell anlegen und die Rechte an www-data abtreten:

touch /var/log/msmtp.log
chown www-data:www-data /var/log/msmtp.log

Fertig! Jetzt nur noch kurz euren Webserver neustarten („sudo service apache2 restart“ oder was auch immer bei euch notwendig sein wird) und Mails sollten nun über euren separaten Mail-Account verschickt werden.

Veröffentlicht von

Christopher Piontek

Ich bin ein technikbegeisterter Blogger, nebenberuflich (Fern-)Student der Wirtschaftsinformatik, hauptberuflicher Webentwickler und schreibe auf Bitpage.de gerne Technik-News, Tutorials und Reviews. Meine favorisierten Themen sind #Software, #Internet und digitale Fotografie.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert