Virtuelle Domäne mit GNU pop3d und Postfix

Virtuelle Domäne mit GNU pop3d und Postfix
Copyright ©
For original English text, go to:
Translated by M.Dmitrieva

Das GNU pop3d 0.9.13 ist bereit. Sie können GNU pop3d 0.9.13 hier herunterladen


Upcoming release
xx/Feb/2011 0.9.14 Jørgen Thomsen,
	Optional IPv6 support added. Configure at compile time with --enable-ipv6 and use the --ipv6 switch at runtime

        Individual syslog priorities kept in pop3_syslog.

        Help text cleaned up

07/Feb/2011 0.9.13 Jørgen Thomsen,
        Syslog logging from the pop3_signal signal handler routine caused hanging processes especially during DoS attacks or
        by many simultaneous clients. Partly fixed (may still occur when using this bit (08) in the debug mask)

        Bugfix: certain login methods did not work (David B. Cortarello)

        The global child counter child_procs changed from int to 'volatile sig_atomic_t' to decrease the possibility of
        it not being updated properly.
        The counter was not always decremented so the program used only one instance, when max child
        processes were incorrectly reached.

        Most recent GNU config.guess and config.sub installed. and improved and support for detection of Atom processors added and more support for
        service installation (/etc/init)

        The RFC directory deleted as the RFCs are readily available on the Internet

26/Apr/2010 0.9.12 Jørgen Thomsen,
	Possible double free of the mailbox name variable in special error situations e.g at two simultaneous logins to
	the same mailbox.

	config.guess and config.sub missing from the distribution

	Added a start message to the syslog

18/Apr/2010 0.9.11 Jørgen Thomsen,
        The program is maintained on a Linux Fedora platform with no testing possible on other platforms, but
        with an attempt to avoid Linux specific features.

        Improvements to the configure script including 64 bit CPU support.

        The Nagle (TCP No Delay) algorithm has been disabled causing a large improvement in speed.

        SO_REUSEADDR added to daemon socket for immediate reuse of socket after a restart.

        Signal handling improved to be more portable (sigaction) and unsafe calls removed from the signal handler. Termination
        after a signal should now be much better not leaving the mailbox.lock files around.

        *bug* the sock variable in the child was always -1 and not the actual socket (sock2) so pop3_signal in a child did not close the socket.
        Removed sync() calls as e.g. copying large files to an USB disk would cause a hang until all data were written to the disk (several minutes)

        Conditional compilation of debugging statements removed as the overhead is so small.
        The debugging parameter has been changed to a 2 hex digit bit mask (children, daemon) and additional
        debugging statements have been inserted.

        MAXHOSTNAMELEN increased to 128 due to IDNA domain names

        gnu-pop3d file for /etc/event.d included

        man page updated

18/Jul/2007 0.9.10 Jørgen Thomsen,
        fcntl lock on mailbox changed to write lock
        sync() always called at unlock
        read data from client when timeout enabled (select) now checks for broken pipe too causing immediate exit,
        if the client disappears suddenly.
        When mailbox was copied to new mailbox, some MTAs (e,g, postfix) might continue writing to the old mailbox.
        Now the empty old mailbox is kept as mailbox.old and merged with the new one if not empty at next run.

24/Aug/2003 0.9.9-5 Jørgen Thomsen,
        The test for header lines wasn't strict enough Status: and X-Status: considered equal (Jem Berkes)
        Command lines were not assembled to one line if received as separate TCP-packets (Nicolas Gregoire)

18/Jan/2003 0.9.9-4 Jørgen Thomsen,
        Support for Postfix X-Original-To: header line for Message Disposition Notification.
        UIDL computation will no longer include X- headerlines, as they may be added by some mailreaders.
        '%' is allowed as delimiter instead of @ in a virtual username (email address)
        Minor internal changes.
        Additional support for the by the author (how to find the mailbox)
18/Oct/2002 0.9.9-3 Jørgen Thomsen,
	Corrected an error when a bad mailbox did not contain 'From ' as first line.
05/Sep/2002 0.9.9-2 Jørgen Thomsen,
        The fix for disk full prevented the changed mailbox to be written to the .new file. It was retained unchanged
04/Sep/2002 0.9.9-1 Jørgen Thomsen,
        If the mailbox did not terminate by a line feed (if crash while writing a message into it)
        an infinite loop was occurring. If the mailbox is modified by GNU pop3d, it will be fixed.
        When the disk became full when writing the new mailbox it was not detected and the new mailbox was truncated
19/Aug/2002 0.9.9 Jørgen Thomsen,
        Compatibility with vm-pop3d passwd files introduced (not fully tested)
        Added graceful stop by catching the signals (SIGHUP and SIGTERM).
        The final touches and version number changed to 0.9.9
19/Oct/2001 Jørgen Thomsen,
        Added Message Disposition Notification (return receipt, RFC 2298)
        Added configure options to avoid editing config.h in most cases
        Changed the update of the mailbox from copying inside the file to creating a new file (
        if needed and improved the copying inside the file. This improves the speed greatly especially for webmail programs.
        Introduced support for the classical Status: header line RFC 2076 (supported by e.q. Null Webmail

17/Oct/2001 Jørgen Thomsen,
        Added an old patch for better handling of children processes creation and death.
        Now child processes are created as needed and only the parent process is permanent.

VirtDomain 1.05

Das Web GUI Schnittstelle ist sowohl für die normale Postfix virtuelle Domäne als auch für meinen Wohlgeschmack funktionell: jth virtuelle Domänen. Es kommt als ein einzelnes Perl-Programm, das von Befehlszeile genannt wird, um ein virtuelles Gebiet zu bilden und vom Webserver verwaltet. Verlangt eine neue Ausgabe von Postfix VirtDomain 1.05

#!/usr/bin/perl -w
# Utility to administer virtual domains in postfix (both the standard
# ones and those defined in
# This program should reside in /var/www/cgi-bin/ with global
# read and execute rights (chmod o+rx /var/www/cgi-bin/
# Remember to define $main::postfixadmin below !
# The first argument to the program determines its function:

# CREATE:  call from commandline as root: create virtual domain by updating
#          /etc/postfix/virtual and virtual_regexp
#          and creating /etc/virtual/domain/passwd and /var/spool/virtual/domain
#          CREATE <domain name> <real user administering the domain>
#                               <passwd> [postfix]

# DELETE:  call from commandline as root: delete virtual domain by updating
#          /etc/postfix/virtual and virtual_regexp
#          and deleting /etc/virtual/domain/passwd and /var/spool/virtual/domain as
#          well as .forward files in the administrators homedir
#          DELETE <domain name> <real user administering the domain> <passwd>

# <blank>
#          if called from postfix as mail to user@domain the email on STDIN will be processed
#          according to the setup of the user in /etc/virtual/domain/passwd.
#          MAILBOUNCE: bounce email to unknown users otherwise store in postmaster mailbox

# <blank>  if called from postfix as mail to postmaster@domain or <postfixadmin+postmaster>
#          with the subject "*** Virtual domain update ***" and line 1 is trans=UPDATE....
#          a user will be created/updated/deleted
#          otherwise process email normally as above

# <blank>: if called from a web server displays webpages to update the user
#          base in a virtual domain e,g,

# As a basis the user postmaster must be defined for the domain.
# in the /etc/virtual/domain/passwd file. The user and group ids as
# well as homedir from this user is used for the virtual domain.
# For each virtual user the file homedir/.forward+user--domain is created.
# The web server should have read access to these files as well as
# the /etc/virtual/domain/passwd file.
# The GNU pop3d deamon as maintained by me is supporting this
# virtual domain implementation.
# Using this program to deliver the mail for jth style domains is not suitable for
# a high volume system, as loading the Perl interpreter
# has a fairly high initial CPU usage compared to this program (90% of total run time).
# However, using the provision for hooking in another program to deliver the mail
# may be useful. An awk utility may be used instead virtual.awk
# ©2002 Jørgen Thomsen,
# 1.01  2002-08-22 Official release
# 1.02  2003-01-24 Support for new virtual_alias_map parameter and relay_domains behaviour
# 1.03  2003-04-26 Better language support and fix webmail URL in info
# 1.04  2003-05-30 Chars | and " were removed from forwards in input. Now user shall not enter |, but start commands with "
# 1.05  2004-08-06 Modifications specific to /var/www/perl, body background changed, no CGI used

Alt, aber grundsätzlich still gültig

Änderungen bei GNU pop3d 0.9.8
(einschließlich einige Änderungen, die nicht mit virtuellen Domäne verbunden sind z.B. POP-before-SMTP)

Gestützt auf meinen eigenen Bedürfnissen habe ich ein Patch für das GNU-POP3D vers 0.9.8 gemacht.
Ich habe auch einigen der Bitten auf dem GNU pop3d Adressenliste zugehört.
Das Patch kann auch angewandt werden, wenn Sie das virtuelle Domain-Stuff nicht brauchen.

Basicallly ich habe das virtuelle Pacht durch Jeremy Reed genommen, hat ihn allgemeiner gemacht und hat mein eigenes GNU pop3d Änderungen hinzugefügt:

  • das Erlauben virtueller Domain-Benutzer auch reale Benutzer mit Briefkästen anderswohin zu sein
  • das Hinzufügen von APOP Support für virtuelle Domain-Benutzer
  • das Hinzufügen der Default-Domäne, abgezogen zu werden, wenn für die reale Domäne z.B “”-> “userid” verwendet wird
  • zusätzliche Protokollierung von Nichtnullfehlercodes von Befehlen
  • der hinzugefügte UIDL Befehl besorgt eindeutige Identifizierungsnummer für jede Nachricht
  • korrigiert die Berechnung der Nachrichtengröße
  • der Code hat ein bisschen gereinigt, vor allem befreit zugewiesenen Speicher
  • j6: hinzugefügt “von <IP Adresse>” zum Logmessage “Incoming connection opened”
  • j7: zusätzliche neue Nachricht “Authenticated IP <IP address>” zum Maillog für die POP-before-SMTP Support
  • j8: entfernt (auskommentiert) die Maillog-Nachricht “Authenticated IP <IP address>”
    hinzugefügt ” von <IP Adresse>” zum Logmessage ” Benutzer % s hat sich mit Mailbox% s angemeldet “, so dass das POP-before-SMTP Dienstprogramm durch Bennett Todd modifikationsfrei verwendet werden kann

Die Suche nach einem Benutzerbriefkasten wird als durchgeführt

  1. suchen MAILSPOOLHOME (z.B. /home/user/mail/mailbox)
  2. suchen _MAILDIR (z.B. /var/mail/user)
  3. suchen VIRTUAL_MAILDIR (z.B. /var/spool/virtual/domain/user)
  4. geben Sie auf und verwenden /dev/null

Patch GNU pop3d

Statt jeder Anwendung der Patches habe ich das getan.

  1. Laden die gepatchte Quelle gnu-pop3d-0.9.11.tar.gz herunter
  2. Bilden die config.h Datei dadurch
    . /configureoder./configure –enable-ip-based-virtual(siehe auch ein anderer Aufruf unten)
  3. Im Bedarfsfall/Gesucht MAILSPOOLHOME (z.B “/mail/mailbox”) zu definieren, und/oder DEFAULT_DOMAIN in config.h
  4. Kompilieren durch

Die technischen Änderungen

  • das Format der virtuellen Bereichskennwort-Datei ist gleich dem Standard/etc/passwd Dateiformat gemacht worden
    username:password:user id: (Gruppe id): (Benutzername): Mailbox directory: (Schale)
    sodass sie durch den pwck Befehl überprüft zu werden, z.B.
    Die eingeschlossenen Felder in der Parenthese werden nicht verwendet. Mailbox directory sollte’.’ Sein, wenn nicht verwendet wird
  • APOP Support war im 0.9.8 Vertrieb arbeitsunfähig. Es wird abgesondert vom Test wieder aktiviert, dass einem APOP Benutzer nicht erlaubt werden sollte, den BENUTZER-Befehl bei der Anmeldung zu verwenden. Das ist nicht logisch, weil Benutzer verschiedene Postprogramme verwenden können, um die Post zu überprüfen. Einige von diesen können APOP nicht unterstützen
  • das ursprüngliche virtuelle Patch verwendet verschlüsselnde Kennwörter in der passwd Datei. Um APOP von derselben Datei zu unterstützen, sind die Kennwörter jetzt unverschlüsselt
  • die einzigartige-id von einer Nachricht wird als eine MD5 Auswahl auf der Initiale “From” – Linie berechnet, und alle Headerzeile außer dem Bedürfnis nach dem fakultativen Message-ID:-field
  • Zeilenpuffer Länge hat von 80 bis 160 Charakteren zugenommen, vermeiden eine Linie mit 2 Fgets-Anrufen in den meisten Fällen zu lesen. Leute, die proportionale Schriftarten verwenden, können 80 Charaktere/Linie leicht überschreiten
  • hinzugefügte “UIDL” zu den gezeigten Fähigkeiten durch den CAPA-Befehl
  • zusätzliche Nachricht “Authenticated IP a.b.c.d”  zu Maillog sowie IP richtet an die “Incoming connection opened” für die POP-before-SMTP Support

Das Einführen virtuellen Domänen in Postfix und GNU pop3d

Der Grund dafür, die normale Postfix virtuelle Domäne nicht zu verwenden, ist zweifach:
1) diese Durchführung konzentriert sich auf virtuelle Gebiete mit jedem seinem eigenen Verwalter
2) die folgenden Beschränkungen (zitieren aus der Dokumentation von Postfix(meine Betonung)):
Dieser Agent wurde ursprünglich auf dem Postüfix lokales Lieferreagenz basiert. Modifizierungen haben hauptsächlich aus dem umziehenden Code bestanden, der entweder nicht anwendbar war oder das in diesem Zusammenhang nicht sicher war: Decknamen, ~user/.forward Dateien, Übergabe zu “|command” oder zu/file/name

Die folgenden stellt eine Weise von de Ausführung eines virtuellen Gebiets dar,, in Postfix und GNU pop3d.
Ein echter Benutzer kvt_dk ist auf dem System definiert worden. Das Benutzerverzeichnis dieses Benutzers enthält einige Daten für das virtuelle Gebiet
Zwei Benutzer werden bei definiert: (nur virtueller Benutzer) und (echter Benutzer kvt_dk beim Mailserver)
Die Ausführung basiert auf Redhat Linux 7.0

GNU pop3d

Jeremy Reeds ursprüngliche Beschreibung von virtuellen Patch

Das virtuelle Patch nimmt die folgenden Dateistrukturen an:
für die Definition von Benutzern, Kennwörtern und Mailbox-Directory

In diesem Beispiel bilden das /etc/virtual/ Verzeichnis

Der Default-Mailbox für einen virtuellen Benutzer ist
/var/spool/virtual / <domain> / <user>

In diesem Beispiel bilden das /var/spool/virtual/ Verzeichnis

Bei meinem Server wird die Post im homedir des Benutzers /home/ <usr>/Mail/mailbox versorgt, verlangt die Definition von MAILSPOOLHOME in config.h.
Ich habe auch nur eine IP-Adresse und will mein Hauptgebiet “” automatisch aus Mail Anforderung zum GNU pop3d abgezogen zu werden.

Ich habe die config.h Datei durch den Befehl erzeugt

./configure --enable-64bit --enable-maildir --enable-language=DA

Vor dem GNUS pop3d Kompilieren habe ich sichergestellt, dass die folgenden Konstanten in config.h definiert wurden:

#define MAILSPOOLHOME "/Mail/mailbox"
#define USE_VIRTUAL 1


Bilden diese Datei mit dem folgenden Inhalt

601 ist die Benutzerkennung von kvt_dk Benutzers. 100 ist die Gruppe ID (Gruppenpost bei meinem Server). Das ‘.’ Benutzerverzeichnis für abc soll gerade pwck glücklich machen.
E-Mail dafür wird an /home/kvt_dk/mail/mailbox (sieh unten) geliefert.
E-Mail dafür wird an/var/spool/virtual/ geliefert

Wenn Sie dem kvt_dk Benutzer vertrauen, dann die passwd Datei im Benutzerverzeichnis des Benutzers kvt_dk. und verbinden Sie es ins /etc/virtual/ Verzeichnis
ln -s /home/kvt_dk/passwd /etc/virtual/

Bemerken das könnte ein Sicherheitsrisiko hier geben, weil GNU pop3d mit jeder angegebenen Benutzerkennung in der passwd Datei durchführen wird. Ob das eine echte Drohung ist, muss analysiert werden.

Der Eigentümer und die Erlaubnis auf den Dateien und Verzeichnissen sollten kvt_dk.mail und 700 z.B sein
chmod 700 /etc/virtual/ /etc/virtual/ /var/spool/virtual/
chown kvt_dk.100 /etc/virtual/ /etc/virtual/ /var/spool/virtual/


Diese Ausführung kann komplizierter als andere sein, aber sie erlaubt verschiedenen Verwaltern jedes virtuellen Gebiets, das alles im Hausverzeichnis des Domänenverwalters behält.


recipient_delimiter = +
home_mailbox = Mail/mailbox
allow_mail_to_commands = forward
allow_mail_to_files = forward


- rw-r - r -   1 kvt_dk  Post   am 12. Dez 10 02:52.forward
- rw-r - r -   1 kvt_dk  Post   am 25. Dez 10 01:55.forward+abc -
- rw-r - r -   1 kvt_dk  Post   am 20. Dez 10 02:53.forward+kvt -


|"exit 67"

Hüpfen jede Nachricht nicht für oder

/home/kvt_dk/.forward+abc –

| /usr/local/bin/virtual

Liefern Sie die ganze Post für zum virtuellen Domain-Mailbox für abc, ändernd das Gelieferte – Zu: Headerlinie an den richtigen.

/home/kvt_dk/.forward+kvt –


Liefern Sie die ganze Post für beim Mailbox von kvt_dk

/etc/postfix/virtual                    anything         postmaster          jth

Die echten Benutzer: Postmeister und jth müssen die ganze Post für den Postmeister und Webmaster des virtuellen Gebiets empfangen


/^(.+)@(.+\.)?(kvt\.dk)$/ kvt_dk+$1--$2$3

Dieser Ausdruck wird Postfix veranlassen, jede Post mit adresses und dem echten Benutzer kvt_dk liefern, sodass das ursprünglichen Umschlag-Empfänger als eine Erweiterung auf die neue Empfänger-Adresse halten.


awk  -F: -f /usr/local/bin/virtual.awk


# J. Thomsen 2002-04-11 Postfix utility
# /usr/local/bin/virtual.awk
# Used by Postfix for delivering mail to a GNU-pop3d virtual domain
# mailbox.
# Postfix will use this utility for delivering a message to the local
# mailbox rewriting the Delivered-To header line to the original recipient
# address.
# 2002-04-11 Fix 'From ' lines in msg body and add empty line to msgs to ensure the separation of messages

Liefern an der virtuellen Domain-Mailbox z.B. zu /var/spool/virtual/
Das Delivered-To: Header wird modifiziert, um die ursprüngliche Umschlag-Empfängeradresse (nach der möglichen Modifizierung durch Decknamen) zu enthalten.