Problem: Es lassen sich keine Mails an eine Domain auf dem Rootserver schicken, deren Mail von einem anderem Server verwaltet wird

Wenn man von einer Domain auf einem anderen Server eine DNS-Umleitung (A-record) auf einen virtuellen Host auf dem Rootserver vornimmt, kann es zu Problemen beim Versenden von Mails an diese Domain kommen.

Es handelt sich hierbei um einen Fehler, der bereits seit langem in Plesk vorhanden ist, hierzu diese Links:

Hier konnte das Problem auf zwei Servern nachvollzogen werden:

  • opensuse 11.0 und Plesk 9.0.1
  • opensuse 11.1 und Plesk 9.5.1

Die Lösung wurde gefunden, nachdem ein (natürlich bezahltes) Plesk service ticket auf dem 2nd level entsprechende Hinweise gab, die dann zum Auffinden der obigen Links geführt haben.

Die Vorbedingungen

  1. Auf dem Rootserver wurde eine Domain domain.tld angelegt.
  2. Die Domain wurde über den A-record Eintrag auf die IP des Rootservers umgeleitet.
  3. Auf dem Rootserver wurde die Option E-Mail-Dienst auf Domain aktivieren deaktiviert.

Der Webseitenaufruf wird nun ohne Problem auf den Rootserver umgeleitet. Die Auslieferung der Webseiten erfolgt durch den Rootserver.

Auf dem Plesk-Server wird postfix als MTA verwendet. Ob das Problem auch bei Verwendung von qmail als MTA auftritt wurde nicht verifiziert.

Das Problem

Wenn nun von irgendeinem Mail-Account auf dem Rootserver Mails an eine Adresse unter domain.tld geschickt werden soll, dann kommt folgende Fehlermeldung zurück:

"<_plesk_bounce_domain.tld@localhost.localdomain> (expanded from
<test@domain.tld>): This address no longer accepts mail."

Das Problem tritt auch auf, wenn in den Einstellungen zur Domain in Domains > domain.tld > E-Mail-Accounts > E-Mail-Einstellungen die Option E-Mail an nicht existierenden Benutzer auf Zurückweisen steht.

Der Fehler liegt bei Plesk. Wenn einmal in den E-Mail-Einstellungen die Option E-Mail an nicht existierenden Benutzer auf Bounce mit Nachricht gestellt und so abgespeichert worden ist, wird in der Datenbank-Datei /var/spool/postfix/plesk/aliases.db ein Eintrag in folgenden Form vorgenommen:

_plesk_bounce_domain.tld       "|/usr/lib64/plesk-9.0/bouncemessage This\\\ address\\\ no\\\ longer\\\ accepts\\\ mail."

Dieser Eintrag wird von Plesk nicht mehr entfernt, wenn eine Umstellung der Option E-Mail an nicht existierenden Benutzer erfolgt.

Ob ein entsprechender Eintrag Datenbankdatei enthalten ist, lässt sich mit den folgenden Befehlen feststellen:

postalias -s /var/spool/postfix/plesk/aliases | grep domain.tld

oder

postmap -s /var/spool/postfix/plesk/aliases | grep domain.tld

Ausserdem sollte man überprüfen, ob in der Datenbank-Datei /var/spool/postfix/plesk/virtual.db Einträge für domain.tld enthalten sind. Das erfolgt ebenfalls mit den o.g. Befehlen:

postalias -s /var/spool/postfix/plesk/virtual | grep domain.tld

Sollten in dieser Datenbank ebenfalls Einträge enthalten sein, so ist zusätzlich noch die Lösung - Teil 2 (siehe weiter unten) zu beachten, insbesondere wenn ein Eintrag in der folgenden Form enthalten ist:

@domain.tld: _plesk_bounce_domain.tld@localhost.localdomain

In diesem Fall klappt die Mailzustellung an eine Adresse von domain.tld noch nicht. Die von Plesk standardmässig erzeugten Einträge sollten dagegen normalerweise (sofern man keine Mails an diese Adressen verschicken möchte) kein Problem darstellen.

postmaster@domain.tld        postmaster@localhost.localdomain
root@domain.tld      root@localhost.localdomain
drweb@domain.tld     drweb@localhost.localdomain
mailer-daemon@domain.tld     mailer-daemon@localhost.localdomain
anonymous@domain.tld anonymous@localhost.localdomain

Wie man diese dennoch entfernen kann, kann man ebenfalls aus Lösung - Teil 2 entnehmen. Dabei sollte man beachten, dass diese Einträge wohl nach dem nächsten Aufruf von mchk (siehe Lösung - Teil 1) wieder erstellt werden.

Die Lösung - Teil 1

Es gibt die Möglichkeit, die Mailkonfiguration mit Hilfe eine CLI-Programms (CLI = Command line interpreter) von Plesk zu aktualisieren. Das Programm mchk ist im Verzeichnis /usr/local/psa/admin/sbin/ zu finden, der Programmaufruf und die Programmausgaben erfolgen in etwa so:

# /usr/local/psa/admin/sbin/mchk
==> Checking for: mail_spam_restore... ok
==> Checking for: mailsrv_conf_init... ok
==> Checking for: mail_mailbox_restore... ok
==> Checking for: mailsrv_entities_dump... ok
==> Checking for: mail_admin_aliases... ok
==> Checking for: mail_auth_dump... ok
==> Checking for: mailman_lists_dump... ok
==> Checking for: mail_responder_restore... ok
==> Checking for: mail_drweb_restore... ok
==> Checking for: mail_kav_restore... ok
==> Checking for: mail_spf_restore... ok
==> Checking for: mail_dk_restore... ok
==> Checking for: mail_grey_restore... ok

Mögliche Parameter für mchk erhält man durch mchk --help.

mchk baut die Mail-Konfiguration neu von den Plesk-Datenbankeinträgen auf. Hat man also zuvor die Einstellung Option E-Mail an nicht existierenden Benutzer auf Zurückweisen umgestellt und abgespeichert, dann wird der Eintrag _plesk_bounce_domain.tld in der Datenbank-Datei /var/spool/postfix/plesk/aliases.db nach dem mchk-Befehl nicht mehr enthalten sein.

Nachtrag:

Von der Verwendung von mchk ist (zumindest unter Plesk 9.0.1) abzuraten, da es u.a. auch Einträge vom Typ

info@domain.tld     info@localhost.localdomain

erstellt, was bereits vorhandene E-mail-Accounts mit dem Namen info überschreibt.

Besser ist die Verwendung von

postalias -d <key> aliases-file

zum selektiven Löschen von Einträgen aus der aliases-Datei.

Die Lösung - Teil 2

Diese Teillösung beruht auf diesem Posting hier.

In Plesk wird unter der Domain in den E-Mail-Einstellungen die Option E-Mail an nicht existierenden Benutzer auf Zurückweisen umgestellt und abgespeichert.

Nun sollte der Eintrag

@domain.tld: _plesk_bounce_domain.tld@localhost.localdomain

nicht mehr in der virtual.db enthalten sein, zu prüfen durch:

postalias -s /var/spool/postfix/plesk/virtual | grep domain.tld

Möchte man nun auch noch die übrigen Einträge für domain.tld löschen, dann legt man für jeden dieser Einträge einen Mail-Account an. Man kann auch einen Mail-Account anlegen und diesem die restlichen Einträge als Aliase zuordnen. Dann löscht man diese Account. Nun sind auch diese Einträge nicht mehr in der virtual.db enthalten.

Allerdings werden diese Einträge nach einen mchk-Befehl von Plesk wiederhergestellt.

Issue: Mails can't be delivered to a domain, if another server is mail server for this domain

For a domain which is hosted on another server a DNS redirection (A-record) is set up to our rootserver. Sending mails to this domain will end up in error messages.

It an issue with Plesk which is already known quite a long time, see the following links:

We're able to reproduce the problem on to servers:

  • opensuse 11.0 and Plesk 9.0.1
  • opensuse 11.1 and Plesk 9.5.1

The solution has been found after a (paid) Plesk service ticket on the 2nd level gives some appropriate instructions. These led to the discovery of the above mentioned links.

Preconditions

  1. Domain domain.tld has been created on rootserver.
  2. A-record entry of domain is set to IP of rootserver (DNS redirection).
  3. On rootserver (in plesk panel) the option Activate mail service on domain for this domain is deactivated.

Website is redirected to rootserver without problems. Delivery of web pages is done by rootserver.

Plesk server uses postfix as MTA. It wasn't verified the issue will also occur with qmail as MTA.

The issue

If mail from any account on the rootserver is sent to a mail account of domain.tld you will get the following error message:

"<_plesk_bounce_domain.tld@localhost.localdomain> (expanded from
<test@domain.tld>): This address no longer accepts mail."

The problem also occurs if in the domain Mail preferences the option Mail to nonexistent user is set to Reject.

Obviously it's Plesk failure. If the option Mail to nonexistent user is set to Bounce with message and saved only once, there will be saved an entry in the database file /var/spool/postfix/plesk/aliases.db like the follwing one:

_plesk_bounce_domain.tld       "|/usr/lib64/plesk-9.0/bouncemessage This\\\ address\\\ no\\\ longer\\\ accepts\\\ mail."

This entry will not be deleted if option Mail to nonexistent user will be changed to another value.

Examine the database file with the following commands

postalias -s /var/spool/postfix/plesk/aliases | grep domain.tld

or

postmap -s /var/spool/postfix/plesk/aliases | grep domain.tld

In addition, you should check whether the database file /var/spool/postfix/plesk/virtual.db contains other entries for domain.tld enthalten sind. Check this with the following command:

postalias -s /var/spool/postfix/plesk/virtual | grep domain.tld

If there are entries in the database too you should refer to Solution - part 2 (see below), especially if you have found an entry of the following kind:

@domain.tld: _plesk_bounce_domain.tld@localhost.localdomain

In this case mail to any account at domain.tld will still fail. The default entries which are generated by plesk panel shouldn't be a problem as far as you don't like to send mails to this addresses:

postmaster@domain.tld        postmaster@localhost.localdomain
root@domain.tld      root@localhost.localdomain
drweb@domain.tld     drweb@localhost.localdomain
mailer-daemon@domain.tld     mailer-daemon@localhost.localdomain
anonymous@domain.tld anonymous@localhost.localdomain

Nevertheless you will be able to remove this addresses too, refer to Solution - part 2. Keep in mind that after a call of mchk (see  Solution - part 1) this entries will be restored.

Solution - part 1

There's a CLI program (CLI = Command line interpreter) called mchk which restores mail configuration from plesk database entries. You will find mchk in the directory /usr/local/psa/admin/sbin/. Running the program will create the following output:

# /usr/local/psa/admin/sbin/mchk
==> Checking for: mail_spam_restore... ok
==> Checking for: mailsrv_conf_init... ok
==> Checking for: mail_mailbox_restore... ok
==> Checking for: mailsrv_entities_dump... ok
==> Checking for: mail_admin_aliases... ok
==> Checking for: mail_auth_dump... ok
==> Checking for: mailman_lists_dump... ok
==> Checking for: mail_responder_restore... ok
==> Checking for: mail_drweb_restore... ok
==> Checking for: mail_kav_restore... ok
==> Checking for: mail_spf_restore... ok
==> Checking for: mail_dk_restore... ok
==> Checking for: mail_grey_restore... ok

You will get parameter for mchk with mchk --help.

mchk restores the mail configuration from plesk database entries. If option Mail to nonexistent user is set to Reject and saved before, then the entry _plesk_bounce_domain.tld will be disappeared from database file /var/spool/postfix/plesk/aliases.db after mchk command.

Postscriptum:

Better don't use mchk (especially with Plesk 9.0.1) because it creates entries from the following type:

info@domain.tld     info@localhost.localdomain

These entries are overwriting already existing E-mail accounts!

Better use the following command:

postalias -d <key> aliases-file

for selective removing entries from aliases file.

Solution - part 2

This part of the solution you can find described here.

In the Mail preferences settings for the domain you should change the option Mail to nonexistent user to Reject and save settings.

Now the entry

@domain.tld: _plesk_bounce_domain.tld@localhost.localdomain

should no longer be included in the virtual.db to be examined by:

postalias -s /var/spool/postfix/plesk/virtual | grep domain.tld

If you want to delete the other entries for domain.tld create a mail account for every of these entries. You might be able to create only one mail account and with aliases for the other entries. Then delete this mail account(s). Now this entries are noch longer included in the virtual.db.

Be aware that these entries will be restored with the next mchk-Befehl!