Problem mit mail_user_add

Quest

Member
Hallo zusammen,

ich habe ein kleines Problem mit dem Anlegen von Mailboxen über mail_user_add.

Im folgenden erst mal mein Aufruf der Remote API:
Code:
$params = array(
				'server_id' => 3, 
				'email' => 'test@domain.de', 
				'login' => 'test@domain.de', 
				'password' => 'passwort',  
				'name' => 'Test API', 
				'quota' => 209715200, 
				'postfix' => 'y', 
				'move_junk' => 'y', 
				'homedir' => '/var/vmail', 
				'maildir' => '/var/vmail/domain.de/test', 
				'uid' => 5000, 
				'gid' => 5000, 
				'sys_userid' => 1, 
				'autoresponder_text' => null, 
				'custom_mailfilter' => null
			);
            $result =  $client->mail_user_add($session_id, 1, $params);

Mit diesem Aufruf wird die Mailbox ordnungsgemäß angelegt.
Verzeichnisse werden angelegt, Rechte richtig gesetzt.

Beim Versuch mich nun mit dem IMAP Server zu verbinden finde ich im mail.info folgenden Eintrag:
Code:
Jul 13 22:42:32 habanero imapd: LOGIN FAILED, user=test@domain.de, ip=[xxxxxx]
Die weiteren Mail-Logs enthalten nichts interessantes mehr dazu.

Ich habe den mail_user in der ISP-Datenbank mit einem über das Panel angelegten der selben Domain verglichen.
Einziger Unterschied (abgesehen von der Mail-Adresse) ist in sys_userid.
per API: 2
per Panel: 1

Habt ihr eine Idee, was hier falsch laufen könnte?
Muss ich das Passwort vorverschlüsseln anstatt es als Plaintext an die API zu geben?
 

F4RR3LL

Active Member
Ich kenn mich mit der API nicht aus, hatte aber beim Lesen des Beitrags gleich einen Gedanken im Kopf, der möglicherweise völlig unwichtig ist. Aber dennoch...
Werden die imap Ordner nicht erst Angelegt wenn eine Mail an diesen Acc gesendet wird, per Ispconfig wird ja die Willkommensnachricht gesendet. Ist das via API auch so?
So viel zu meinem Gedanken.


gruß Sven

//Edit:

Verzeichnisse werden angelegt, Rechte richtig gesetzt.
Hatte ich überlesen... hm ok dann bitte obiges streichen....
 
Zuletzt bearbeitet:

Quest

Member
Nein, das ist es vermutlich nicht.
Ich habe gerade noch einen Test gemacht.

- Senden einer Mail an das per API erstellte Konto
- Vorsichtshalber 10 Minuten warten
-> weiterhin kein Login möglich

"Vorher/Nachher Vergleich"
- Datenbankeintrag des Kontos auf dem Mailserver per Select herausgesucht
- Passwort per ISPConfig Panel neu gesetzt, auf das selbe, das ich zuvor über die API gesetzt hatte
- Datenbankeintrag mit dem vorherigen Stand verglichen, einzige Abweichung im Feld Passwort, möglicherweise durch einen abweichenden Salt
ABER:
-> Login erfolgreich!
-> Sowohl Willkommensmail als auch vorherige Testmail sind im Postfach
 

Till

Administrator
Woran das Problem liegt kann ich Dir leider nicht sagen. Die sys_userid ist nicht relavent für die Imap Authentifizierung und dass Du das passwort im Klartext angegeben hast ist auch ok, denn es wird von ISPConfig als crypt-md5 mit salt verschlüsselt. Daher ist auch der resultierende Passwort hash jedes mal anders.

Die einzige Idee die ich habe ist folgendes, wenn Du einen Emailuser uberdie mail_user update Funktion aktualisierst dann muss das Passwort Feld leer sein wenn das Passwort nicht geändert werden soll. Wird dort stattdessen das verschlüsselte Passwort angegeben, dann wird es nochmal verschlüsselt. Nur so eine Idee, kenne Deinen Code ja nicht und weiß nicht ob vielleicht irgendswo noch ein Update auf den mailuser ausgeführt wird.
 

Quest

Member
Hallo Till,

Danke für die Informationen.
Das Passwort wird bei mir im Klartext übergeben.
Der Code aus meinem ersten Post ist (fast) der einzige Aufruf an die API.
Zuvor überprüfe ich lediglich über ein mail_user_get ob der User schon existiert.
Mal abgesehen von "@domain.de" ist das ein Orginal-Auszug aus meinem Code.
 

Quest

Member
So, hier ist mein gesamter Code,
um es den Crawlern der Spammer nicht zu einfach zu machen hab ich lediglich Domainnamen und Usernamen/Passwörter ausgetauscht.
Der Rest liegt so im Orginal auf dem Server:

PHP:
<?php
function getISPClient(){
	$soap_location = 'https://mein.panel.server:8080/remote/index.php';
	$soap_uri = 'https://mein.panel.server:8080/remote/';
	
	$client = new SoapClient(null, array('location' => $soap_location, 'uri' => $soap_uri));
	
	return $client;
}

function getMailAddress($user){
	$username = strtolower($user);
	$username = preg_replace('/[^a-z0-9\.\-_ ]/', '', $username);
	$username = preg_replace('/[ ]/', '_', $username);
	$username = preg_replace('/[_]{2,}/', '_', $username);
	return $username.'@meine.domain';
}

/**
 * Check if the given mail account exists in ISP
 * Returns false if not, 
 * true/1 if normal mail account, 
 * 2 if alias
 * -1 if error
 */
function checkAccountExists($arg_email){
	$result = false;
	try{
		$client = getISPClient();
		$username = 'api_user';
		$password = 'api_password';
		if($session_id = $client->login($username,$password)) {
                // Is Mail Alias?
                $alias = $client->mail_alias_get($session_id, array('source' => $arg_email, 'type' => 'alias', 'active' => 'y'));
                if(count($alias))
                    $result = 2;
                $mailbox = $client->mail_user_get($session_id, array('email' => $arg_email));
                if(count($mailbox))
					$result = 1;
                //* Logout
                $client->logout($session_id);
        }
        else
                $result = -1;
	} catch (SoapFault $e) {
	        $result = -1;
	}
	return $result;
}

function createMailAccount($address, $name, $password){
		var_dump(checkAccountExists($address));
	if(checkAccountExists($address)!=0)
		return false;
	$user = explode('@', $address);
	$user = $user[0];
	try{
		$client = getISPClient();
		$username = 'api_user';
		$password = 'api_password';
		if($session_id = $client->login($username,$password)) {
			$params = array(
				'server_id' => 3, 
				'email' => $address, 
				'login' => $address, 
				'password' => $password,  
				'name' => $name, 
				'quota' => 209715200, 
				'postfix' => 'y', 
				'move_junk' => 'y', 
				'homedir' => '/var/vmail', 
				'maildir' => '/var/vmail/meine.domain/'.$user, 
				'uid' => 5000, 
				'gid' => 5000, 
				'sys_userid' => 1, 
				'autoresponder_text' => null, 
				'custom_mailfilter' => null
			);
            return $client->mail_user_add($session_id, 1, $params);
        }
        else
                return false;
	} catch (SoapFault $e) {
	    return false;
	}
}


$address = getMailAddress('test');

if(createMailAccount($address, 'Testaccount', 'Passwort')){
	echo "Account angelegt\n";
}else{
	echo "Fehler\n";
}


echo "end";
?>
 

Till

Administrator
Sieht soweit ok aus, Du hast aber gesehen dass Du das API passwort als Emailpasswort verwendest? Welche ISPConfig Version verwendest Du denn?
 

Quest

Member
Ich bin gerade 1 Version hinterher.
Aber daher kam der Fehler nicht.
Hilft manchmal doch wenn jemand anders den Code anschaut und feststellt, dass ich blöd genug bin eine übergebene Variable gleich wieder zu überschreiben ...

Quest 0 : 1 Intelligenz

Vielen Dank für's Augenöffnen
 

Werbung

Top