Problem mit mail_user_add

Dieses Thema im Forum "Entwicklerforum" wurde erstellt von Quest, 13. Juli 2012.

  1. Quest

    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?
     
  2. F4RR3LL

    F4RR3LL 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:

    Hatte ich überlesen... hm ok dann bitte obiges streichen....
     
    Zuletzt bearbeitet: 13. Juli 2012
  3. Quest

    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
     
  4. Till

    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.
     
  5. Quest

    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.
     
  6. Quest

    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_id1$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";
    ?>
     
  7. Till

    Till Administrator

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

    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
     

Diese Seite empfehlen