|  Home  |  IT-KnowHow  |  Sonstiges KnowHow  |  Bookmarks  |  Über mich  |  Impressum  |  1und1 Shop  | 
Google


Referenzierte Quellen 
Aufbau meiner Werkbank 
Synergy 
Unix/Linux 
Debian 
Linux-Distributionen 
Paketverwaltung 
Fileserver 
Samba 
Grafische Oberfläche 
Festplatte - Boot, Partition, Raid, LVM 
SSH Tunnel, VPN 
FAQ 
Tips und Tricks 
Shellprogrammierung 
Windows 
cygwin 
ssh 
andLinux 
UltraISO 
Windows 7 
Windows CE 
Virtualisierung 
VMWare 
VirtualBox 
Cloud Computing 
Google App Engine GAE 
Storage 
AmazonWebServices 
Cloudfoundry 
RightScale 
Office-Pakete 
Serienbriefe mit OpenOffice 
OpenOffice Calc 
Sicherheit 
Abwehrmechanismen 
Zertifikate + SSL 
Zertifikate + eMail-Kommunikation 
Backup 
Tools 
Bacula 
Installation 
Tools 
Virenscanner 
Online-Banking 
Rechnerbetreuung 
Muli 
Schnecke 64 
Schnecke 256 
Opaks 
cooltek 
Laptop-Pflege 
Computer im Remote-Einsatz 
Software-Entwicklung 
Erfolgreiches Vorgehen 
Agile Softwareentwicklung 
Test-Driven-Development 
Software-Factory 
Domain-Driven-Design 
Model-Driven-Architecture 
CMMI 
Google AdWords 
Organisation 
Team 
Rollen im Projekt 
Anforderungen 
Anforderungs-Entwicklung 
Anforderungs-Management 
Google Analytics 
Architektur 
Best Concepts and Patterns 
Best Practices 
Camel 
IPF 
Design 
Best Practices 
Schnittstellen 
Persistenz 
ExceptionHandling 
Deklarative Entwicklung 
SOA 
UML Tools 
Programmierung 
Best Practices 
Java Core 
Classloader 
Generics 
JMX 
Anotationen 
Networking 
Threads 
I/O, Dateien, Steams 
Reflection 
Java EE 
Groovy 
Google Web Toolkit - GWT 
GUI Entwicklung 
HTTP 
Zeichencodierung 
XML 
XPath 
Json 
JSF 
CSS 
Firefox 
Eclipse Platform 
Eclipse als Java-IDE 
Derivate 
Organisation 
Debugging 
J2EE 
CMR mit WSAD 5.1 
PlugIns 
Subversion 
Git Plugin 
Sun Application Server 
JBoss 
Jetty 
Tomcat 
WebServices 
WSDL 
RESTful Webservices 
SOAP Webservices 
JMS - ActiveMQ 
Persistenz 
JDBC 
JPA / Hibernate 
JPA in Eclipse 
Oracle 
Performance / Tuning 
DB2 
MySQL 
MySql Administrator 
HSQLDB 
Microsoft SQL Server 
DBVisualizer 
Toad 
TOra 
Spring 
AOP 
Refactoring 
Logging 
Regex 
Lucene 
Mail 
Mailserver 
Mailclient 
JavaMail 
DNS 
LDAP 
Mobile Computing 
Platformen 
Android 
Handyauswahl 
Tablet a la iPad  
... aus Sicht des Handynutzers 
App Markets 
... aus Sicht des Entwicklers 
Plattform 
Programmierung 
... aus Sicht des Hackers 
Apps im Test 
Buildprozess 
ant 
maven 
Gradle 
Versionsverwaltung 
Subversion 
Git 
Zertifikate + SSL 
Dokumentation 
Kosten/Nutzen 
Index-Server 
Testen 
FIT 
FitNesse 
Selenium 
Performance 
JMeter 
soapUI 
EasyMock 
Code Analyse 
Lizenzmodelle 
HL7, CDA, CCD 
IHE Profile + Transaktionen 
ITIL 
IRC 
Netzwerke 
Provider 
Telefon 
Breitband-Internet 
Webhosting 
Webhoster 
Trafficanalyse 
Suchmaschinen 
Spam 
Internet-Werbung / AdSense 
1und1 - SmartDrive 
CMS 
Exponent 
Joomla 
Foto-Galerie 
Verschiedene 
(W)LAN 
Multimedia 
Gimp 
XnView 
ImageMagick 
Fotografie 
Digitale Fotografie 
Audio 
Voice-over-IP 
Video 
Video-over-IP 
DLNA, UPnP 
Videorekorder 
Hardware 
MP3 Player 
(Multi-Funktions-) Drucker 
Fritzbox 7390 
FritzBox 7270 
Netgear FM114P 
Mini-Fernseher 
Fernseher 2008 
Panasonic TX-P42GW20 
Fernseher 2012 
Netzwerkplayer 
Fernbedienung 
Satellitenanlage 
dbox 
Thomson IP1101 
Codemeter 
Navigationsgerät 
Pari Boy 
Kabelsalat 
Fuji Finepix S602 
Canon Ixus 40 
Canon Ixus 100 IS 
Spiegelreflex-Kamera 
Nikon D80 
Video-Kamera 
Ultra Mini PC - Asus eee PC 
Notebook 2012 
GPSMAP 76CSx 
Canon Lide 20 Scanner 
Lenovo UltraNav Tastatur 
Computer-Monitor - LG 2442 BF 
Kyocera FS-920 
Wäschetrockner 
Bluetooth Tastatur 
Aktiv-Lautsprecher 
Tablet Archos 101 G9 
Tablet zur Selbstorganisation 



IT-KnowHow  > Software-Entwicklung  > Programmierung  > Mail  > Mailserver 


Rund ums Mailen ...

Mail ist einer der ältesten Netzwerkdienste. Dementsprechend standardisiert (in Form von RFC) sind die verwendeten Protokolle (z. B. SMTP seit 1982).

Mailserver

Verwendete Protokolle:
  • POP3: Lesen von Mails - verwendet zur Kommunikation zwischen MUA und Mailserver
  • IMAP: Lesen von Mails - verwendet zur Kommunikation zwischen MUA und Mailserver
  • SMTP: Mailversand
    • verwendet zur Kommunikation zwischen MUA und Mailserver
    • verwendet zum Versenden zwischen MTAs

Wichtige Konzepte

siehe http://de.wikipedia.org/wiki/Mail_Transfer_Agent
  • MUA: MessageUserAgent - Komponente, die mit dem Mailsender (z. B. Mensch) und dem MTA sitzt. MUA und MTA sprechen miteinander die o. a. Protokolle (SMTP, IMAP, ...)
  • MTA: MessageTransferAgent leitet zu versendende eMails vom lokalen Netz zum MTA des Empfängers weiter (evtl. über weitere Vermittler-MTAs im Internet - fürs Routing sind sog. MX-records entscheidend).
    • ein MTA ist Teil eines Mailservers
  • MDA: MailDeliveryAgent. Nimmt die Nachrichten seines empfangenden MTA entgegen und sortiert sie in die Postfächer ein
  • MX-Record (http://de.wikipedia.org/wiki/MX_Resource_Record): MX-RR (MaileXchangeResourceRecord) sind Einträge im DNS. Sie dienen der Zustellung von eMails. Für jede Maildomain (bei info@cachaca.de ist cachaca.de die Maildomain) gibt es ein oder mehrere (mehrere ist zu empfehlen - dann kann man einen Mailserver auch mal vom Netz nehmen bzw. durch einen anderen ersetzen) Einträge, über welchen Rechnernamen (FQDN = FullQualifiedDomainName) ein Mailserver erreichbar ist (details siehe hier).
  • Fetchmail: viele Mailserver besitzen nicht nur einen MessageTransferAgent (zum Mailversand), sondern auch eine Komponente, um Mails von anderen Postfächern abzuholen. Dies bietet für die User den Vorteil, daß sie ihre Mails zentral in einem Mail-Postfach liegen haben. Hierzu muss man der Fetchmail-Komponente allerdings die Account/Passwörter auf den anderen Mailservern verraten

SMTP - SimpleMailTransferProtocol

Zum Mailversand wird dieses Protokoll verwendet. Es handelt sich um ein textbasiertes Protokoll, so daß ein Mailversand prinzipiell über telnet möglich ist (hier findet man ein Beispiel: http://de.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol).

SMTP über telnet-Protokoll

Da es sich bei SMTP um ein textbasiertes Protokoll handelt (wie HTTP auch) kann man auch einen einfachen telnet-Client (z. B. mit CommandLineInterface) verwenden, um eMails zu versenden. Hierzu bedient man sich der Kommandos, die im SMTP-Protokoll zur Verfügung stehen - siehe http://tools.ietf.org/html/rfc5321#page-19:

SMTP-Auth

Bekannte Mailserver

  • postfix (Aufrufkompatibel mit sendmail, d. h. für die Clients ist es transparent, ob sie mit postfix oder sendmail arbeiten)
  • sendmail
  • cyrus
  • qmail - im Gegensatz zu anderen Unix-MTAs: modularer  Aufbau
  • Apache James - erweiterbar über Mailet-API!!!

Mailzustellungsprozess



Nach Abfrage des MX-Records wird eine Verbindung zum Mailserver aufgebaut. ACHTUNG: der SMTP-Port ist nicht im MX-Record enthalten, denn es wird davon ausgegangen, daß der IANA-Standardport (für SMTP: 25) verwendet wird. Aus diesem Grund sollte man einen extern erreichbaren SMTP-Server immer auf Port 25 laufen lassen!!!

Mailserver postfix

Typischer Linux-Mailserver, der häufig schon out-of-the-box für Betriebssystem-internes Mailing konfiguriert ist. So bekommt ein Benutzer aktuelle System-Informationen, z. B.

  • gelaufene Cron-Jobs
  • abgebrochene Druck-Jobs
  • Systemnachrichten (zu jedem User lässt sich einstellen, ob er Systemnachrichten erhalten soll oder nicht - siehe Benutzerverwaltung)
    • fehlgeschlagene Login-Versuche
  • ...

Als Mailbox-Format wird mbox verwendet. Diese kann beispielsweise mit dem Mail-Client mailx gelesen werden - weitere Informationen findet man hier.

Konfiguration

Die Postfix-Konfiguration befindet sich üblicherweise in /etc/postfix/. So sieht das Ergebnis einer üblichen Konfiguration aus:

  • Mailboxen liegen in /var/mail/${USERNAME}
    • hier liegen die neuen (bzw. noch nicht gelesenen) Nachrichten
    • Anzeige dieser Nachrichten kann per Kommando mail von der Console erfolgen
  • evtl. eine Mailbox in /home/${USERNAME}/mbox
    • hier liegen die gespeicherten Nachrichten

OS-internes Mailing

Viele Informationen werden vom Betriebssystem automatisch per Mail zugestellt. Die Benutzer können untereinander aber auch per Mail kommunizieren (ohne weitere Mail-Infrastruktur). Im einfachsten Fall wird dazu der textbasierte mailx-Client verwendet (hier eine Mail an den Betriebssystemuser pfh):

mailx pfh

Der Mailclient ist interaktiv ... man wird dann nach dem Subject gefragt und kann den Text eingeben. Die Eingabe wird mit Ctrl-D beendet - dann erfolgt die Mailzustellung. siehe auch

Postfix als richtiger Mailserver

Damit Postfix auch nach außen (ins Internet - also zu nicht-Betriebssystem-Users) Mails verschicken kann, muss er allerdings noch speziell konfiguriert werden. Wenn man das nicht tut, so könnte es zu folgender Fehlermeldung kommen (siehe /var/log/mail):

Sep 28 11:33:18 linux-lmzo postfix/smtp[17095]: EC57C80C7: to=<info@cachaca.de>, relay=mail.cachaca.de[80.246.53.10]:25,

delay=1.1, delays=0.47/0.21/0.24/0.15, dsn=5.7.1, status=bounced (host mail.cachaca.de[80.246.53.10] said:

554 5.7.1 Service unavailable; Client host [xxx.yyy.21.144] blocked using zen.spamhaus.org;

http://www.spamhaus.org/query/bl?ip=xxx.yyy.21.144 (in reply to RCPT TO command))

Der Message-Transfer-Agent von Postfix wollte die Mail an info@cachaca.de zustellen. Hierzu hat er Kontakt zum SMTP-Server (mail.cachaca.de) aufgenommen. Der hat jedoch die Annahme verweigert, weil sich der Postfix nicht authentifiziert hat und die sendende IP-Adresse xxx.yyy.21.144 - laut http://www.spamhaus.org/query/bl?ip=xxx.yyy.21.144 - nicht in der Liste der Mailserver ist, die Mails ohne Authentifizierung zustellen dürfen. Und das ist auch klar, denn xxx.yyy.21.144 ist die IP-Adresse, die ich von meinem DSL-Hoster bekommen habe (besser mein Router). Sonst könnte ja jeder rumspammen ... Ein offizieller Mailserver - wie beispielsweise mail.marmorbau.de - würde dieses Problem nicht haben, weil seine IP-Adresse nicht geblockt ist.

Mailserver Apache James - Konzepte

Spool

Will der Client eine Mail versenden, dann schickt er einen SMTP-Request an den SMTP-Port des James. Die Verarbeitung der Mail (u. a. Zustellung) erfolgt dannn asynchron. Hierzu landet die Mail in der sog. Spool (ein Container für noch nicht zugestellte Mails). Ein Thread ist dann dafür zuständig die Mails aus der Spool an die Empfänger zuzustellen - scheitert die Zustellung, so kann man den Server so konfigurieren, daß er es mehrfach versucht.

Fetchmail

Über Fetchmail kann man Nachrichten von anderen Mailservern abrufen und in die lokalen Postfächer zustellen. füpr den Benutzer ist das sehr komfortabel, denn er bracuht dann nur einen Mailserver zu konfigurieren.

Mailets

James bietet mit Mailets eine Möglichkeit, sich in die Mailverarbeitung mit selbstgeschriebenem Code einzuklinken, um so beispielsweise einen Decorator (DirectProject tut dies um verschlüsselung/Entschlüsselung und Signierung/Signaturcheck für den Mailversender transparent anzubieten). Ein Custom-Mailet muss hierzu das Interface org.apache.mailet.Mailet implementieren, ein Custom-Matcher muss das Interface org.apache.mailet.Matcher implementieren.
James verwendet diese Technologie selbst, um typische Mailserver-Funktionalität abzubilden (z. B. Spoolmanager, .

Mailets sind vergleichbar mit Servlet-Filtern - sie bilden i. d. R. eine Kette von Filtern, die nacheinander durchlaufen werden. Bei der Definition der Mailets wird eine Ausführungsbedingung in Form eines Match-Ausdrucks definiert. Die Mailets werden zunächst mal in der Reihenfolge der Konfiguration (in config.xml - James 3) durchlaufen, es kann aber passieren, dass die Reihenfolge durch eine (bedingte) Delegation an einen Processor (per <processor>BLA</processor>) geändert wird.

Konfiguration

Ein Beispiel aus der Direct Project-Konfiguration:

<!-- Import einiger Mailets
         - Standard-Mailets wie org.apache.james.transport.mailets.smime
         - selbstentwickelte Custom-Mailets wie org.nhindirect.gateway.smtp.james.mailet
-->
<mailetpackages>
<mailetpackage>org.apache.james.transport.mailets</mailetpackage>
<mailetpackage>org.apache.james.transport.mailets.smime</mailetpackage>
<mailetpackage>org.nhindirect.gateway.smtp.james.mailet</mailetpackage>
<mailetpackage>org.nhind.james.mailet</mailetpackage>
</mailetpackages>
<matcherpackages>
<matcherpackage>org.apache.james.transport.matchers</matcherpackage>
<matcherpackage>org.apache.james.transport.matchers.smime</matcherpackage>
<matcherpackage>org.nhindirect.gateway.smtp.james.matcher</matcherpackage>
<matcherpackage>org.nhind.james.matcher</matcherpackage>
</matcherpackages>

<spoolmanager> <!-- This block is responsible for processing messages on the spool. -->
<processor name="root">
<!-- The root processor is a required processor - James routes all mail on the spool through this processor first. -->

<!-- This mailet redirects mail for the user 'postmaster' at any local domain to the postmaster address specified for the server. -->
<mailet match="All" class="PostmasterAlias"/>

<!-- Important check to avoid looping -->
<mailet match="RelayLimit=30" class="Null"/>

<mailet match="All" class="ClamAVScan" onMailetException="ignore"/> <!-- Virenscannerintegration -->
<mailet match="HasMailAttributeWithValue=org.apache.james.infected, true" class="ToProcessor">
<processor>virus</processor> <!-- DELEGATION, wenn virus gefunden -->
</mailet>

... spamcheck, etc. ...

<mailet match="SMTPAuthSuccessful" class="ToProcessor">
<processor>transport</processor> <!-- DELEGATION, wenn versand erfolgen soll (alle vorbedingung sind geprüft -->
</mailet>
...
</processor>

<processor name="transport">

<!-- die Mail-Header werden ergänzt -->
<mailet match="SMTPAuthSuccessful" class="SetMimeHeader">
<name>X-UserIsAuth</name>
<value>true</value>
</mailet>
<mailet match="HasMailAttribute=org.apache.james.SMIMECheckSignature" class="SetMimeHeader">
<name>X-WasSigned</name>
<value>true</value>
</mailet>

<!-- so ist der Decorator zur Verschlüsselung eingebunden
      Mails an lokale Empfänger (LocalDelivery) werden nicht verschlüsselt, das NHINDSecurityAndTrustMailet
      implementiert die Verschlüsselungs/Signierungslogik - entsprechende
-->

<mailet match="RecipAndSenderIsNotLocal=myhealthdomain" class="NHINDSecurityAndTrustMailet">
<ConfigURL>http://localhost:8081/config-service/ConfigurationService</ConfigURL>
</mailet>
<mailet match="RecipientIsLocal" class="LocalDelivery"/>
</processor>



Mailserver Apache James - Version 3

Hierbei handelt es sich um einen in Java geschriebenen Mailserver mit Support verschiedener Standardprotokolle im Mailbereich (u. a. POP3, SMTP, IMAP).

Verwendete Technologien:
  • Spring (Konfiguration)
    • siehe james-server-context.xml (importiert dann weitere Spring-Konfigurationen für JCR, JPA, maildir, memory)
  • Camel
  • ActiveMQ
  • JPA
  • Derby (Persistenz)
  • JackRabbit
  • maven 3
Dokumentation:

Ein erster Einstieg ...

http://james.apache.org/server/3/quick-start.html

Start

$JAMES_HOME/bin/james [start | status | stop]

Ob der Server richtig gestartet ist, kann man folgendermassen überprüfen:
  • Logfile
  • $JAMES_HOME/bin/james status
  • netstat -anp | grep 25
  • telnet 127.0.0.1 25 - so muss das dann aussehen
:~/programs/apache-james> telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 ... SMTP Server (JAMES SMTP Server) ready Tue, 30 Aug 2011 18:53:55 +0200 (CEST)

ACHTUNG: die Default-Ports liegen unter 1099, so daß Root-rechte erforderlich sind

Domains und User anlegen

Die Organisationstruktur sieht folgendermassen aus:
  • Domain (z. B. zwergnase)
  • Account (z. B. ich@zwergnase)
  • eMail-Adresse (z. B. ich@zwergnase, ich-alias@zwergnase)
Ein Account muss also immer einer Domain zugeordnet werden - der Accountname enthält den Domainname (ich@zwergnase).

Das Apache-James-Paket bringt ein Command-Line-Interface mit (CLI), über das man folgenermassen eine Domain und User anlegen kann (9999 ist der JMX-Port ... entsprechend anpassen, wenn man ihn geändert hat):

james-cli -h localhost -p 9999 adddomain mydomain.tld
james-cli -h localhost -p 9999 adduser myuser@mydomain.tld mypassword

Der CLI verwendet die JMX-Schnittstelle, die man über die JConsole auch direkt erreicht (http://james.apache.org/server/3/manage.html)

Konfiguration

Doku der verschiedenen Konfigurationsdateien: http://james.apache.org/server/3/config.html

Die Konfiguration erfolgt über Property-Dateien und Spring-Konfigurationen, die sich im Ordner $JAMES_HOME/conf/* befinden. Zur Laufzeit kann man auch noch Konfigurationen per MBeans (z. B. JConsole verwenden) verändern (siehe Administration / Monitoring).

Administration / Monitoring

Zur Administration im laufenden Betrieb bietet James zwei Clients an:
  • CommandLineInterface (setzt auf den MBeans auf)
  • MBeans (gemäß JMX-Spezifikation), z. B. über JConsole
siehe Doku: http://james.apache.org/server/3/manage.html

Persistenz

Zur Speicherung der Mail kommen folgende Varianten in Frage (konfigurierbar)
  • Filesystem
  • Datenbank (integrierte Derby-Datenbank)
  • Hauptspeicher
  • JavaContentRepository
    • hierzu wird JackRabbit gebraucht

Logging

Die Logs sind natürlich immer die erste Anlaufstellen, wenn etwas schiefgeht. Bei James schreibt jede größere Komponente eine eigene Logdatei (pop3server.log, smtpserver.log, mailetcontainer.log, ...).

Für die Erstanalyse scheint james-server.log die beste Anlaufstelle zu sein, denn hier laufen alle Logs zusammen.

Insofern bietet James das beste aus beiden Ansätzen (eine große Logdatei vs. viele spezialisierte Logdateien). Das Logging ist natürlich per conf/log4j.properties konfigurierbar - oben beschrieben ist die Default-Konfiguration.

Customisierung

Ein großer Vorteil, den James bietet, besteht in den sog. Mailets (der Name ist an die im HTTP-Umfeld für Webapplikationen verwendeten Servlets angelehnt). Hierüber kann man ähnlich wie bei ServletFiltern in die Mailprozessierung eingreifen.

Die DirectProject Referenzimplementierung verwendet diese Technologie beispielsweise, um die Mails - für den Nutzer transparent - zu verschlüsseln und zu signieren. Durch folgende Konfiguration

   <mailetpackages>
      <mailetpackage>org.apache.james.transport.mailets</mailetpackage>
      <mailetpackage>org.apache.james.transport.mailets.smime</mailetpackage>
      <mailetpackage>org.nhindirect.gateway.smtp.james.mailet</mailetpackage>
   </mailetpackages>
   <matcherpackages>
      <matcherpackage>org.apache.james.transport.matchers</matcherpackage>
      <matcherpackage>org.apache.james.transport.matchers.smime</matcherpackage>
      <matcherpackage>org.nhindirect.gateway.smtp.james.matcher</matcherpackage>
   </matcherpackages>
...
<processor name="transport">
         <mailet match="RecipAndSenderIsNotLocal=mydomain.com" class="NHINDSecurityAndTrustMailet">
            <ConfigURL>http://localhost:8081/config-service/ConfigurationService</ConfigURL>
         </mailet>

wird das NHINDSecurityAndTrustMailet (ist Bestandteil eines jars im James-lib-Folder) in die Prozessierung von Mails integriert. Mehr Details: http://api.nhindirect.org/java/site/gateway/1.0.1/users-guide/depl-james.html#Apache_James_Deployment

FAQ

Problem 1: Start als Nicht-Root-User
Lösung 1: Die Mail-defaul-Ports liegen unterhalb 1099, so daß nur der Root-User James starten kann ... wer das nicht will sollte sudo verwenden

Problem 2: James fährt sofort wieder runter und ich finde keinen Hinweis in der $JAMES_HOME/log/james-server.log
Lösung 2: ich fand einen Hinweis in der wrapper.log, die leider im $JAMES_HOME/bin-Verzeichnis liegt. Hier fand ich gleich mehrere Ports, die bereits anderweitig vergeben waren (25: Postfix, 9999: meine HSQL-Datenbank, ...)

Problem 3: Ich möchte einen Mailserver mit zwei Domains quatschdomain1 und quatschdomain2 zu Lernzwecken innerhalb eines LANs betreiben, so daß ich eine Mail von user1@quatschdomain1 nach user2@quatschdomain2 schicken kann. Beide Domains laufen auf dem gleichen Rechner (localhost). Ich habe die /etc/hosts Datei angepasst, so daß quatschdomain1 und quatschdomain2 auf localhost umgeleitet werden (so zumindest mein Plan). Leider werden allerdings die Mails nicht versendet (ich verwende Thunderbird als Mailclient) - ich bekomme einen Fehler beim connect an den smtp-Server (localhost). Kann es sein, dass der James-MTA meine /etc/hosts Datei nicht zum Routing der Mail verwendet (bei Postfix kann man das ja beispielsweise per disable_dns_lookups konfigurieren)?
Antwort 3a: Es hat scheinbar nichts mit der Zustellung zu tun - Thunderbird wird die Mail schon gar nicht beim SMTP-Server los, weil die Verbindung fehlschlägt. Das Problem scheint also schon früher aufzutreten. Der Fehler liegt darin, daß ich cmMaildomain als SMTP-Servername eingetragen habe - mit localhost funktioniert es.
Antwort 3b: Durch localhost als Server geht die Mail wenigstens bis zum SMTP-Server, aber der Empfänger bekommt sie nicht :-( Ein Blick in die smtpserver.log verrät:

Successfully spooled mail Mail1317152020780-50eab7d2-c4cc-46e9-afc8-4a7b094ac028 from user1@quatschdomain1 on 0:0:0:0:0:0:0:1 for [user2@quatschdomain2]

Die Mail hängt im Spooler fest ... In der james-server.log finde ich dann aber wenigsten noch ein bissl mehr:

INFO  22:17:10,008 | james.smtpserver | ID=1946375588 Connection established from localhost (0:0:0:0:0:0:0:1)
INFO  22:17:11,700 | james.smtpserver | ID=1946375588 Successfully spooled mail Mail1317154631642-50fd1195-61bd-4bda-a7a1-c961724
a0f76 from user1@quatschdomain1 on 0:0:0:0:0:0:0:1 for [user2@quatschdomain2]
INFO  22:17:12,447 | james.smtpserver | ID=1946375588 Connection closed for localhost (0:0:0:0:0:0:0:1)
INFO  22:17:12,656 | james.dnsservice | Couldn't resolve MX records for domain quatschdomain1.
ERROR 22:17:12,657 | james.dnsservice | Couldn't resolve IP address for host quatschdomain1.
INFO  22:17:12,657 | james.mailetcontext | No mail server found for: quatschdomain1
INFO  22:17:12,658 | james.mailetcontext | Permanent exception delivering mail (Mail1317154631642-50fd1195-61bd-4bda-a7a1-c961724a0f76-to-quatschdomain1:
INFO  22:17:12,804 | james.dnsservice | Couldn't resolve MX records for domain quatschdomain2.
ERROR 22:17:12,805 | james.dnsservice | Couldn't resolve IP address for host quatschdomain2.
INFO  22:17:12,805 | james.mailetcontext | No mail server found for: quatschdomain2
INFO  22:17:12,805 | james.mailetcontext | Permanent exception delivering mail (Mail1317154631642-50fd1195-61bd-4bda-a7a1-c961724a0f76-to-quatschdomain1-!884258-to-quatschdomain2:
INFO  22:17:12,805 | james.mailetcontext | Null Sender: no bounce will be generated for Mail1317154631642-50fd1195-61bd-4bda-a7a1-c961724a0f76-to-quatschdomain1-!884258-to-quatschdomain2

Hier ist der Code, der die Ausgabe erzeugt:

234     public Collection findMXRecords(String hostname) {
235         List servers = new ArrayList();
236         try {
237             servers = findMXRecordsRaw(hostname);
238             return Collections.unmodifiableCollection(servers);
239         } finally {
240             //If we found no results, we'll add the original domain name if
241             //it's a valid DNS entry
242             if (servers.size () == 0) {
243                 StringBuffer logBuffer =
244                     new StringBuffer(128)
245                             .append("Couldn't resolve MX records for domain ")
246                             .append(hostname)
247                             .append(".");
248                 getLogger().info(logBuffer.toString());
249                 Record cnames[] = lookup(hostname, Type.CNAME);
250                 Collection cnameMXrecords = null;
251                 if (cnames!=null && cnames.length > 0) {
252                     cnameMXrecords = findMXRecordsRaw(((CNAMERecord) cnames[0]).getTarget().toString());
253                 } else {
254                     logBuffer = new StringBuffer(128)
255                             .append("Couldn't find CNAME records for domain ")
256                             .append(hostname)
257                             .append(".");
258                     getLogger().info(logBuffer.toString());
259                 }
260                 if (cnameMXrecords==null) {
261                     try {
262                         getByName(hostname);
263                         servers.add(hostname);
264                     } catch (UnknownHostException uhe) {
265                         // The original domain name is not a valid host,
266                         // so we can't add it to the server list.  In this
267                         // case we return an empty list of servers
268                         logBuffer = new StringBuffer(128)
269                                   .append("Couldn't resolve IP address for host ")
270                                   .append(hostname)
271                                   .append(".");
272                         getLogger().error(logBuffer.toString());
273                     }
274                 } else {
275                     servers.addAll(cnameMXrecords);
276                 }
277             }
278         }
279     }

Da ich keine MX-Records im DNS für meine Spiel-Maildomains habe, wird Couldn't resolve MX records for domain ausgegeben.

Mailserver Apache James - Version 2

Strukturierung auf Filesystemebene

Ein bisschen seltsam ist anfangs, daß James ein Server ist, der intern eine Applikation deployed, die auch James heisst (JAMES_HOME/apps/james - erzeugt durch ein sog. SAR-Paket). James hat also seine eigene Deployment-Struktur (in Form des SAR-Files), so daß man sich vorstellen könnte, noch weitere SAR-Applikationen im James-Server zu deployen. Vermutlich kommt das vom Mailet-Konzept.

JAMES_HOME
apps/
james.sar
james/ - entpacktes SAR-File
conf/
logs/
SAR-INF/
var/
mail/
address-error/
error/
inboxes/
pierre.feldbusch/
mailIdBla_Repository.FileObjectStore
mailIdBla_Repository.FileStreamStore
mailIdBlubb_Repository.FileObjectStore
mailIdBlubb_Repository.FileStreamStore
postmaster/
...
outgoing/
relay-denied/
spam/
spool/
nntp/
users/

bin/ - Start/Stop-Skripts
conf/
logs/

Konfiguration

Zentrale Konfigurationsdateien sind:
  • assembly.xml - Grobkonfiguration
    • welche Dienste werden bereitgestellt
  • config.xml - Detailkonfiguration
    • Servername (Maildomain)
    • RemoteManager
    • Inbox-Konfiguration ... wo liegen die Postfächer und in welchem Format werden sie abgelegt
  • environment.xml
    • hier wird das Logging definiert (LogLevel, LogFiles, LogFormat, ...) definiert !!!

Start

Unter Linux kann man den Server per
  • phoenix.sh im Hintergrund initd-konform (start, stop,, ...) starten
  • run.sh im Vordergrund laufen lassen - praktisch für den Fall, daß man auf Fehlersuche ist, denn dann muss man nicht erst in den vielen getrennten Log-Files nachschauen. Ganz praktisch ist auch das Einschalten der TRACE-Augaben durch Konfiguration des Startprozesses (phoenix.sh anpassen) - siehe http://api.nhindirect.org/java/site/gateway/1.0.1/users-guide/depl-james.html#Logging
    • -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
    • -Dorg.apache.commons.logging.simplelog.defaultlog=trace"

RemoteManager ... zur Administration

James bringt den sog. RemoteManager mit, der auf einem konfigurierten Port (konfiguriert in config.xml) lauscht und mit dem man sich z. B. per telnet verbinden kann.

user@host:~/programs/directGatewayHealthDomain/james-2.3.2/apps/james/conf> telnet localhost 4555
Trying ::1...
Connected to localhost.
Escape character is '^]'.
JAMES Remote Administration Tool 2.3.2
Please enter your login and password
Login id:
root
Password:
root
Welcome root. HELP for a list of commands
HELP
Currently implemented commands:
help                                    display this help
listusers                               display existing accounts
countusers                              display the number of existing accounts
adduser [username] [password]           add a new user
verify [username]                       verify if specified user exist
deluser [username]                      delete existing user
setpassword [username] [password]       sets a user's password
setalias [user] [alias]                 locally forwards all email for 'user' to 'alias'
showalias [username]                    shows a user's current email alias
unsetalias [user]                       unsets an alias for 'user'
setforwarding [username] [emailaddress] forwards a user's email to another email address
showforwarding [username]               shows a user's current email forwarding
unsetforwarding [username]              removes a forward
user [repositoryname]                   change to another user repository
shutdown                                kills the current JVM (convenient when James is run as a daemon)
quit                                    close connection

Nach Einloggen mit root/root (Username/Passwort) kann man die aufgeführten Kommandos (bekommt man per HELP) verwenden.

User anlegen - RemoteManager

http://james.apache.org/server/2/adding_users.html

Anmelden an den RemoteManager (siehe oben) und dann

adduser myuser mypassword
an.

Beachte den Hinweis aus der Doku:

"3. After logging in, type "adduser <user> <password>" where <user> is the user name and <password> is the password of the account you wish to create. Please note that the user name should NOT be a complete email address. Rather, all email addresses of the form <user>@<domain> (where <domain> is any of the values specified in the <servernames> block) will be delivered to this account by default. Mailet configuration can change this default behavior."

Mailversand

Die Mailverteilung erfolgt durch unterschiedliche Komponenten, die die Mail jeweils ein Stück näher zum Enpfänger bringen (oder im Fehlerfall in einer Sackgasse enden, z. B. address-error). Die Synchronisierung der Mails erfolgt über folgende Filesystem-Verzeichnisse:

spool/
outgoing/
sollte die Mailzustellung nicht auf Anhieb klappen, so verbleibt die Mail im outgoing-Folder bis sie entweder erfolgreich zugestellt wurde oder in den error- bzw. releay-denied-Folder geschoben wird

error/
address-error/
relay-denied/